Contiki-NG
Loading...
Searching...
No Matches
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 <stdlib.h>
68#include "sys/cc.h"
69
70/**
71 * Declare a memory block.
72 *
73 * This macro is used to statically declare a block of memory that can
74 * be used by the block allocation functions. The macro statically
75 * declares a C array with a size that matches the specified number of
76 * blocks and their individual sizes.
77 *
78 * Example:
79 \code
80MEMB(connections, struct connection, 16);
81 \endcode
82 *
83 * \param name The name of the memory block (later used with
84 * memb_init(), memb_alloc() and memb_free()).
85 *
86 * \param structure The name of the struct that the memory block holds
87 *
88 * \param num The total number of memory chunks in the block.
89 *
90 */
91#define MEMB(name, structure, num) \
92 static bool CC_CONCAT(name,_memb_used)[num]; \
93 static structure CC_CONCAT(name,_memb_mem)[num]; \
94 static struct memb name = {sizeof(structure), num, \
95 CC_CONCAT(name,_memb_used), \
96 (void *)CC_CONCAT(name,_memb_mem)}
97
98struct memb {
99 unsigned short size;
100 unsigned short num;
101 bool *used;
102 void *mem;
103};
104
105/**
106 * Initialize a memory block that was declared with MEMB().
107 *
108 * \param m A set of memory blocks previously declared with MEMB().
109 */
110void memb_init(struct memb *m);
111
112/**
113 * Allocate a memory block from a block of memory declared with MEMB().
114 *
115 * \param m A set of memory blocks previously declared with MEMB().
116 */
117void *memb_alloc(struct memb *m);
118
119/**
120 * Deallocate a memory block from a memory block previously declared
121 * with MEMB().
122 *
123 * \param m m A set of memory blocks previously declared with MEMB().
124 *
125 * \param ptr A pointer to the memory block that is to be deallocated.
126 *
127 * \return error code, should be 0 if successfully deallocated or -1 if the
128 * pointer "ptr" did not point to a legal memory block.
129 */
130int memb_free(struct memb *m, void *ptr);
131
132/**
133 * Check if a given address is within a memory area previously
134 * declared with MEMB().
135 *
136 * \param m m A set of memory blocks previously declared with MEMB().
137 *
138 * \param ptr A pointer to the address to check
139 *
140 * \return 1 if the address is part of the memory block; otherwise 0
141 */
142int memb_inmemb(struct memb *m, void *ptr);
143
144/**
145 * Count free memory blocks
146 *
147 * \param m m A set of memory blocks previously declared with MEMB().
148 *
149 * \return the number of free (available) memory blocks
150 */
151size_t memb_numfree(struct memb *m);
152
153/** @} */
154/** @} */
155
156#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
size_t memb_numfree(struct memb *m)
Count free memory blocks.
Definition memb.c:108
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