Remove memory allocation in olsr_timer_add()
[oonf.git] / src / core / olsr_memcookie.h
1
2 /*
3  * The olsr.org Optimized Link-State Routing daemon(olsrd)
4  * Copyright (c) 2004-2011, the olsr.org team - see HISTORY file
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * * Redistributions of source code must retain the above copyright
12  *   notice, this list of conditions and the following disclaimer.
13  * * Redistributions in binary form must reproduce the above copyright
14  *   notice, this list of conditions and the following disclaimer in
15  *   the documentation and/or other materials provided with the
16  *   distribution.
17  * * Neither the name of olsr.org, olsrd nor the names of its
18  *   contributors may be used to endorse or promote products derived
19  *   from this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32  * POSSIBILITY OF SUCH DAMAGE.
33  *
34  * Visit http://www.olsr.org for more information.
35  *
36  * If you find this software useful feel free to make a donation
37  * to the project. For more information see the website or contact
38  * the copyright holders.
39  *
40  */
41
42 #ifndef _OLSR_MEMCOOKIE_H
43 #define _OLSR_MEMCOOKIE_H
44
45 #include "common/common_types.h"
46 #include "common/list.h"
47 #include "common/avl.h"
48
49 /*
50  * This is a cookie. A cookie is a tool aimed for olsrd developers.
51  * It is used for tracking resource usage in the system and also
52  * for locating memory corruption.
53  */
54 struct olsr_memcookie_info {
55   struct avl_node ci_node;
56   /* Name */
57   const char *ci_name;
58
59   /* Size of memory blocks */
60   size_t ci_size;
61
62   /* size including prefix and custom data */
63   size_t ci_total_size;
64
65   /* offset from the inline custom data block */
66   size_t ci_custom_offset;
67
68   /*
69    * minimum number of chunks the allocator will keep
70    * in the free list before starting to deallocate one
71    */
72   uint32_t ci_min_free_count;
73
74   /* Stats, resource usage */
75   uint32_t ci_usage;
76
77   /* Stats, resource churn */
78   uint32_t ci_changes;
79
80   /* list of custom additions of this memory cookie */
81   struct list_entity ci_custom_list;
82
83   /* List head for used memory blocks */
84   struct list_entity ci_used_list;
85
86   /* List head for recyclable blocks */
87   struct list_entity ci_free_list;
88
89   /* Length of free list */
90   uint32_t ci_free_list_usage;
91 };
92
93 /* Custom addition to existing cookie */
94 struct olsr_memcookie_custom {
95   struct list_entity node;
96
97   /* name of the custom extension */
98   const char *name;
99
100   /* padded (aligned) number of bytes allocated for the custom extension */
101   size_t size;
102
103   /* offset in the memory array for the custom extensions */
104   size_t offset;
105
106   /**
107    * Called every times a new instance of memory is allocated
108    * @param ci pointer to memcookie_info
109    * @param ptr pointer to allocated memory
110    * @param c_ptr pointer to custom memory section
111    */
112   void (*init)(struct olsr_memcookie_info *ci, void *ptr, void *c_ptr);
113
114   /**
115    * Called every times the custom memory section is moved
116    *
117    * Content of the custom memory section will already have been copied.
118    *
119    * @param ci pointer to memcookie info
120    * @param ptr pointer to allocated memory
121    * @param c_ptr pointer to new position of the custom memory section
122    */
123   void (*move)(struct olsr_memcookie_info *ci, void *ptr, void *c_ptr);
124 };
125
126 /* should have a length of 2*memory_alignment (4 pointers) */
127 struct olsr_memory_prefix {
128   struct list_entity node;
129   uint8_t *custom;
130   uint8_t is_inline;
131   uint8_t padding[sizeof(size_t) - sizeof(uint8_t)];
132 };
133
134 #define OLSR_FOR_ALL_COOKIES(ci, iterator) avl_for_each_element_safe(&olsr_cookie_tree, ci, ci_node, iterator)
135 #define OLSR_FOR_ALL_USED_MEM(ci, mem, iterator) list_for_each_element_safe(&ci->ci_used_list, mem, node, iterator)
136 #define OLSR_FOR_ALL_FREE_MEM(ci, mem, iterator) list_for_each_element_safe(&ci->ci_free_list, mem, node, iterator)
137 #define OLSR_FOR_ALL_CUSTOM_MEM(ci, custom, iterator) list_for_each_element_safe(&ci->ci_custom_list, custom, node, iterator)
138
139 #define COOKIE_FREE_LIST_THRESHOLD 10   /* Blocks / Percent  */
140
141 extern struct avl_tree EXPORT(olsr_cookie_tree);
142
143 /* Externals. */
144 EXPORT void olsr_memcookie_init(void);
145 EXPORT void olsr_memcookie_cleanup(void);
146
147 EXPORT struct olsr_memcookie_info *olsr_memcookie_add(const char *, size_t size)
148     __attribute__((warn_unused_result));
149 EXPORT void olsr_memcookie_remove(struct olsr_memcookie_info *);
150
151 EXPORT void *olsr_memcookie_malloc(struct olsr_memcookie_info *)
152     __attribute__((warn_unused_result));
153 EXPORT void olsr_memcookie_free(struct olsr_memcookie_info *, void *);
154
155 EXPORT struct olsr_memcookie_custom *olsr_memcookie_add_custom(
156     const char *memcookie_name, const char *name, size_t size,
157     void (*init)(struct olsr_memcookie_info *, void *, void *),
158     void (*move)(struct olsr_memcookie_info *, void *, void *))
159     __attribute__((warn_unused_result));;
160
161 EXPORT void olsr_memcookie_remove_custom(
162     const char *memcookie_name, struct olsr_memcookie_custom *custom);
163
164 /**
165  * Get pointer to custom memory part of a cookie instance
166  * @param custom pointer to custom memcookie info
167  * @param ptr pointer to memory block
168  * @return pointer to custom memory block
169  */
170 static inline void *
171 olsr_memcookie_get_custom(struct olsr_memcookie_custom *custom, void *ptr) {
172   struct olsr_memory_prefix *mem;
173
174   /* get to the prefix memory structure */
175   mem = ptr;
176   mem--;
177
178   return mem->custom + custom->offset;
179 }
180
181 /**
182  * Set the minimum number of free allocated blocks for a memcookie that
183  * will be kept back by the cookie_manager
184  * @param ci
185  * @param min_free
186  */
187 static inline void
188 olsr_memcookie_set_minfree(struct olsr_memcookie_info *ci, uint32_t min_free)
189 {
190   ci->ci_min_free_count = min_free;
191 }
192
193 #endif /* _OLSR_MEMCOOKIE_H */