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