You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by tr...@apache.org on 2015/10/23 18:12:32 UTC

[2/2] qpid-dispatch git commit: DISPATCH-179 - Added discard argument to properly free action data during thread shutdown Hooked in set_valid_origins

DISPATCH-179 - Added discard argument to properly free action data during thread shutdown
               Hooked in set_valid_origins


Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/995e5ad4
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/995e5ad4
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/995e5ad4

Branch: refs/heads/tross-DISPATCH-179-1
Commit: 995e5ad4c288bcb4a6277927ead36caa3616a6f8
Parents: 98e9682
Author: Ted Ross <tr...@redhat.com>
Authored: Fri Oct 23 12:11:10 2015 -0400
Committer: Ted Ross <tr...@redhat.com>
Committed: Fri Oct 23 12:11:10 2015 -0400

----------------------------------------------------------------------
 src/router_core/route_tables.c        | 56 ++++++++++++++++++++----------
 src/router_core/router_core_private.h |  2 +-
 src/router_core/router_core_thread.c  |  5 +--
 src/router_pynode.c                   |  4 +++
 4 files changed, 44 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/995e5ad4/src/router_core/route_tables.c
----------------------------------------------------------------------
diff --git a/src/router_core/route_tables.c b/src/router_core/route_tables.c
index 5560dc1..2ea108b 100644
--- a/src/router_core/route_tables.c
+++ b/src/router_core/route_tables.c
@@ -23,15 +23,15 @@
 static qdr_action_t *qdr_action(qdr_action_handler_t action_handler);
 static void qdr_action_enqueue(qdr_core_t *core, qdr_action_t *action);
 
-static void qdrh_add_router(qdr_core_t *core, qdr_action_t *action);
-static void qdrh_del_router(qdr_core_t *core, qdr_action_t *action);
-static void qdrh_set_link(qdr_core_t *core, qdr_action_t *action);
-static void qdrh_remove_link(qdr_core_t *core, qdr_action_t *action);
-static void qdrh_set_next_hop(qdr_core_t *core, qdr_action_t *action);
-static void qdrh_remove_next_hop(qdr_core_t *core, qdr_action_t *action);
-static void qdrh_set_valid_origins(qdr_core_t *core, qdr_action_t *action);
-static void qdrh_map_destination(qdr_core_t *core, qdr_action_t *action);
-static void qdrh_unmap_destination(qdr_core_t *core, qdr_action_t *action);
+static void qdrh_add_router       (qdr_core_t *core, qdr_action_t *action, bool discard);
+static void qdrh_del_router       (qdr_core_t *core, qdr_action_t *action, bool discard);
+static void qdrh_set_link         (qdr_core_t *core, qdr_action_t *action, bool discard);
+static void qdrh_remove_link      (qdr_core_t *core, qdr_action_t *action, bool discard);
+static void qdrh_set_next_hop     (qdr_core_t *core, qdr_action_t *action, bool discard);
+static void qdrh_remove_next_hop  (qdr_core_t *core, qdr_action_t *action, bool discard);
+static void qdrh_set_valid_origins(qdr_core_t *core, qdr_action_t *action, bool discard);
+static void qdrh_map_destination  (qdr_core_t *core, qdr_action_t *action, bool discard);
+static void qdrh_unmap_destination(qdr_core_t *core, qdr_action_t *action, bool discard);
 
 static qd_address_semantics_t router_addr_semantics = QD_FANOUT_SINGLE | QD_BIAS_CLOSEST | QD_CONGESTION_DROP | QD_DROP_FOR_SLOW_CONSUMERS | QD_BYPASS_VALID_ORIGINS;
 
@@ -238,11 +238,16 @@ static void qdr_check_addr(qdr_core_t *core, qdr_address_t *addr, bool was_local
 }
 
 
-static void qdrh_add_router(qdr_core_t *core, qdr_action_t *action)
+static void qdrh_add_router(qdr_core_t *core, qdr_action_t *action, bool discard)
 {
     int          router_maskbit = action->args.route_table.router_maskbit;
     qdr_field_t *address        = action->args.route_table.address;
 
+    if (discard) {
+        qdr_field_free(address);
+        return;
+    }
+
     do {
         if (router_maskbit >= qd_bitmask_width() || router_maskbit < 0) {
             qd_log(core->log, QD_LOG_CRITICAL, "add_router: Router maskbit out of range: %d", router_maskbit);
@@ -313,7 +318,7 @@ static void qdrh_add_router(qdr_core_t *core, qdr_action_t *action)
 }
 
 
-static void qdrh_del_router(qdr_core_t *core, qdr_action_t *action)
+static void qdrh_del_router(qdr_core_t *core, qdr_action_t *action, bool discard)
 {
     int router_maskbit = action->args.route_table.router_maskbit;
 
@@ -362,7 +367,7 @@ static void qdrh_del_router(qdr_core_t *core, qdr_action_t *action)
 }
 
 
-static void qdrh_set_link(qdr_core_t *core, qdr_action_t *action)
+static void qdrh_set_link(qdr_core_t *core, qdr_action_t *action, bool discard)
 {
     int router_maskbit = action->args.route_table.router_maskbit;
     int link_maskbit   = action->args.route_table.link_maskbit;
@@ -395,7 +400,7 @@ static void qdrh_set_link(qdr_core_t *core, qdr_action_t *action)
 }
 
 
-static void qdrh_remove_link(qdr_core_t *core, qdr_action_t *action)
+static void qdrh_remove_link(qdr_core_t *core, qdr_action_t *action, bool discard)
 {
     int router_maskbit = action->args.route_table.router_maskbit;
 
@@ -414,7 +419,7 @@ static void qdrh_remove_link(qdr_core_t *core, qdr_action_t *action)
 }
 
 
-static void qdrh_set_next_hop(qdr_core_t *core, qdr_action_t *action)
+static void qdrh_set_next_hop(qdr_core_t *core, qdr_action_t *action, bool discard)
 {
     int router_maskbit    = action->args.route_table.router_maskbit;
     int nh_router_maskbit = action->args.route_table.nh_router_maskbit;
@@ -446,7 +451,7 @@ static void qdrh_set_next_hop(qdr_core_t *core, qdr_action_t *action)
 }
 
 
-static void qdrh_remove_next_hop(qdr_core_t *core, qdr_action_t *action)
+static void qdrh_remove_next_hop(qdr_core_t *core, qdr_action_t *action, bool discard)
 {
     int router_maskbit = action->args.route_table.router_maskbit;
 
@@ -460,11 +465,16 @@ static void qdrh_remove_next_hop(qdr_core_t *core, qdr_action_t *action)
 }
 
 
-static void qdrh_set_valid_origins(qdr_core_t *core, qdr_action_t *action)
+static void qdrh_set_valid_origins(qdr_core_t *core, qdr_action_t *action, bool discard)
 {
     int           router_maskbit = action->args.route_table.router_maskbit;
     qd_bitmask_t *valid_origins  = action->args.route_table.router_set;
 
+    if (discard) {
+        qd_bitmask_free(valid_origins);
+        return;
+    }
+
     do {
         if (router_maskbit >= qd_bitmask_width() || router_maskbit < 0) {
             qd_log(core->log, QD_LOG_CRITICAL, "set_valid_origins: Router maskbit out of range: %d", router_maskbit);
@@ -488,7 +498,7 @@ static void qdrh_set_valid_origins(qdr_core_t *core, qdr_action_t *action)
 }
 
 
-static void qdrh_map_destination(qdr_core_t *core, qdr_action_t *action)
+static void qdrh_map_destination(qdr_core_t *core, qdr_action_t *action, bool discard)
 {
     //
     // TODO - handle the class-prefix and phase explicitly
@@ -497,6 +507,11 @@ static void qdrh_map_destination(qdr_core_t *core, qdr_action_t *action)
     int          router_maskbit = action->args.route_table.router_maskbit;
     qdr_field_t *address        = action->args.route_table.address;
 
+    if (discard) {
+        qdr_field_free(address);
+        return;
+    }
+
     do {
         if (router_maskbit >= qd_bitmask_width() || router_maskbit < 0) {
             qd_log(core->log, QD_LOG_CRITICAL, "map_destination: Router maskbit out of range: %d", router_maskbit);
@@ -531,11 +546,16 @@ static void qdrh_map_destination(qdr_core_t *core, qdr_action_t *action)
 }
 
 
-static void qdrh_unmap_destination(qdr_core_t *core, qdr_action_t *action)
+static void qdrh_unmap_destination(qdr_core_t *core, qdr_action_t *action, bool discard)
 {
     int          router_maskbit = action->args.route_table.router_maskbit;
     qdr_field_t *address        = action->args.route_table.address;
 
+    if (discard) {
+        qdr_field_free(address);
+        return;
+    }
+
     do {
         if (router_maskbit >= qd_bitmask_width() || router_maskbit < 0) {
             qd_log(core->log, QD_LOG_CRITICAL, "unmap_destination: Router maskbit out of range: %d", router_maskbit);

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/995e5ad4/src/router_core/router_core_private.h
----------------------------------------------------------------------
diff --git a/src/router_core/router_core_private.h b/src/router_core/router_core_private.h
index e186092..697d7c9 100644
--- a/src/router_core/router_core_private.h
+++ b/src/router_core/router_core_private.h
@@ -42,7 +42,7 @@ void qdr_field_free(qdr_field_t *field);
  * qdr_action_t - This type represents one work item to be performed by the router-core thread.
  */
 typedef struct qdr_action_t qdr_action_t;
-typedef void (*qdr_action_handler_t) (qdr_core_t *core, qdr_action_t *action);
+typedef void (*qdr_action_handler_t) (qdr_core_t *core, qdr_action_t *action, bool discard);
 
 struct qdr_action_t {
     DEQ_LINKS(qdr_action_t);

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/995e5ad4/src/router_core/router_core_thread.c
----------------------------------------------------------------------
diff --git a/src/router_core/router_core_thread.c b/src/router_core/router_core_thread.c
index 07c7ab2..093052c 100644
--- a/src/router_core/router_core_thread.c
+++ b/src/router_core/router_core_thread.c
@@ -64,10 +64,7 @@ void *router_core_thread(void *arg)
         action = DEQ_HEAD(action_list);
         while (action) {
             DEQ_REMOVE_HEAD(action_list);
-
-            if (core->running)
-                action->action_handler(core, action);
-
+            action->action_handler(core, action, !core->running);
             free_qdr_action_t(action);
             action = DEQ_HEAD(action_list);
         }

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/995e5ad4/src/router_pynode.c
----------------------------------------------------------------------
diff --git a/src/router_pynode.c b/src/router_pynode.c
index 361064a..77ac601 100644
--- a/src/router_pynode.c
+++ b/src/router_pynode.c
@@ -406,6 +406,7 @@ static PyObject* qd_set_valid_origins(PyObject *self, PyObject *args)
 
         Py_ssize_t        origin_count = PyList_Size(origin_list);
         qd_router_node_t *rnode        = router->routers_by_mask_bit[router_maskbit];
+        qd_bitmask_t     *core_bitmask = qd_bitmask(0);
         int               maskbit;
 
         for (idx = 0; idx < origin_count; idx++) {
@@ -428,10 +429,13 @@ static PyObject* qd_set_valid_origins(PyObject *self, PyObject *args)
             for (idx = 0; idx < origin_count; idx++) {
                 maskbit = PyInt_AS_LONG(PyList_GetItem(origin_list, idx));
                 qd_bitmask_set_bit(rnode->valid_origins, maskbit);
+                qd_bitmask_set_bit(core_bitmask, maskbit);
             }
         }
 
         sys_mutex_unlock(router->lock);
+
+        qdr_core_set_valid_origins(router->router_core, router_maskbit, core_bitmask);
     } while (0);
 
     if (error) {


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org