#ifndef _SYS_OBJCACHE_H_
#define _SYS_OBJCACHE_H_
#ifndef _SYS_TYPES_H_
#include <sys/types.h>
#endif
#if defined(_KERNEL) || defined(_KERNEL_STRUCTURES)
#ifndef _SYS__MALLOC_H_
#include <sys/_malloc.h>
#endif
#ifndef _KERNEL
#include <stdbool.h>
#endif
#define OC_MFLAGS 0x0000ffff
typedef bool (objcache_ctor_fn)(void *obj, void *privdata, int ocflags);
typedef void (objcache_dtor_fn)(void *obj, void *privdata);
typedef void *(objcache_alloc_fn)(void *allocator_args, int ocflags);
typedef void (objcache_free_fn)(void *obj, void *allocator_args);
#ifdef _KERNEL
struct objcache;
struct objcache
*objcache_create(const char *name, int cluster_limit, int nom_cache,
objcache_ctor_fn *ctor, objcache_dtor_fn *dtor,
void *privdata,
objcache_alloc_fn *alloc, objcache_free_fn *free,
void *allocator_args);
struct objcache
*objcache_create_simple(malloc_type_t mtype, size_t objsize);
struct objcache
*objcache_create_mbacked(malloc_type_t mtype, size_t objsize,
int cluster_limit, int nom_cache,
objcache_ctor_fn *ctor, objcache_dtor_fn *dtor,
void *privdata);
void objcache_set_cluster_limit(struct objcache *oc, int cluster_limit);
void *objcache_get(struct objcache *oc, int ocflags);
void objcache_put(struct objcache *oc, void *obj);
void objcache_dtor(struct objcache *oc, void *obj);
void objcache_populate_linear(struct objcache *oc, void *elts, int nelts,
int size);
bool objcache_reclaimlist(struct objcache *oc[], int nlist);
void objcache_destroy(struct objcache *oc);
#endif
struct objcache_malloc_args {
size_t objsize;
malloc_type_t mtype;
};
#ifdef _KERNEL
void *objcache_malloc_alloc(void *allocator_args, int ocflags) __malloclike;
void *objcache_malloc_alloc_zero(void *allocator_args, int ocflags)
__malloclike;
void objcache_malloc_free(void *obj, void *allocator_args);
void *objcache_nop_alloc(void *allocator_args, int ocflags);
void objcache_nop_free(void *obj, void *allocator_args);
#endif
#endif
#define OBJCACHE_UNLIMITED 0x40000000
#define OBJCACHE_NAMELEN 32
struct objcache_stats {
char oc_name[OBJCACHE_NAMELEN];
u_long oc_limit;
u_long oc_requested;
u_long oc_used;
u_long oc_cached;
u_long oc_exhausted;
u_long oc_failed;
u_long oc_allocated;
u_long oc_reserved[5];
};
#endif