diff options
Diffstat (limited to 'qpid/extras/dispatch/src/container.c')
-rw-r--r-- | qpid/extras/dispatch/src/container.c | 73 |
1 files changed, 62 insertions, 11 deletions
diff --git a/qpid/extras/dispatch/src/container.c b/qpid/extras/dispatch/src/container.c index cc46f3ce77..3ae24d81b0 100644 --- a/qpid/extras/dispatch/src/container.c +++ b/qpid/extras/dispatch/src/container.c @@ -88,8 +88,8 @@ typedef struct container_class_t { struct dx_container_t { dx_dispatch_t *dx; dx_server_t *server; - hash_t *node_type_map; - hash_t *node_map; + dx_hash_t *node_type_map; + dx_hash_t *node_map; sys_mutex_t *lock; dx_node_t *default_node; dxc_node_type_list_t node_type_list; @@ -108,7 +108,7 @@ static void setup_outgoing_link(dx_container_t *container, pn_link_t *pn_link) if (source) { iter = dx_field_iterator_string(source, ITER_VIEW_NODE_ID); - hash_retrieve(container->node_map, iter, (void*) &node); + dx_hash_retrieve(container->node_map, iter, (void*) &node); dx_field_iterator_free(iter); } sys_mutex_unlock(container->lock); @@ -149,7 +149,7 @@ static void setup_incoming_link(dx_container_t *container, pn_link_t *pn_link) if (target) { iter = dx_field_iterator_string(target, ITER_VIEW_NODE_ID); - hash_retrieve(container->node_map, iter, (void*) &node); + dx_hash_retrieve(container->node_map, iter, (void*) &node); dx_field_iterator_free(iter); } sys_mutex_unlock(container->lock); @@ -429,8 +429,8 @@ static void container_query_handler(void* context, const char *id, void *correla container_class_t *cls = (container_class_t*) context; if (cls->class_id == DX_CONTAINER_CLASS_CONTAINER) { - dx_agent_value_uint(correlator, "node_type_count", hash_size(cls->container->node_type_map)); - dx_agent_value_uint(correlator, "node_count", hash_size(cls->container->node_map)); + dx_agent_value_uint(correlator, "node_type_count", dx_hash_size(cls->container->node_type_map)); + dx_agent_value_uint(correlator, "node_count", dx_hash_size(cls->container->node_map)); if (cls->container->default_node) dx_agent_value_string(correlator, "default_node_type", cls->container->default_node->ntype->type_name); else @@ -463,8 +463,8 @@ dx_container_t *dx_container(dx_dispatch_t *dx) container->dx = dx; container->server = dx->server; - container->node_type_map = hash(6, 4, 1); // 64 buckets, item batches of 4 - container->node_map = hash(10, 32, 0); // 1K buckets, item batches of 32 + container->node_type_map = dx_hash(6, 4, 1); // 64 buckets, item batches of 4 + container->node_map = dx_hash(10, 32, 0); // 1K buckets, item batches of 32 container->lock = sys_mutex(); container->default_node = 0; DEQ_INIT(container->node_type_list); @@ -507,7 +507,7 @@ int dx_container_register_node_type(dx_dispatch_t *dx, const dx_node_type_t *nt) nt_item->ntype = nt; sys_mutex_lock(container->lock); - result = hash_insert_const(container->node_type_map, iter, nt); + result = dx_hash_insert_const(container->node_type_map, iter, nt, 0); DEQ_INSERT_TAIL(container->node_type_list, nt_item); sys_mutex_unlock(container->lock); @@ -565,7 +565,7 @@ dx_node_t *dx_container_create_node(dx_dispatch_t *dx, if (name) { dx_field_iterator_t *iter = dx_field_iterator_string(name, ITER_VIEW_ALL); sys_mutex_lock(container->lock); - result = hash_insert(container->node_map, iter, node); + result = dx_hash_insert(container->node_map, iter, node, 0); sys_mutex_unlock(container->lock); dx_field_iterator_free(iter); if (result < 0) { @@ -591,7 +591,7 @@ void dx_container_destroy_node(dx_node_t *node) if (node->name) { dx_field_iterator_t *iter = dx_field_iterator_string(node->name, ITER_VIEW_ALL); sys_mutex_lock(container->lock); - hash_remove(container->node_map, iter); + dx_hash_remove(container->node_map, iter); sys_mutex_unlock(container->lock); dx_field_iterator_free(iter); free(node->name); @@ -651,12 +651,63 @@ void *dx_link_get_context(dx_link_t *link) } +void dx_link_set_conn_context(dx_link_t *link, void *context) +{ + pn_session_t *pn_sess = pn_link_session(link->pn_link); + if (!pn_sess) + return; + pn_connection_t *pn_conn = pn_session_connection(pn_sess); + if (!pn_conn) + return; + dx_connection_t *conn = (dx_connection_t*) pn_connection_get_context(pn_conn); + if (!conn) + return; + dx_connection_set_link_context(conn, context); +} + + +void *dx_link_get_conn_context(dx_link_t *link) +{ + pn_session_t *pn_sess = pn_link_session(link->pn_link); + if (!pn_sess) + return 0; + pn_connection_t *pn_conn = pn_session_connection(pn_sess); + if (!pn_conn) + return 0; + dx_connection_t *conn = (dx_connection_t*) pn_connection_get_context(pn_conn); + if (!conn) + return 0; + return dx_connection_get_link_context(conn); +} + + pn_link_t *dx_link_pn(dx_link_t *link) { return link->pn_link; } +dx_connection_t *dx_link_connection(dx_link_t *link) +{ + if (!link || !link->pn_link) + return 0; + + pn_session_t *sess = pn_link_session(link->pn_link); + if (!sess) + return 0; + + pn_connection_t *conn = pn_session_connection(sess); + if (!conn) + return 0; + + dx_connection_t *ctx = pn_connection_get_context(conn); + if (!ctx) + return 0; + + return ctx; +} + + pn_terminus_t *dx_link_source(dx_link_t *link) { return pn_link_source(link->pn_link); |