uIP 1.0
C:/asm/STM32-ethernet/ENC28J60prj/uip-master/lib/memb.h
См. документацию.
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.h,v 1.1 2006/06/12 08:21:43 adam Exp $
00035  */
00036 
00037 /**
00038  * \defgroup memb Функции управления блоками памяти
00039  *
00040  * Подпрограммы выделения блока памяти предоставляют простой, но мощный
00041  * набор фукнций для управления блоками памяти фиксированного размера.
00042  * Набор блоков памяти статически декларируется маросом MEMB(). Блоки
00043  * памяти выделяются из декларированной памяти функцией memb_alloc(),
00044  * и освобождаются функцией memb_free().
00045  *
00046  * \note Из-за конфликта имен только один MEMB() может быть декларирован
00047  * на один модуль C, и область действия имен блоков памяти MEMB() локальна
00048  * для каждого модуля C.
00049  *
00050  * Следующий пример показывает, как декларировать и использовать блок
00051  * памяти, названный "cmem", который имеет 8 кусков памяти, каждый кусок
00052  * по 20 байт.
00053  *
00054  \code
00055 MEMB(cmem, 20, 8);
00056  \endcode
00057  * @{
00058  */
00059 
00060 
00061 /**
00062  * \file
00063  *         Подпрограммы выделения блока памяти.
00064  * \author
00065  *         Adam Dunkels <adam@sics.se>
00066  *
00067  */
00068 
00069 #ifndef __MEMB_H__
00070 #define __MEMB_H__
00071 
00072 /*
00073  * Здесь мы определим макрос препроцессора C для связывания строк. 
00074  * Нам нужно 2 макроса, чтобы можно было связывать два макроса
00075  * #заданных (#defined) макроса.
00076  */
00077 #define MEMB_CONCAT2(s1, s2) s1##s2
00078 #define MEMB_CONCAT(s1, s2) MEMB_CONCAT2(s1, s2)
00079 
00080 /**
00081  * Декларирование блока памяти.
00082  *
00083  * Этот макрос используется для статического декларирования блока
00084  * памяти, который может использоваться в фукнциях выделения блока.
00085  * Макрос статически декларирует массив C, размер которого
00086  * соответствует указанному кличеству блоков и их индивидуальным
00087  * размерам.
00088  *
00089  * Пример:
00090  \code
00091 MEMB(connections, sizeof(struct connection), 16);
00092  \endcode
00093  *
00094  * \param name Имя блока памяти (которое позднее используется с
00095  * memb_init(), memb_alloc() и memb_free()).
00096  *
00097  * \param size Размер каждого куска памяти, в байтах.
00098  *
00099  * \param num Общее количество кусков памяти в блоке.
00100  *
00101  */
00102 #define MEMB(name, structure, num) \
00103         static char MEMB_CONCAT(name,_memb_count)[num]; \
00104         static structure MEMB_CONCAT(name,_memb_mem)[num]; \
00105         static struct memb_blocks name = {sizeof(structure), num, \
00106                                           MEMB_CONCAT(name,_memb_count), \
00107                                           (void *)MEMB_CONCAT(name,_memb_mem)}
00108 
00109 struct memb_blocks {
00110   unsigned short size;
00111   unsigned short num;
00112   char *count;
00113   void *mem;
00114 };
00115 
00116 /**
00117  * Инициализирует блок памяти, который был декларирован через MEMB().
00118  *
00119  * \param m Блок памяти, ранее декларированный через MEMB().
00120  */
00121 void  memb_init(struct memb_blocks *m);
00122 
00123 /**
00124  * Выделение блока памяти из блока, который был декларирован через MEMB().
00125  *
00126  * \param m Блок памяти, ранее декларированный через MEMB().
00127  */
00128 void *memb_alloc(struct memb_blocks *m);
00129 
00130 /**
00131  * Освобождение блока памяти из блока, который был ранее декларирован
00132  * через MEMB().
00133  *
00134  * \param m m Блок памяти, ранее декларированный через MEMB().
00135  *
00136  * \param ptr Указатель на блок памяти, который освобождается.
00137  *
00138  * \return Новый счетчик ссылки для блока памяти (должен быть 0,
00139  * если блок успешно освобожден, или -1, если указатель "ptr"
00140  * не указывает на правильный блок памяти).
00141  */
00142 char  memb_free(struct memb_blocks *m, void *ptr);
00143 
00144 /** @} */
00145 
00146 #endif /* __MEMB_H__ */