static void qdr_route_check_id_for_deletion_CT(qdr_core_t *core, qdr_conn_identifier_t *cid) { // // If this connection identifier has no open connection and no referencing routes, // it can safely be deleted and removed from the hash index. // if (cid->open_connection == 0 && DEQ_IS_EMPTY(cid->link_route_refs) && DEQ_IS_EMPTY(cid->auto_link_refs)) { qd_hash_remove_by_handle(core->conn_id_hash, cid->hash_handle); free_qdr_conn_identifier_t(cid); } }
void qdr_core_unbind_address_conn_CT(qdr_core_t *core, qdr_address_t *addr, qdr_connection_t *conn) { qdr_del_connection_ref(&addr->conns, conn); if (DEQ_IS_EMPTY(addr->conns)) { const char *key = (const char*) qd_hash_key_by_handle(addr->hash_handle); qdr_post_mobile_removed_CT(core, key); qdrc_event_addr_raise(core, QDRC_EVENT_ADDR_NO_LONGER_LOCAL_DEST, addr); } }
// create a buffer chain holding the outgoing message annotations section static bool compose_message_annotations(qd_message_pvt_t *msg, qd_buffer_list_t *out) { if (!DEQ_IS_EMPTY(msg->ma_to_override) || !DEQ_IS_EMPTY(msg->ma_trace) || !DEQ_IS_EMPTY(msg->ma_ingress)) { qd_composed_field_t *out_ma = qd_compose(QD_PERFORMATIVE_MESSAGE_ANNOTATIONS, 0); qd_compose_start_map(out_ma); if (!DEQ_IS_EMPTY(msg->ma_to_override)) { qd_compose_insert_symbol(out_ma, QD_MA_TO); qd_compose_insert_buffers(out_ma, &msg->ma_to_override); } if (!DEQ_IS_EMPTY(msg->ma_trace)) { qd_compose_insert_symbol(out_ma, QD_MA_TRACE); qd_compose_insert_buffers(out_ma, &msg->ma_trace); } if (!DEQ_IS_EMPTY(msg->ma_ingress)) { qd_compose_insert_symbol(out_ma, QD_MA_INGRESS); qd_compose_insert_buffers(out_ma, &msg->ma_ingress); } qd_compose_end_map(out_ma); qd_compose_take_buffers(out_ma, out); qd_compose_free(out_ma); return true; } return false; }
void *router_core_thread(void *arg) { qdr_core_t *core = (qdr_core_t*) arg; qdr_action_list_t action_list; qdr_action_t *action; qdr_forwarder_setup_CT(core); qdr_route_table_setup_CT(core); qdr_agent_setup_CT(core); qd_log(core->log, QD_LOG_INFO, "Router Core thread running. %s/%s", core->router_area, core->router_id); while (core->running) { // // Use the lock only to protect the condition variable and the action list // sys_mutex_lock(core->action_lock); // // Block on the condition variable when there is no action to do // while (core->running && DEQ_IS_EMPTY(core->action_list)) sys_cond_wait(core->action_cond, core->action_lock); // // Move the entire action list to a private list so we can process it without // holding the lock // DEQ_MOVE(core->action_list, action_list); sys_mutex_unlock(core->action_lock); // // Process and free all of the action items in the list // action = DEQ_HEAD(action_list); while (action) { DEQ_REMOVE_HEAD(action_list); if (action->label) qd_log(core->log, QD_LOG_TRACE, "Core action '%s'%s", action->label, core->running ? "" : " (discard)"); action->action_handler(core, action, !core->running); free_qdr_action_t(action); action = DEQ_HEAD(action_list); } } qd_log(core->log, QD_LOG_INFO, "Router Core thread exited"); return 0; }
static void qdr_link_route_deactivate_CT(qdr_core_t *core, qdr_link_route_t *lr, qdr_connection_t *conn) { const char *key; qdr_route_log_CT(core, "Link Route Deactivated", lr->name, lr->identity, conn); // // Deactivate the address(es) for link-routed destinations. // if (lr->addr) { qdr_del_connection_ref(&lr->addr->conns, conn); if (DEQ_IS_EMPTY(lr->addr->conns)) { key = (const char*) qd_hash_key_by_handle(lr->addr->hash_handle); if (key) qdr_post_mobile_removed_CT(core, key); } } }