#if !defined(__OBJMGR_H__) #define __OBJMGR_H__ #include "config.h" #include #include #include #include "htab.h" #include "mylock.h" #include "zarray.h" #define OBJ_MAGIC (0x4a424f58) #define OBJREF_NOP \ (0) /* ref obj without lock, \ * just keep object alive */ #define OBJREF_READ (1) /* ref obj with read lock */ #define OBJREF_UPDATE (2) /* ref obj with write lock */ typedef void* (*obj_create_fn_t)(void*, void*, va_list); typedef void (*obj_fini_fn_t)(void*); typedef void (*objtype_fini_fn_t)(void*); typedef struct { char* type; /* name of type */ mylock_t lock; obj_create_fn_t fn_create; /* function to initialize object */ obj_fini_fn_t fn_fini; /* function to finalize obj */ objtype_fini_fn_t fn_type_fini; /* function to finalize typeinfo */ void* typedata; /* extra information for type */ } objtype_t; typedef struct { uint32_t magic; uint32_t nref; my_rwlock_t rwlock; mylock_t lock; objtype_t* type; int32_t exdata; uint32_t nread : 28; uint32_t nwrite : 4; } myobj_t; typedef struct { mylock_t lock; htab_t names; zarray_t types; } objmgr_t; #define MYOBJ_TO_OBJ(type, myobj) ((type)(((char*)myobj) + sizeof(myobj_t))) #define TO_MYOBJ(obj) ((myobj_t*)(((char*)obj) - sizeof(myobj_t))) #define DEREF_OBJ(obj) \ if ((obj) != NULL) { \ obj_deref(obj); \ (obj) = NULL; \ } extern int objmgr_init(objmgr_t*); extern void objmgr_fini(objmgr_t*); extern int objmgr_register(objmgr_t*, objtype_t*); extern int obj_init(objmgr_t*, objtype_t*, int32_t, myobj_t*); extern void* create_obj_by_typeid(objmgr_t*, int, ...); extern void* create_obj_by_typename(objmgr_t*, char*, ...); extern void* obj_ref(void*, int); extern void obj_deref(void*); extern int typeid_of_name(objmgr_t*, char*); extern objmgr_t* objmgr_get_default(); extern int objmgr_set_default(objmgr_t*); extern myobj_t* obj_alloc(size_t); #endif