00001
00002
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef _L4SLAB_SLAB_H
00025 #define _L4SLAB_SLAB_H
00026
00027
00028 #include <l4/sys/linkage.h>
00029 #include <l4/sys/l4int.h>
00030 #include <l4/env/cdefs.h>
00031
00032
00033
00034
00035
00039 typedef struct l4slab_slab l4slab_slab_t;
00040
00045 typedef struct l4slab_cache l4slab_cache_t;
00046
00062 typedef L4_CV void * (* l4slab_grow_fn_t) (l4slab_cache_t * cache,
00063 void ** data);
00064
00077 typedef L4_CV void (* l4slab_release_fn_t) (l4slab_cache_t * cache,
00078 void * buffer, void * data);
00079
00083 struct l4slab_cache
00084 {
00085 l4_size_t obj_size;
00086 l4_size_t slab_size;
00087 int num_objs;
00088 int num_slabs;
00089 int num_free;
00090 unsigned int max_free;
00091
00092 l4slab_slab_t * slabs_full;
00093 l4slab_slab_t * slabs_part;
00094 l4slab_slab_t * slabs_free;
00095
00096 l4slab_grow_fn_t grow_fn;
00097 l4slab_release_fn_t release_fn;
00098
00099 void * data;
00100 };
00101
00102 #define L4SLAB_LOG_CACHE(cp) do { \
00103 LOG("\033[34;1mcache at %p\033[0m", cp); \
00104 LOG("\033[34;1m obj_size %u\033[0m", cp->obj_size); \
00105 LOG("\033[34;1m slab_size %u\033[0m", cp->slab_size); \
00106 LOG("\033[34;1m objs per slab %d\033[0m", cp->num_objs); \
00107 LOG("\033[34;1m num_free %d\033[0m", cp->num_free); \
00108 LOG("\033[34;1m data ptr %p\033[0m", cp->data); \
00109 } while (0)
00110
00111
00112
00113
00114
00115
00116 __BEGIN_DECLS;
00117
00118
00145
00146 L4_CV int
00147 l4slab_cache_init(l4slab_cache_t * cache, l4_size_t size,
00148 unsigned int max_free, l4slab_grow_fn_t grow_fn,
00149 l4slab_release_fn_t release_fn);
00150
00151
00162
00163 L4_CV void
00164 l4slab_destroy(l4slab_cache_t * cache);
00165
00166
00175
00176 L4_CV void *
00177 l4slab_alloc(l4slab_cache_t * cache);
00178
00179
00187
00188 L4_CV void
00189 l4slab_free(l4slab_cache_t * cache, void * objp);
00190
00191
00203
00204 L4_CV void
00205 l4slab_add_slab(l4slab_cache_t * cache, void * buffer, void * data);
00206
00207
00215
00216 L4_CV void
00217 l4slab_set_data(l4slab_cache_t * cache, void * data);
00218
00219
00229
00230 L4_CV void *
00231 l4slab_get_data(l4slab_cache_t * cache);
00232
00233
00241
00242 L4_CV void
00243 l4slab_dump_cache(l4slab_cache_t * cache, int dump_free);
00244
00245
00252
00253 L4_CV void
00254 l4slab_dump_cache_free(l4slab_cache_t * cache);
00255
00256 __END_DECLS;
00257
00258 #endif