1/* 2 * Copyright 2009-2010, Ingo Weinhold, ingo_weinhold@gmx.de. 3 * Distributed under the terms of the MIT License. 4 */ 5 6#include <slab/Slab.h> 7 8#include <stdlib.h> 9 10#include <new> 11 12 13struct ObjectCache { 14 ObjectCache(const char *name, size_t objectSize, 15 size_t alignment, size_t maxByteUsage, uint32 flags, void *cookie, 16 object_cache_constructor constructor, 17 object_cache_destructor destructor, object_cache_reclaimer reclaimer) 18 : 19 objectSize(objectSize), 20 cookie(cookie), 21 objectConstructor(constructor), 22 objectDestructor(destructor) 23 { 24 } 25 26 size_t objectSize; 27 void* cookie; 28 object_cache_constructor objectConstructor; 29 object_cache_destructor objectDestructor; 30}; 31 32 33object_cache * 34create_object_cache(const char *name, size_t objectSize, 35 size_t alignment, void *cookie, object_cache_constructor constructor, 36 object_cache_destructor destructor) 37{ 38 return new(std::nothrow) ObjectCache(name, objectSize, alignment, 39 0, 0, cookie, constructor, destructor, NULL); 40} 41 42 43object_cache * 44create_object_cache_etc(const char *name, size_t objectSize, 45 size_t alignment, size_t maxByteUsage, size_t magazineCapacity, 46 size_t maxMagazineCount, uint32 flags, void *cookie, 47 object_cache_constructor constructor, object_cache_destructor destructor, 48 object_cache_reclaimer reclaimer) 49{ 50 return new(std::nothrow) ObjectCache(name, objectSize, alignment, 51 maxByteUsage, flags, cookie, constructor, destructor, reclaimer); 52} 53 54 55void 56delete_object_cache(object_cache *cache) 57{ 58 delete cache; 59} 60 61 62status_t 63object_cache_set_minimum_reserve(object_cache *cache, size_t objectCount) 64{ 65 return B_OK; 66} 67 68 69void * 70object_cache_alloc(object_cache *cache, uint32 flags) 71{ 72 void* object = cache != NULL ? malloc(cache->objectSize) : NULL; 73 if (object == NULL) 74 return NULL; 75 76 if (cache->objectConstructor != NULL) 77 cache->objectConstructor(cache->cookie, object); 78 79 return object; 80} 81 82 83void 84object_cache_free(object_cache *cache, void *object, uint32 flags) 85{ 86 if (object != NULL) { 87 if (cache != NULL && cache->objectDestructor != NULL) 88 cache->objectDestructor(cache->cookie, object); 89 90 free(object); 91 } 92} 93 94 95status_t 96object_cache_reserve(object_cache *cache, size_t object_count, uint32 flags) 97{ 98 return B_OK; 99} 100 101 102void 103object_cache_get_usage(object_cache *cache, size_t *_allocatedMemory) 104{ 105 *_allocatedMemory = 0; 106} 107