78 lines
1023 B
C
78 lines
1023 B
C
#include "debug.h"
|
|
#include "object.h"
|
|
|
|
void
|
|
e_object_init(E_Object * obj, E_Cleanup_Func cleanup_func)
|
|
{
|
|
D_ENTER;
|
|
|
|
if (!obj)
|
|
D_RETURN;
|
|
|
|
memset(obj, 0, sizeof(E_Object));
|
|
obj->references = 1;
|
|
obj->cleanup_func = cleanup_func;
|
|
|
|
D_RETURN;
|
|
}
|
|
|
|
void
|
|
e_object_cleanup(E_Object * obj)
|
|
{
|
|
D_ENTER;
|
|
|
|
if (!obj)
|
|
D_RETURN;
|
|
|
|
FREE(obj);
|
|
|
|
D_RETURN;
|
|
}
|
|
|
|
void
|
|
e_object_ref(E_Object * obj)
|
|
{
|
|
D_ENTER;
|
|
|
|
if (!obj)
|
|
D_RETURN;
|
|
|
|
obj->references++;
|
|
D("++ refcount on %p, now %i\n", obj, obj->references);
|
|
|
|
D_RETURN;
|
|
}
|
|
|
|
int
|
|
e_object_unref(E_Object * obj)
|
|
{
|
|
D_ENTER;
|
|
|
|
if (!obj)
|
|
D_RETURN_(-1);
|
|
|
|
obj->references--;
|
|
|
|
D("-- refcount on %p, now %i\n", obj, obj->references);
|
|
|
|
if (obj->references == 0 && obj->cleanup_func)
|
|
{
|
|
D("Refcount is zero, freeing.\n");
|
|
obj->cleanup_func(obj);
|
|
D_RETURN_(0);
|
|
}
|
|
|
|
D_RETURN_(obj->references);
|
|
}
|
|
|
|
int
|
|
e_object_get_usecount(E_Object * obj)
|
|
{
|
|
D_ENTER;
|
|
|
|
if (!obj)
|
|
D_RETURN_(-1);
|
|
|
|
D_RETURN_(obj->references);
|
|
}
|