1 /*****************************************************************************/
3 * \file slab/lib/include/__slab.h
4 * \brief Slab allocator internal types.
7 * \author Lars Reuther <reuther@os.inf.tu-dresden.de>
8 * \author Christian Helmuth <ch12@os.inf.tu-dresden.de>
10 /*****************************************************************************/
13 * (c) 2006-2009 Author(s)
14 * economic rights: Technische Universität Dresden (Germany)
16 * This file is part of TUD:OS and distributed under the terms of the
17 * GNU General Public License 2.
18 * Please see the COPYING-GPL-2 file for details.
21 #ifndef _SLAB___SLAB_H
22 #define _SLAB___SLAB_H
24 #include <l4/sys/l4int.h>
27 #include <l4/slab/slab.h>
29 /*****************************************************************************
31 *****************************************************************************/
36 * Slabs can be linked to one of the three slab cache lists: full, part, and
41 int num_free; ///< number of free objects in slab
43 void * free_objs; ///< free list
45 l4slab_cache_t * cache; ///< pointer to slab cache descriptor
47 struct l4slab_slab * prev; ///< previous slab in current list
48 struct l4slab_slab * next; ///< next slab in current list
50 void * data; ///< client data
55 * Calculate pointer to slab struct from pointer in slab
57 * \param cache slab cache this slab is linked to
58 * \param p pointer into slab
60 * The slab struct resides at the end of the slab and slab must be size aligned
63 L4_INLINE struct l4slab_slab * slab_from_pointer(l4slab_cache_t *cache, void *p);
64 L4_INLINE struct l4slab_slab * slab_from_pointer(l4slab_cache_t *cache, void *p)
66 l4_addr_t addr = (l4_addr_t) p;
68 /* right after slab */
69 addr = (addr + cache->slab_size) & ~(cache->slab_size - 1);
71 /* slab struct resides at end of slab */
72 addr -= sizeof(struct l4slab_slab);
74 return (struct l4slab_slab *)addr;
79 * Calculate pointer to begin of slab buffer from pointer in slab
81 * \param cache slab cache this slab is linked to
82 * \param p pointer into slab
84 * Slab must be size aligned in virtual memory.
86 L4_INLINE void * buffer_from_pointer(l4slab_cache_t *cache, void *p);
87 L4_INLINE void * buffer_from_pointer(l4slab_cache_t *cache, void *p)
89 l4_addr_t addr = (l4_addr_t) p;
91 addr = addr & ~(cache->slab_size - 1);
96 #endif /* !_SLAB___SLAB_H */