static void test_class(const pn_class_t *clazz, size_t size) { void *a = pn_class_new(clazz, size); void *b = pn_class_new(clazz, size); assert(!pn_class_equals(clazz, a, b)); assert(pn_class_equals(clazz, a, a)); assert(pn_class_equals(clazz, b, b)); assert(!pn_class_equals(clazz, a, NULL)); assert(!pn_class_equals(clazz, NULL, a)); int rca = pn_class_refcount(clazz, a); int rcb = pn_class_refcount(clazz, b); assert(rca == -1 || rca == 1); assert(rcb == -1 || rcb == 1); pn_class_incref(clazz, a); rca = pn_class_refcount(clazz, a); assert(rca == -1 || rca == 2); pn_class_decref(clazz, a); rca = pn_class_refcount(clazz, a); assert(rca == -1 || rca == 1); pn_class_free(clazz, a); pn_class_free(clazz, b); }
int pn_list_add(pn_list_t *list, void *value) { assert(list); pn_list_ensure(list, list->size + 1); list->elements[list->size++] = value; pn_class_incref(list->clazz, value); return 0; }
void pn_list_set(pn_list_t *list, int index, void *value) { assert(list); assert(list->size); void *old = list->elements[index % list->size]; pn_class_decref(list->clazz, old); list->elements[index % list->size] = value; pn_class_incref(list->clazz, value); }
pn_event_t *pn_collector_put(pn_collector_t *collector, const pn_class_t *clazz, void *context, pn_event_type_t type) { if (!collector) { return NULL; } assert(context); if (collector->freed) { return NULL; } pn_event_t *tail = collector->tail; if (tail && tail->type == type && tail->context == context) { return NULL; } clazz = clazz->reify(context); pn_event_t *event = (pn_event_t *) pn_list_pop(collector->pool); if (!event) { event = pn_event(); } event->pool = collector->pool; pn_incref(event->pool); if (tail) { tail->next = event; collector->tail = event; } else { collector->tail = event; collector->head = event; } event->clazz = clazz; event->context = context; event->type = type; pn_class_incref(clazz, event->context); return event; }