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* 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