myxce/src/include/objmgr.h

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