You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by rh...@apache.org on 2015/01/16 01:17:37 UTC
[4/4] qpid-proton git commit: allow events to be increfed
allow events to be increfed
Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/b1e44a82
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/b1e44a82
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/b1e44a82
Branch: refs/heads/master
Commit: b1e44a824a4852f9954ef3fb85e110b0b7ed0fbd
Parents: 2742fdd
Author: Rafael Schloming <rh...@alum.mit.edu>
Authored: Thu Jan 15 18:14:48 2015 -0500
Committer: Rafael Schloming <rh...@alum.mit.edu>
Committed: Thu Jan 15 18:14:48 2015 -0500
----------------------------------------------------------------------
proton-c/src/events/event.c | 57 +++++++++--------
proton-c/src/tests/CMakeLists.txt | 1 +
proton-c/src/tests/event.c | 109 +++++++++++++++++++++++++++++++++
3 files changed, 141 insertions(+), 26 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/b1e44a82/proton-c/src/events/event.c
----------------------------------------------------------------------
diff --git a/proton-c/src/events/event.c b/proton-c/src/events/event.c
index a165199..a1d959b 100644
--- a/proton-c/src/events/event.c
+++ b/proton-c/src/events/event.c
@@ -3,13 +3,14 @@
#include <assert.h>
struct pn_collector_t {
+ pn_list_t *pool;
pn_event_t *head;
pn_event_t *tail;
- pn_event_t *free_head;
bool freed;
};
struct pn_event_t {
+ pn_list_t *pool;
const pn_class_t *clazz;
void *context; // depends on type
pn_event_t *next;
@@ -18,9 +19,9 @@ struct pn_event_t {
static void pn_collector_initialize(pn_collector_t *collector)
{
+ collector->pool = pn_list(PN_OBJECT, 0);
collector->head = NULL;
collector->tail = NULL;
- collector->free_head = NULL;
collector->freed = false;
}
@@ -36,20 +37,14 @@ static void pn_collector_drain(pn_collector_t *collector)
static void pn_collector_shrink(pn_collector_t *collector)
{
- pn_event_t *event = collector->free_head;
- while (event) {
- pn_event_t *next = event->next;
- pn_free(event);
- event = next;
- }
-
- collector->free_head = NULL;
+ assert(collector);
+ pn_list_clear(collector->pool);
}
static void pn_collector_finalize(pn_collector_t *collector)
{
pn_collector_drain(collector);
- pn_collector_shrink(collector);
+ pn_decref(collector->pool);
}
static int pn_collector_inspect(pn_collector_t *collector, pn_string_t *dst)
@@ -85,10 +80,11 @@ pn_collector_t *pn_collector(void)
void pn_collector_free(pn_collector_t *collector)
{
+ assert(collector);
collector->freed = true;
pn_collector_drain(collector);
pn_collector_shrink(collector);
- pn_class_decref(PN_OBJECT, collector);
+ pn_decref(collector);
}
pn_event_t *pn_event(void);
@@ -115,16 +111,17 @@ pn_event_t *pn_collector_put(pn_collector_t *collector,
clazz = clazz->reify(context);
- pn_event_t *event;
+ pn_event_t *event = (pn_event_t *) pn_list_pop(collector->pool);
- if (collector->free_head) {
- event = collector->free_head;
- collector->free_head = collector->free_head->next;
+ if (event) {
pn_event_initialize(event);
} else {
event = pn_event();
}
+ event->pool = collector->pool;
+ pn_incref(event->pool);
+
if (tail) {
tail->next = event;
collector->tail = event;
@@ -159,27 +156,35 @@ bool pn_collector_pop(pn_collector_t *collector)
collector->tail = NULL;
}
- // decref before adding to the free list
- if (event->context) {
- pn_class_decref(event->clazz, event->context);
- event->context = NULL;
- }
-
- event->next = collector->free_head;
- collector->free_head = event;
-
+ pn_decref(event);
return true;
}
static void pn_event_initialize(pn_event_t *event)
{
+ event->pool = NULL;
event->type = PN_EVENT_NONE;
event->clazz = NULL;
event->context = NULL;
event->next = NULL;
}
-static void pn_event_finalize(pn_event_t *event) {}
+static void pn_event_finalize(pn_event_t *event) {
+ // decref before adding to the free list
+ if (event->clazz && event->context) {
+ pn_class_decref(event->clazz, event->context);
+ event->context = NULL;
+ }
+
+ pn_list_t *pool = event->pool;
+
+ if (pool && pn_refcount(pool) > 1) {
+ event->pool = NULL;
+ pn_list_add(pool, event);
+ }
+
+ pn_decref(pool);
+}
static int pn_event_inspect(pn_event_t *event, pn_string_t *dst)
{
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/b1e44a82/proton-c/src/tests/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/proton-c/src/tests/CMakeLists.txt b/proton-c/src/tests/CMakeLists.txt
index 312c94f..dc25444 100644
--- a/proton-c/src/tests/CMakeLists.txt
+++ b/proton-c/src/tests/CMakeLists.txt
@@ -46,3 +46,4 @@ pn_add_c_test (c-engine-tests engine.c)
pn_add_c_test (c-parse-url-tests parse-url.c)
pn_add_c_test (c-refcount-tests refcount.c)
pn_add_c_test (c-reactor-tests reactor.c)
+pn_add_c_test (c-event-tests event.c)
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/b1e44a82/proton-c/src/tests/event.c
----------------------------------------------------------------------
diff --git a/proton-c/src/tests/event.c b/proton-c/src/tests/event.c
new file mode 100644
index 0000000..6746c3b
--- /dev/null
+++ b/proton-c/src/tests/event.c
@@ -0,0 +1,109 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+#include <proton/object.h>
+#include <proton/event.h>
+#include <stdlib.h>
+
+#define assert(E) ((E) ? 0 : (abort(), 0))
+
+static void test_collector(void) {
+ pn_collector_t *collector = pn_collector();
+ assert(collector);
+ pn_free(collector);
+}
+
+#define SETUP_COLLECTOR \
+ void *obj = pn_class_new(PN_OBJECT, 0); \
+ pn_collector_t *collector = pn_collector(); \
+ assert(collector); \
+ pn_event_t *event = pn_collector_put(collector, PN_OBJECT, obj, (pn_event_type_t) 0); \
+ pn_decref(obj); \
+
+static void test_collector_put(void) {
+ SETUP_COLLECTOR;
+ assert(event);
+ assert(pn_event_context(event) == obj);
+ pn_free(collector);
+}
+
+static void test_collector_peek(void) {
+ SETUP_COLLECTOR;
+ pn_event_t *head = pn_collector_peek(collector);
+ assert(head == event);
+ pn_free(collector);
+}
+
+static void test_collector_pop(void) {
+ SETUP_COLLECTOR;
+ pn_event_t *head = pn_collector_peek(collector);
+ assert(head == event);
+ pn_collector_pop(collector);
+ head = pn_collector_peek(collector);
+ assert(!head);
+ pn_free(collector);
+}
+
+static void test_collector_pool(void) {
+ SETUP_COLLECTOR;
+ pn_event_t *head = pn_collector_peek(collector);
+ assert(head == event);
+ pn_collector_pop(collector);
+ head = pn_collector_peek(collector);
+ assert(!head);
+ void *obj2 = pn_class_new(PN_OBJECT, 0);
+ pn_event_t *event2 = pn_collector_put(collector, PN_OBJECT, obj2, (pn_event_type_t) 0);
+ pn_decref(obj2);
+ assert(event == event2);
+ pn_free(collector);
+}
+
+static void test_event_incref(bool eventfirst) {
+ SETUP_COLLECTOR;
+ pn_event_t *head = pn_collector_peek(collector);
+ assert(head == event);
+ pn_incref(head);
+ pn_collector_pop(collector);
+ assert(!pn_collector_peek(collector));
+ void *obj2 = pn_class_new(PN_OBJECT, 0);
+ pn_event_t *event2 = pn_collector_put(collector, PN_OBJECT, obj2, (pn_event_type_t) 0);
+ pn_decref(obj2);
+ assert(head != event2);
+ if (eventfirst) {
+ pn_decref(head);
+ pn_free(collector);
+ } else {
+ pn_free(collector);
+ pn_decref(head);
+ }
+}
+
+int main(int argc, char **argv)
+{
+ test_collector();
+ test_collector_put();
+ test_collector_peek();
+ test_collector_pop();
+ test_collector_pool();
+ test_event_incref(true);
+ test_event_incref(false);
+ return 0;
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org