forked from lei.chen/myxce
76 lines
2.4 KiB
C
76 lines
2.4 KiB
C
#if !defined(__OBJMGR_H__)
|
|
|
|
#define __OBJMGR_H__
|
|
|
|
#include "config.h"
|
|
|
|
#include <stdarg.h>
|
|
#include <stddef.h>
|
|
#include <stdint.h>
|
|
|
|
#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
|