Introduction   API Reference   Examples   Index  

slab.h

Go to the documentation of this file.
00001 /* $Id: slab.h 31603 2008-05-12 06:54:17Z adam $ */
00002 /*****************************************************************************/
00011 /*****************************************************************************/
00012 
00013 /* (c) 2006 Technische Universitaet Dresden
00014  * This file is part of DROPS, which is distributed under the terms of the
00015  * GNU General Public License 2. Please see the COPYING file for details.
00016  */
00017 
00018 /* This version supports multi-page slabs (slab size stored in cache.slab_size)
00019  * and tries to follow Bonwicks original suggestion to limit internal
00020  * fragmentation to 1/8 (12.5 %).
00021  *                                    -- Krishna
00022  */
00023 
00024 #ifndef _L4SLAB_SLAB_H
00025 #define _L4SLAB_SLAB_H
00026 
00027 /* L4env includes */
00028 #include <l4/sys/linkage.h>
00029 #include <l4/sys/l4int.h>
00030 #include <l4/env/cdefs.h>
00031 
00032 /*****************************************************************************
00033  *** typedefs
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  *** prototypes
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 /* !_L4SLAB_SLAB_H */

Slab Memory Allocator Reference Manual, written by Lars Reuther  © 2000-2003