]> git.sur5r.net Git - freertos/blob - Demo/Common/ethernet/FreeTCPIP/lib/memb.h_
Ready for V6.0.3 release.
[freertos] / Demo / Common / ethernet / FreeTCPIP / lib / memb.h_
1 /*\r
2  * Copyright (c) 2004, Swedish Institute of Computer Science.\r
3  * All rights reserved.\r
4  *\r
5  * Redistribution and use in source and binary forms, with or without\r
6  * modification, are permitted provided that the following conditions\r
7  * are met:\r
8  * 1. Redistributions of source code must retain the above copyright\r
9  *    notice, this list of conditions and the following disclaimer.\r
10  * 2. Redistributions in binary form must reproduce the above copyright\r
11  *    notice, this list of conditions and the following disclaimer in the\r
12  *    documentation and/or other materials provided with the distribution.\r
13  * 3. Neither the name of the Institute nor the names of its contributors\r
14  *    may be used to endorse or promote products derived from this software\r
15  *    without specific prior written permission.\r
16  *\r
17  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND\r
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE\r
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\r
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\r
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\r
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\r
27  * SUCH DAMAGE.\r
28  *\r
29  * This file is part of the Contiki operating system.\r
30  *\r
31  * Author: Adam Dunkels <adam@sics.se>\r
32  *\r
33  * $Id: memb.h,v 1.6 2009/04/06 21:18:04 adamdunkels Exp $\r
34  */\r
35 \r
36 /**\r
37  * \addtogroup mem\r
38  * @{\r
39  */\r
40 \r
41 /**\r
42  * \defgroup memb Memory block management functions\r
43  *\r
44  * The memory block allocation routines provide a simple yet powerful\r
45  * set of functions for managing a set of memory blocks of fixed\r
46  * size. A set of memory blocks is statically declared with the\r
47  * MEMB() macro. Memory blocks are allocated from the declared\r
48  * memory by the memb_alloc() function, and are deallocated with the\r
49  * memb_free() function.\r
50  *\r
51  * @{\r
52  */\r
53 \r
54 /**\r
55  * \file\r
56  *         Memory block allocation routines.\r
57  * \author\r
58  *         Adam Dunkels <adam@sics.se>\r
59  *\r
60  */\r
61 #ifndef __MEMB_H__\r
62 #define __MEMB_H__\r
63 \r
64 #include "sys/cc.h"\r
65 \r
66 /**\r
67  * Declare a memory block.\r
68  *\r
69  * This macro is used to statically declare a block of memory that can\r
70  * be used by the block allocation functions. The macro statically\r
71  * declares a C array with a size that matches the specified number of\r
72  * blocks and their individual sizes.\r
73  *\r
74  * Example:\r
75  \code\r
76 MEMB(connections, struct connection, 16);\r
77  \endcode\r
78  *\r
79  * \param name The name of the memory block (later used with\r
80  * memb_init(), memb_alloc() and memb_free()).\r
81  *\r
82  * \param structure The name of the struct that the memory block holds\r
83  *\r
84  * \param num The total number of memory chunks in the block.\r
85  *\r
86  */\r
87 #define MEMB( name, structure, num )                                                                                                                                      \\r
88         static char CC_CONCAT( name, _memb_count )[num];                                                                                                          \\r
89         static structure CC_CONCAT( name, _memb_mem )[num];                                                                                                       \\r
90         static struct memb      name =                                                                                                                                                    \\r
91         {                                                                                                                                                                                                         \\r
92                 sizeof( structure ), num, CC_CONCAT( name, _memb_count ), ( void * ) CC_CONCAT( name, _memb_mem ) \\r
93         }\r
94 \r
95 struct memb\r
96 { unsigned short size; unsigned short num; char *count; void *mem; };\r
97 \r
98 /**\r
99  * Initialize a memory block that was declared with MEMB().\r
100  *\r
101  * \param m A memory block previously declared with MEMB().\r
102  */\r
103 void                                    memb_init( struct memb *m );\r
104 \r
105 /**\r
106  * Allocate a memory block from a block of memory declared with MEMB().\r
107  *\r
108  * \param m A memory block previously declared with MEMB().\r
109  */\r
110 void                                    *memb_alloc( struct memb *m );\r
111 \r
112 /**\r
113  * Deallocate a memory block from a memory block previously declared\r
114  * with MEMB().\r
115  *\r
116  * \param m m A memory block previously declared with MEMB().\r
117  *\r
118  * \param ptr A pointer to the memory block that is to be deallocated.\r
119  *\r
120  * \return The new reference count for the memory block (should be 0\r
121  * if successfully deallocated) or -1 if the pointer "ptr" did not\r
122  * point to a legal memory block.\r
123  */\r
124 char                                    memb_free( struct memb *m, void *ptr );\r
125 \r
126 int                                             memb_inmemb( struct memb *m, void *ptr );\r
127 \r
128 /** @} */\r
129 \r
130 /** @} */\r
131 #endif /* __MEMB_H__ */\r