xref: /haiku/headers/private/kernel/slab/Slab.h (revision 31cee26cfe52366495c243a87d30925438ca60d1)
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