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