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.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 /** @} */