Add refpool.
This commit is contained in:
parent
aee2af3ae0
commit
a8ae30c3c4
6 changed files with 216 additions and 33 deletions
35
src/object.c
35
src/object.c
|
@ -25,8 +25,10 @@
|
|||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include "object.h"
|
||||
#include "refpool.h"
|
||||
|
||||
void*
|
||||
cfw_new(CFWClass *class, ...)
|
||||
|
@ -54,6 +56,39 @@ cfw_new(CFWClass *class, ...)
|
|||
return obj;
|
||||
}
|
||||
|
||||
void*
|
||||
cfw_new_p(CFWClass *class, ...)
|
||||
{
|
||||
CFWObject *obj;
|
||||
|
||||
assert(class != cfw_refpool);
|
||||
|
||||
if ((obj = malloc(class->size)) == NULL)
|
||||
return NULL;
|
||||
|
||||
obj->cls = class;
|
||||
obj->ref_cnt = 1;
|
||||
|
||||
if (class->ctor != NULL) {
|
||||
va_list args;
|
||||
va_start(args, class);
|
||||
|
||||
if (!class->ctor(obj, args)) {
|
||||
cfw_unref(obj);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
if (!cfw_refpool_add(obj)) {
|
||||
cfw_unref(obj);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
void*
|
||||
cfw_ref(void *ptr)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue