Author: rhs
Date: Thu Jun 19 17:23:18 2014
New Revision: 1603960

URL: http://svn.apache.org/r1603960
Log:
added new/incref/decref variants that take backpointers for logging; also fixed 
pn_inspect for pn_hash_t

Modified:
    qpid/proton/trunk/proton-c/include/proton/object.h
    qpid/proton/trunk/proton-c/src/object/object.c
    qpid/proton/trunk/proton-c/src/tests/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=1603960&r1=1603959&r2=1603960&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/include/proton/object.h (original)
+++ qpid/proton/trunk/proton-c/include/proton/object.h Thu Jun 19 17:23:18 2014
@@ -43,6 +43,7 @@ typedef void *(*pn_iterator_next_t)(void
 typedef struct pn_iterator_t pn_iterator_t;
 
 typedef struct {
+  const char *name;
   void (*initialize)(void *);
   void (*finalize)(void *);
   uintptr_t (*hashcode)(void *);
@@ -51,6 +52,7 @@ typedef struct {
 } pn_class_t;
 
 #define PN_CLASS(PREFIX) {                      \
+    #PREFIX,                                    \
     PREFIX ## _initialize,                      \
     PREFIX ## _finalize,                        \
     PREFIX ## _hashcode,                        \
@@ -59,9 +61,12 @@ typedef struct {
 }
 
 PN_EXTERN void *pn_new(size_t size, const pn_class_t* clazz);
+PN_EXTERN void *pn_new2(size_t size, const pn_class_t* clazz, void *from);
 PN_EXTERN void pn_initialize(void *object, const pn_class_t *clazz);
 PN_EXTERN void *pn_incref(void *object);
+PN_EXTERN void *pn_incref2(void *object, void *from);
 PN_EXTERN void pn_decref(void *object);
+PN_EXTERN void pn_decref2(void *object, void *from);
 PN_EXTERN int pn_refcount(void *object);
 PN_EXTERN void pn_finalize(void *object);
 PN_EXTERN void pn_free(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=1603960&r1=1603959&r2=1603960&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/object/object.c (original)
+++ qpid/proton/trunk/proton-c/src/object/object.c Thu Jun 19 17:23:18 2014
@@ -38,6 +38,11 @@ typedef struct {
 
 void *pn_new(size_t size, const pn_class_t *clazz)
 {
+  return pn_new2(size, clazz, NULL);
+}
+
+void *pn_new2(size_t size, const pn_class_t *clazz, void *from)
+{
   pni_head_t *head = (pni_head_t *) malloc(sizeof(pni_head_t) + size);
   void *object = head + 1;
   pn_initialize(object, clazz);
@@ -54,15 +59,22 @@ void pn_initialize(void *object, const p
   }
 }
 
-void *pn_incref(void *object)
-{
+void *pn_incref(void *object) {
+  return pn_incref2(object, NULL);
+}
+
+void *pn_incref2(void *object, void *from) {
   if (object) {
     pni_head(object)->refcount++;
   }
   return object;
 }
 
-void pn_decref(void *object)
+void pn_decref(void *object) {
+  pn_decref2(object, NULL);
+}
+
+void pn_decref2(void *object, void *from)
 {
   if (object) {
     pni_head_t *head = pni_head(object);
@@ -153,13 +165,20 @@ int pn_inspect(void *object, pn_string_t
 
   if (object) {
     pni_head_t *head = pni_head(object);
+    const char *name;
     if (head->clazz) {
       const pn_class_t *clazz = head->clazz;
       if (clazz->inspect) {
         return clazz->inspect(object, dst);
+      } else if (clazz->name) {
+        name = clazz->name;
+      } else {
+        name = "object";
       }
+    } else {
+      name = "object";
     }
-    return pn_string_addf(dst, "object<%p>", object);
+    return pn_string_addf(dst, "%s<%p>", name, object);
   } else {
     return pn_string_addf(dst, "(null)");
   }
@@ -188,9 +207,9 @@ void pn_list_set(pn_list_t *list, int in
 {
   assert(list); assert(list->size);
   void *old = list->elements[index % list->size];
-  if (list->options & PN_REFCOUNT) pn_decref(old);
+  if (list->options & PN_REFCOUNT) pn_decref2(old, list);
   list->elements[index % list->size] = value;
-  if (list->options & PN_REFCOUNT) pn_incref(value);
+  if (list->options & PN_REFCOUNT) pn_incref2(value, list);
 }
 
 void pn_list_ensure(pn_list_t *list, size_t capacity)
@@ -210,7 +229,7 @@ int pn_list_add(pn_list_t *list, void *v
   assert(list);
   pn_list_ensure(list, list->size + 1);
   list->elements[list->size++] = value;
-  if (list->options & PN_REFCOUNT) pn_incref(value);
+  if (list->options & PN_REFCOUNT) pn_incref2(value, list);
   return 0;
 }
 
@@ -245,7 +264,7 @@ void pn_list_del(pn_list_t *list, int in
 
   if (list->options & PN_REFCOUNT) {
     for (int i = 0; i < n; i++) {
-      pn_decref(list->elements[index + i]);
+      pn_decref2(list->elements[index + i], list);
     }
   }
 
@@ -297,7 +316,7 @@ static void pn_list_finalize(void *objec
   assert(object);
   pn_list_t *list = (pn_list_t *) object;
   for (size_t i = 0; i < list->size; i++) {
-    if (list->options & PN_REFCOUNT) pn_decref(pn_list_get(list, i));
+    if (list->options & PN_REFCOUNT) pn_decref2(pn_list_get(list, i), list);
   }
   free(list->elements);
 }
@@ -388,6 +407,7 @@ struct pn_map_t {
   float load_factor;
   bool count_keys;
   bool count_values;
+  bool inspect_keys;
 };
 
 static void pn_map_finalize(void *object)
@@ -397,8 +417,8 @@ static void pn_map_finalize(void *object
   if (map->count_keys || map->count_values) {
     for (size_t i = 0; i < map->capacity; i++) {
       if (map->entries[i].state != PNI_ENTRY_FREE) {
-        if (map->count_keys) pn_decref(map->entries[i].key);
-        if (map->count_values) pn_decref(map->entries[i].value);
+        if (map->count_keys) pn_decref2(map->entries[i].key, map);
+        if (map->count_values) pn_decref2(map->entries[i].value, map);
       }
     }
   }
@@ -450,7 +470,11 @@ static int pn_map_inspect(void *obj, pn_
       err = pn_string_addf(dst, ", ");
       if (err) return err;
     }
-    err = pn_inspect(pn_map_key(map, entry), dst);
+    if (map->inspect_keys) {
+      err = pn_inspect(pn_map_key(map, entry), dst);
+    } else {
+      err = pn_string_addf(dst, "%p", pn_map_key(map, entry));
+    }
     if (err) return err;
     err = pn_string_addf(dst, ": ");
     if (err) return err;
@@ -477,6 +501,7 @@ pn_map_t *pn_map(size_t capacity, float 
   map->equals = pn_equals;
   map->count_keys = (options & PN_REFCOUNT) || (options & PN_REFCOUNT_KEY);
   map->count_values = (options & PN_REFCOUNT) || (options & PN_REFCOUNT_VALUE);
+  map->inspect_keys = true;
   pni_map_allocate(map);
   return map;
 }
@@ -514,8 +539,8 @@ static bool pni_map_ensure(pn_map_t *map
       void *key = entries[i].key;
       void *value = entries[i].value;
       pn_map_put(map, key, value);
-      if (map->count_keys) pn_decref(key);
-      if (map->count_values) pn_decref(value);
+      if (map->count_keys) pn_decref2(key, map);
+      if (map->count_values) pn_decref2(value, map);
     }
   }
 
@@ -534,7 +559,7 @@ static pni_entry_t *pni_map_entry(pn_map
     if (create) {
       entry->state = PNI_ENTRY_TAIL;
       entry->key = key;
-      if (map->count_keys) pn_incref(key);
+      if (map->count_keys) pn_incref2(key, map);
       map->size++;
       return entry;
     } else {
@@ -574,7 +599,7 @@ static pni_entry_t *pni_map_entry(pn_map
     entry->state = PNI_ENTRY_LINK;
     map->entries[empty].state = PNI_ENTRY_TAIL;
     map->entries[empty].key = key;
-    if (map->count_keys) pn_incref(key);
+    if (map->count_keys) pn_incref2(key, map);
     if (pprev) *pprev = entry;
     map->size++;
     return &map->entries[empty];
@@ -587,9 +612,9 @@ int pn_map_put(pn_map_t *map, void *key,
 {
   assert(map);
   pni_entry_t *entry = pni_map_entry(map, key, NULL, true);
-  if (map->count_values) pn_decref(entry->value);
+  if (map->count_values) pn_decref2(entry->value, map);
   entry->value = value;
-  if (map->count_values) pn_incref(value);
+  if (map->count_values) pn_incref2(value, map);
   return 0;
 }
 
@@ -612,9 +637,9 @@ void pn_map_del(pn_map_t *map, void *key
     }
     entry->state = PNI_ENTRY_FREE;
     entry->next = 0;
-    if (map->count_keys) pn_decref(entry->key);
+    if (map->count_keys) pn_decref2(entry->key, map);
     entry->key = NULL;
-    if (map->count_values) pn_decref(entry->value);
+    if (map->count_values) pn_decref2(entry->value, map);
     entry->value = NULL;
     map->size--;
   }
@@ -679,6 +704,7 @@ pn_hash_t *pn_hash(size_t capacity, floa
   hash->map.equals = pni_identity_equals;
   hash->map.count_keys = false;
   hash->map.count_values = options & PN_REFCOUNT;
+  hash->map.inspect_keys = false;
   return hash;
 }
 

Modified: qpid/proton/trunk/proton-c/src/tests/object.c
URL: 
http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/tests/object.c?rev=1603960&r1=1603959&r2=1603960&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/tests/object.c (original)
+++ qpid/proton/trunk/proton-c/src/tests/object.c Thu Jun 19 17:23:18 2014
@@ -95,7 +95,7 @@ static intptr_t delta(void *a, void *b) 
 
 static pn_class_t null_class = {0};
 
-static pn_class_t noop_class = {noop, noop, zero, delta};
+static pn_class_t noop_class = {NULL, noop, noop, zero, delta};
 
 static void test_new(size_t size, pn_class_t *clazz)
 {
@@ -119,7 +119,7 @@ static void finalizer(void *object)
 
 static void test_finalize(void)
 {
-  static pn_class_t clazz = {NULL, finalizer};
+  static pn_class_t clazz = {NULL, NULL, finalizer};
 
   int **obj = (int **) pn_new(sizeof(int **), &clazz);
   assert(obj);
@@ -141,7 +141,7 @@ static uintptr_t hashcode(void *obj) { r
 
 static void test_hashcode(void)
 {
-  static pn_class_t clazz = {NULL, NULL, hashcode};
+  static pn_class_t clazz = {NULL, NULL, NULL, hashcode};
   void *obj = pn_new(0, &clazz);
   assert(obj);
   assert(pn_hashcode(obj) == (uintptr_t) obj);
@@ -151,7 +151,7 @@ static void test_hashcode(void)
 
 static void test_compare(void)
 {
-  static pn_class_t clazz = {NULL, NULL, NULL, delta};
+  static pn_class_t clazz = {NULL, NULL, NULL, NULL, delta};
 
   void *a = pn_new(0, &clazz);
   assert(a);



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to