181423c91SHugo Santos /*
2ff59ce68SAxel Dörfler * Copyright 2008-2010, Axel Dörfler. All Rights Reserved.
381423c91SHugo Santos * Copyright 2007, Hugo Santos. All Rights Reserved.
481423c91SHugo Santos *
5c6ee79ceSAxel Dörfler * Distributed under the terms of the MIT License.
681423c91SHugo Santos */
781423c91SHugo Santos #ifndef _SLAB_SLAB_H_
881423c91SHugo Santos #define _SLAB_SLAB_H_
981423c91SHugo Santos
10b623d277SAxel Dörfler
11deee8524SIngo Weinhold #include <heap.h>
12b623d277SAxel Dörfler
13b623d277SAxel Dörfler
14b623d277SAxel Dörfler enum {
158d1316fdSIngo Weinhold /* object_cache_{alloc,free}() flags */
16deee8524SIngo Weinhold CACHE_DONT_WAIT_FOR_MEMORY = HEAP_DONT_WAIT_FOR_MEMORY,
17deee8524SIngo Weinhold CACHE_DONT_LOCK_KERNEL_SPACE = HEAP_DONT_LOCK_KERNEL_SPACE,
18deee8524SIngo Weinhold CACHE_PRIORITY_VIP = HEAP_PRIORITY_VIP,
19deee8524SIngo Weinhold CACHE_ALLOC_FLAGS = CACHE_DONT_WAIT_FOR_MEMORY
20deee8524SIngo Weinhold | CACHE_DONT_LOCK_KERNEL_SPACE
21deee8524SIngo Weinhold | CACHE_PRIORITY_VIP,
22deee8524SIngo Weinhold
23deee8524SIngo Weinhold /* create_object_cache_etc flags */
24deee8524SIngo Weinhold CACHE_NO_DEPOT = 0x08000000,
25deee8524SIngo Weinhold CACHE_UNLOCKED_PAGES = 0x10000000, // unsupported
26deee8524SIngo Weinhold CACHE_LARGE_SLAB = 0x20000000,
27b623d277SAxel Dörfler
28b623d277SAxel Dörfler /* internal */
29deee8524SIngo Weinhold CACHE_ALIGN_ON_SIZE = 0x40000000,
30deee8524SIngo Weinhold CACHE_DURING_BOOT = 0x80000000
31b623d277SAxel Dörfler };
32b623d277SAxel Dörfler
33825566f8SIngo Weinhold struct ObjectCache;
34825566f8SIngo Weinhold typedef struct ObjectCache object_cache;
35b623d277SAxel Dörfler
36b623d277SAxel Dörfler typedef status_t (*object_cache_constructor)(void* cookie, void* object);
37b623d277SAxel Dörfler typedef void (*object_cache_destructor)(void* cookie, void* object);
38b623d277SAxel Dörfler typedef void (*object_cache_reclaimer)(void* cookie, int32 level);
39b623d277SAxel Dörfler
40b623d277SAxel Dörfler
41b623d277SAxel Dörfler #ifdef __cplusplus
42b623d277SAxel Dörfler extern "C" {
4381423c91SHugo Santos #endif
44b623d277SAxel Dörfler
45ff59ce68SAxel Dörfler object_cache* create_object_cache(const char* name, size_t objectSize,
46b623d277SAxel Dörfler size_t alignment, void* cookie, object_cache_constructor constructor,
47ff59ce68SAxel Dörfler object_cache_destructor destructor);
48ff59ce68SAxel Dörfler object_cache* create_object_cache_etc(const char* name, size_t objectSize,
49ff59ce68SAxel Dörfler size_t alignment, size_t maxByteUsage, size_t magazineCapacity,
50ff59ce68SAxel Dörfler size_t maxMagazineCount, uint32 flags, void* cookie,
51b623d277SAxel Dörfler object_cache_constructor constructor, object_cache_destructor destructor,
52b623d277SAxel Dörfler object_cache_reclaimer reclaimer);
53b623d277SAxel Dörfler
54b623d277SAxel Dörfler void delete_object_cache(object_cache* cache);
55b623d277SAxel Dörfler
561cda5944SIngo Weinhold status_t object_cache_set_minimum_reserve(object_cache* cache,
571cda5944SIngo Weinhold size_t objectCount);
581cda5944SIngo Weinhold
59b623d277SAxel Dörfler void* object_cache_alloc(object_cache* cache, uint32 flags);
6086c794e5SIngo Weinhold void object_cache_free(object_cache* cache, void* object, uint32 flags);
61b623d277SAxel Dörfler
62b623d277SAxel Dörfler status_t object_cache_reserve(object_cache* cache, size_t object_count,
63b623d277SAxel Dörfler uint32 flags);
64b623d277SAxel Dörfler
655db87665SIngo Weinhold void object_cache_get_usage(object_cache* cache, size_t* _allocatedMemory);
665db87665SIngo Weinhold
67b623d277SAxel Dörfler #ifdef __cplusplus
68b623d277SAxel Dörfler }
69b623d277SAxel Dörfler #endif
70b623d277SAxel Dörfler
71*ef9d9a17SIngo Weinhold
72*ef9d9a17SIngo Weinhold #ifdef __cplusplus
73*ef9d9a17SIngo Weinhold
74*ef9d9a17SIngo Weinhold #include <new>
75*ef9d9a17SIngo Weinhold
76*ef9d9a17SIngo Weinhold
77*ef9d9a17SIngo Weinhold inline void*
new(size_t size,ObjectCache * objectCache,uint32 flags)78*ef9d9a17SIngo Weinhold operator new(size_t size, ObjectCache* objectCache, uint32 flags) throw()
79*ef9d9a17SIngo Weinhold {
80*ef9d9a17SIngo Weinhold return object_cache_alloc(objectCache, flags);
81*ef9d9a17SIngo Weinhold }
82*ef9d9a17SIngo Weinhold
83*ef9d9a17SIngo Weinhold
84*ef9d9a17SIngo Weinhold template<typename Type>
85*ef9d9a17SIngo Weinhold inline void
86*ef9d9a17SIngo Weinhold object_cache_delete(ObjectCache* objectCache, Type* object, uint32 flags = 0)
87*ef9d9a17SIngo Weinhold {
88*ef9d9a17SIngo Weinhold if (object != NULL) {
89*ef9d9a17SIngo Weinhold object->~Type();
90*ef9d9a17SIngo Weinhold object_cache_free(objectCache, object, flags);
91*ef9d9a17SIngo Weinhold }
92*ef9d9a17SIngo Weinhold }
93*ef9d9a17SIngo Weinhold
94*ef9d9a17SIngo Weinhold #endif // __cplusplus
95*ef9d9a17SIngo Weinhold
96*ef9d9a17SIngo Weinhold
97b623d277SAxel Dörfler #endif /* _SLAB_SLAB_H_ */
98