]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/slab/lib/include/__slab.h
update
[l4.git] / l4 / pkg / slab / lib / include / __slab.h
1 /*****************************************************************************/
2 /**
3  * \file   slab/lib/include/__slab.h
4  * \brief  Slab allocator internal types.
5  *
6  * \date   2006-12-18
7  * \author Lars Reuther <reuther@os.inf.tu-dresden.de>
8  * \author Christian Helmuth <ch12@os.inf.tu-dresden.de>
9  */
10 /*****************************************************************************/
11
12 /*
13  * (c) 2006-2009 Author(s)
14  *     economic rights: Technische Universität Dresden (Germany)
15  *
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.
19  */
20
21 #ifndef _SLAB___SLAB_H
22 #define _SLAB___SLAB_H
23
24 #include <l4/sys/l4int.h>
25
26 /* slab includes */
27 #include <l4/slab/slab.h>
28
29 /*****************************************************************************
30  *** typedefs
31  *****************************************************************************/
32
33 /**
34  * Slab descriptor
35  *
36  * Slabs can be linked to one of the three slab cache lists: full, part, and
37  * free.
38  */
39 struct l4slab_slab
40 {
41   int                    num_free;   ///< number of free objects in slab
42
43   void *                 free_objs;  ///< free list
44
45   l4slab_cache_t *       cache;      ///< pointer to slab cache descriptor
46
47   struct l4slab_slab *   prev;       ///< previous slab in current list
48   struct l4slab_slab *   next;       ///< next slab in current list
49
50   void *                 data;       ///< client data
51 };
52
53
54 /**
55  * Calculate pointer to slab struct from pointer in slab
56  *
57  * \param cache  slab cache this slab is linked to
58  * \param p      pointer into slab
59  *
60  * The slab struct resides at the end of the slab and slab must be size aligned
61  * in virtual memory.
62  */
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)
65 {
66         l4_addr_t addr = (l4_addr_t) p;
67
68         /* right after slab */
69         addr = (addr + cache->slab_size) & ~(cache->slab_size - 1);
70
71         /* slab struct resides at end of slab */
72         addr -= sizeof(struct l4slab_slab);
73
74         return (struct l4slab_slab *)addr;
75 }
76
77
78 /**
79  * Calculate pointer to begin of slab buffer from pointer in slab
80  *
81  * \param cache  slab cache this slab is linked to
82  * \param p      pointer into slab
83  *
84  * Slab must be size aligned in virtual memory.
85  */
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)
88 {
89         l4_addr_t addr = (l4_addr_t) p;
90
91         addr = addr & ~(cache->slab_size - 1);
92
93         return (void *)addr;
94 }
95
96 #endif /* !_SLAB___SLAB_H */