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