some object cache / slab improvements.
- call the reclaimer callback when low on memory. - use the depot when on multi-cpu setups (for scalability). - fixed the amount of memory spent on slabs for very large objects. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20889 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -30,7 +30,7 @@ typedef struct object_cache object_cache;
|
||||
|
||||
typedef status_t (*object_cache_constructor)(void *cookie, void *object);
|
||||
typedef void (*object_cache_destructor)(void *cookie, void *object);
|
||||
typedef void (*object_cache_reclaimer)(void *cookie, void *object);
|
||||
typedef void (*object_cache_reclaimer)(void *cookie, int32 level);
|
||||
|
||||
object_cache *create_object_cache(const char *name, size_t object_size,
|
||||
size_t alignment, void *cookie, object_cache_constructor constructor,
|
||||
|
||||
@@ -9,45 +9,31 @@
|
||||
#ifndef _SLAB_DEPOT_H_
|
||||
#define _SLAB_DEPOT_H_
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include <lock.h>
|
||||
#include <smp.h>
|
||||
#include <KernelExport.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef struct base_depot {
|
||||
typedef struct object_depot {
|
||||
benaphore lock;
|
||||
struct depot_magazine *full, *empty;
|
||||
size_t full_count, empty_count;
|
||||
struct depot_cpu_store *stores;
|
||||
|
||||
void (*return_object)(struct base_depot *depot, void *object);
|
||||
} base_depot;
|
||||
void (*return_object)(struct object_depot *depot, void *object);
|
||||
} object_depot;
|
||||
|
||||
|
||||
typedef struct depot_cpu_store {
|
||||
benaphore lock;
|
||||
struct depot_magazine *loaded, *previous;
|
||||
} depot_cpu_store;
|
||||
status_t object_depot_init(object_depot *depot,
|
||||
void (*return_object)(object_depot *, void *));
|
||||
void object_depot_destroy(object_depot *depot);
|
||||
|
||||
void *object_depot_obtain(object_depot *depot);
|
||||
int object_depot_store(object_depot *depot, void *object);
|
||||
|
||||
static inline depot_cpu_store *
|
||||
base_depot_cpu(base_depot *depot)
|
||||
{
|
||||
return &depot->stores[smp_get_current_cpu()];
|
||||
}
|
||||
|
||||
|
||||
status_t base_depot_init(base_depot *depot,
|
||||
void (*return_object)(base_depot *, void *));
|
||||
void base_depot_destroy(base_depot *depot);
|
||||
void *base_depot_obtain_from_store(base_depot *depot, depot_cpu_store *store);
|
||||
int base_depot_return_to_store(base_depot *depot, depot_cpu_store *store,
|
||||
void *object);
|
||||
void base_depot_make_empty(base_depot *depot);
|
||||
void object_depot_make_empty(object_depot *depot);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user