uIP 1.0
C:/asm/STM32-ethernet/ENC28J60prj/uip-master/lib/memb.c
См. документацию.
00001 /*
00002  * Copyright (c) 2004, Swedish Institute of Computer Science.
00003  * Все права зарезервированы. *
00004  * Повторное распространение, использование в исходном и двоичном виде,
00005  * с модификацией или без - разрешается, если выполняются следующие
00006  * условия:
00007  * 1. Распространение исходного кода должно сохранить вышеуказанную пометку
00008  *    копирайта, этот список условий и следующую правовую оговорку.
00009  * 2. Распространение исходного кода должно сохранить вышеуказанную пометку
00010  *    копирайта, этот список условий и следующую правовую оговорку в
00011  *    документации и/или других материалах, которые будут предоставлены
00012  *    вместе с распространяемыми материалами.
00013  * 3. Имя автора не может использоваться, чтобы подтвердить или продвинуть
00014  *    продукты, написанные с использованием этого программного обеспечения
00015  *    без специального на то разрешения.
00016  *
00017  * ЭТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ АВТОРОМ ``КАК ЕСТЬ'', БЕЗ
00018  * КАКОЙ-ЛИБО ЛЮБОЙ РАСШИРЕННОЙ ИЛИ ПОДРАЗУМЕВАЕМОЙ ГАРАНТИИ, ВКЛЮЧАЯ,
00019  * НО НЕ ОГРАНИЧИВАЯСЬ ЭТИМ, ГАРАНТИИ ВЫСОКОГО СПРОСА И ПРИГОДНОСТИ
00020  * ДЛЯ КОНКРЕТНОЙ ЦЕЛИ. АВТОР НИ ПРИ КАКИХ УСЛОВИЯХ НЕ ОТВЕТСТВЕНЕН
00021  * ЗА ЛЮБЫЕ УБЫТКИ - ПРЯМЫЕ, КОСВЕННЫЕ, СЛУЧАЙНЫЕ, СПЕЦИАЛЬНЫЕ, ОБРАЗЦОВЫЕ
00022  * ИЛИ ПОСЛЕДОВАТЕЛЬНЫЕ (ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ЭТИМ, ТРЕБОВАНИЯ
00023  * ЗАМЕНЫ ТОВАРА ИЛИ СЕРВИСА; ПОТЕРИ ИСПОЛЬЗОВАНИЯ, ДАННЫХ ИЛИ ВЫГОДЫ;
00024  * ИЛИ ПРЕКРАЩЕНИЕ БИЗНЕСА), ОДНАКО ВЫЗВАННЫЕ ПО ЛЮБОЙ ТЕОРИИ ОТВЕТСТВЕННОСТИ,
00025  * ЛИБО В КОНТРАКТЕ, ПРЯМОЙ ОТВЕТСТВЕННОСТИ, ЛИБО В НАРУШЕНИИ ЗАКОННЫХ ПРАВ
00026  * (ВКЛЮЧАЯ ТАК ИЛИ ИНАЧЕ НЕБРЕЖНОСТЬ), ВОЗНИКАЮЩИЕ ВСЕГДА ИЗ ИСПОЛЬЗОВАНИЯ
00027  * ЭТОГО ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ, ДАЖЕ ЕСЛИ БЫЛО ПРЕДУПРЕЖДЕНИЕ О ВОЗМОЖНОСТИ
00028  * ТАКОГО ПОВРЕЖДЕНИЯ.
00029  *
00030  * Этот файл является частью стека uIP TCP/IP.
00031  *
00032  * Author: Adam Dunkels <adam@sics.se>
00033  *
00034  * $Id: memb.c,v 1.1 2006/06/12 08:21:43 adam Exp $
00035  */
00036 
00037 /**
00038  * \addtogroup memb
00039  * @{
00040  */
00041 
00042  /**
00043  * \file
00044  * Подпрограммы выделения блока памяти.
00045  * \author Adam Dunkels <adam@sics.se>
00046  */
00047 #include <string.h>
00048 
00049 #include "memb.h"
00050 
00051 /*---------------------------------------------------------------------------*/
00052 void
00053 memb_init(struct memb_blocks *m)
00054 {
00055   memset(m->count, 0, m->num);
00056   memset(m->mem, 0, m->size * m->num);
00057 }
00058 /*---------------------------------------------------------------------------*/
00059 void *
00060 memb_alloc(struct memb_blocks *m)
00061 {
00062   int i;
00063 
00064   for(i = 0; i < m->num; ++i) {
00065     if(m->count[i] == 0) {
00066       /* Если этот блок не используется, увеличим счетчик ссылки, чтобы
00067          показать, что он теперь используетя и возвратим указатель на 
00068          блок памяти. */
00069       ++(m->count[i]);
00070       return (void *)((char *)m->mem + (i * m->size));
00071     }
00072   }
00073 
00074   /* Нет свободных блоков памяти, так что вернем NULL, чтобы показать
00075      неудачу в выделении блока. */
00076   return NULL;
00077 }
00078 /*---------------------------------------------------------------------------*/
00079 char
00080 memb_free(struct memb_blocks *m, void *ptr)
00081 {
00082   int i;
00083   char *ptr2;
00084 
00085   /* Просмотр списка блоков и попытка найти блок, на который указывает
00086      указатель "ptr". */
00087   ptr2 = (char *)m->mem;
00088   for(i = 0; i < m->num; ++i) {
00089     
00090     if(ptr2 == (char *)ptr) {
00091       /* Мы нашли блок, на который указывает "ptr", так что уменьшим
00092          счетчик ссылки и вернем новое значение для него. */
00093       if(m->count[i] > 0) {
00094          /* Убедимся, что мы не освобождаем свободную память. */
00095          --(m->count[i]);
00096       }
00097       return m->count[i];
00098     }
00099     ptr2 += m->size;
00100   }
00101   return -1;
00102 }
00103 /*---------------------------------------------------------------------------*/
00104 
00105 /** @} */