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]