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