uIP 1.0
|
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__ */