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]

Reply via email to