static void setup_outgoing_link(qd_container_t *container, pn_link_t *pn_link) { sys_mutex_lock(container->lock); qd_node_t *node = 0; const char *source = pn_terminus_get_address(pn_link_remote_source(pn_link)); qd_field_iterator_t *iter; // TODO - Extract the name from the structured source if (source) { iter = qd_address_iterator_string(source, ITER_VIEW_NODE_ID); qd_hash_retrieve(container->node_map, iter, (void*) &node); qd_field_iterator_free(iter); } sys_mutex_unlock(container->lock); if (node == 0) { if (container->default_node) node = container->default_node; else { pn_condition_t *cond = pn_link_condition(pn_link); pn_condition_set_name(cond, "amqp:not-found"); pn_condition_set_description(cond, "Source node does not exist"); pn_link_close(pn_link); return; } } qd_link_t *link = new_qd_link_t(); if (!link) { pn_condition_t *cond = pn_link_condition(pn_link); pn_condition_set_name(cond, "amqp:internal-error"); pn_condition_set_description(cond, "Insufficient memory"); pn_link_close(pn_link); return; } link->pn_sess = pn_link_session(pn_link); link->pn_link = pn_link; link->direction = QD_OUTGOING; link->context = 0; link->node = node; link->remote_snd_settle_mode = pn_link_remote_snd_settle_mode(pn_link); link->drain_mode = pn_link_get_drain(pn_link); link->close_sess_with_link = false; // // Keep the borrowed references // pn_incref(pn_link); pn_incref(link->pn_sess); pn_link_set_context(pn_link, link); node->ntype->outgoing_handler(node->context, link); }
void qd_tracemask_add_router(qd_tracemask_t *tm, const char *address, int maskbit) { qd_field_iterator_t *iter = qd_address_iterator_string(address, ITER_VIEW_ADDRESS_HASH); sys_rwlock_wrlock(tm->lock); assert(maskbit < qd_bitmask_width() && tm->router_by_mask_bit[maskbit] == 0); if (maskbit < qd_bitmask_width() && tm->router_by_mask_bit[maskbit] == 0) { qdtm_router_t *router = new_qdtm_router_t(); router->maskbit = maskbit; router->link_maskbit = -1; qd_hash_insert(tm->hash, iter, router, &router->hash_handle); tm->router_by_mask_bit[maskbit] = router; } sys_rwlock_unlock(tm->lock); qd_field_iterator_free(iter); }
qdr_address_t *qdr_add_local_address_CT(qdr_core_t *core, char aclass, const char *address, qd_address_treatment_t treatment) { char addr_string[1000]; qdr_address_t *addr = 0; qd_field_iterator_t *iter = 0; snprintf(addr_string, sizeof(addr_string), "%c%s", aclass, address); iter = qd_address_iterator_string(addr_string, ITER_VIEW_ALL); qd_hash_retrieve(core->addr_hash, iter, (void**) &addr); if (!addr) { addr = qdr_address_CT(core, treatment); qd_hash_insert(core->addr_hash, iter, addr, &addr->hash_handle); DEQ_ITEM_INIT(addr); DEQ_INSERT_TAIL(core->addrs, addr); addr->block_deletion = true; addr->local = (aclass == 'L'); } qd_field_iterator_free(iter); return addr; }