Author: rhs
Date: Tue Aug 27 14:38:44 2013
New Revision: 1517831
URL: http://svn.apache.org/r1517831
Log:
added explicit initialize and finalize to object api
Modified:
qpid/proton/trunk/proton-c/include/proton/object.h
qpid/proton/trunk/proton-c/src/object/object.c
Modified: qpid/proton/trunk/proton-c/include/proton/object.h
URL:
http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/include/proton/object.h?rev=1517831&r1=1517830&r2=1517831&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/include/proton/object.h (original)
+++ qpid/proton/trunk/proton-c/include/proton/object.h Tue Aug 27 14:38:44 2013
@@ -60,9 +60,11 @@ typedef struct {
}
PN_EXTERN void *pn_new(size_t size, pn_class_t *clazz);
+PN_EXTERN void pn_initialize(void *object, pn_class_t *clazz);
PN_EXTERN void *pn_incref(void *object);
PN_EXTERN void pn_decref(void *object);
PN_EXTERN int pn_refcount(void *object);
+PN_EXTERN void pn_finalize(void *object);
PN_EXTERN void pn_free(void *object);
PN_EXTERN pn_class_t *pn_class(void *object);
PN_EXTERN uintptr_t pn_hashcode(void *object);
Modified: qpid/proton/trunk/proton-c/src/object/object.c
URL:
http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/object/object.c?rev=1517831&r1=1517830&r2=1517831&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/object/object.c (original)
+++ qpid/proton/trunk/proton-c/src/object/object.c Tue Aug 27 14:38:44 2013
@@ -38,16 +38,17 @@ typedef struct {
void *pn_new(size_t size, pn_class_t *clazz)
{
- pni_head_t *obj = (pni_head_t *) malloc(sizeof(pni_head_t) + size);
- obj->clazz = clazz;
- obj->refcount = 1;
- return obj + 1;
+ pni_head_t *head = (pni_head_t *) malloc(sizeof(pni_head_t) + size);
+ void *object = head + 1;
+ pn_initialize(object, clazz);
+ return object;
}
-void pn_convert(void *object, pn_class_t *clazz)
+void pn_initialize(void *object, pn_class_t *clazz)
{
pni_head_t *head = pni_head(object);
head->clazz = clazz;
+ head->refcount = 1;
}
void *pn_incref(void *object)
@@ -62,16 +63,27 @@ void pn_decref(void *object)
{
if (object) {
pni_head_t *head = pni_head(object);
- head->refcount--;
- if (!head->refcount) {
- if (head->clazz && head->clazz->finalize) {
- head->clazz->finalize(object);
- }
+ if (head->refcount > 1) {
+ head->refcount--;
+ } else if (head->refcount == 1) {
+ pn_finalize(object);
free(head);
}
}
}
+void pn_finalize(void *object)
+{
+ if (object) {
+ pni_head_t *head = pni_head(object);
+ assert(head->refcount == 1);
+ if (head->clazz && head->clazz->finalize) {
+ head->clazz->finalize(object);
+ }
+ head->refcount = 0;
+ }
+}
+
int pn_refcount(void *object)
{
assert(object);
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]