void qdr_core_free(qdr_core_t *core) { // // Stop and join the thread // core->running = false; sys_cond_signal(core->action_cond); sys_thread_join(core->thread); // // Free the core resources // sys_thread_free(core->thread); sys_cond_free(core->action_cond); sys_mutex_free(core->action_lock); sys_mutex_free(core->work_lock); sys_mutex_free(core->id_lock); qd_timer_free(core->work_timer); //we can't call qdr_core_unsubscribe on the subscriptions because the action processing thread has //already been shut down. But, all the action would have done at this point is free the subscriptions //so we just do that directly. free(core->agent_subscription_mobile); free(core->agent_subscription_local); for (int i = 0; i <= QD_TREATMENT_LINK_BALANCED; ++i) { if (core->forwarders[i]) { free(core->forwarders[i]); } } qdr_address_t *addr = 0; while ( (addr = DEQ_HEAD(core->addrs)) ) { qdr_core_remove_address(core, addr); } qdr_address_config_t *addr_config = 0; while ( (addr_config = DEQ_HEAD(core->addr_config))) { qdr_core_remove_address_config(core, addr_config); } qd_hash_free(core->addr_hash); qd_hash_free(core->conn_id_hash); //TODO what about the actual connection identifier objects? qdr_node_t *rnode = 0; while ( (rnode = DEQ_HEAD(core->routers)) ) { qdr_router_node_free(core, rnode); } if (core->query_lock) sys_mutex_free(core->query_lock); if (core->routers_by_mask_bit) free(core->routers_by_mask_bit); if (core->control_links_by_mask_bit) free(core->control_links_by_mask_bit); if (core->data_links_by_mask_bit) free(core->data_links_by_mask_bit); if (core->neighbor_free_mask) qd_bitmask_free(core->neighbor_free_mask); free(core); }
void qd_router_free(qd_router_t *router) { if (!router) return; qd_container_set_default_node_type(router->qd, 0, 0, QD_DIST_BOTH); qdr_core_free(router->router_core); qd_tracemask_free(router->tracemask); qd_timer_free(router->timer); sys_mutex_free(router->lock); qd_router_configure_free(router); qd_router_python_free(router); free(router); free(node_id); free(direct_prefix); }
int timer_tests(void) { int result = 0; fire_mask = 0; DEQ_INIT(pending_timers); lock = qd_timer_lock(); time_value = 1; timers[0] = qd_timer(0, 0, (void*) 0x00000001); timers[1] = qd_timer(0, 0, (void*) 0x00000002); timers[2] = qd_timer(0, 0, (void*) 0x00000004); timers[3] = qd_timer(0, 0, (void*) 0x00000008); timers[4] = qd_timer(0, 0, (void*) 0x00000010); timers[5] = qd_timer(0, 0, (void*) 0x00000020); timers[6] = qd_timer(0, 0, (void*) 0x00000040); timers[7] = qd_timer(0, 0, (void*) 0x00000080); timers[8] = qd_timer(0, 0, (void*) 0x00000100); timers[9] = qd_timer(0, 0, (void*) 0x00000200); timers[10] = qd_timer(0, 0, (void*) 0x00000400); timers[11] = qd_timer(0, 0, (void*) 0x00000800); timers[12] = qd_timer(0, 0, (void*) 0x00001000); timers[13] = qd_timer(0, 0, (void*) 0x00002000); timers[14] = qd_timer(0, 0, (void*) 0x00004000); timers[15] = qd_timer(0, 0, (void*) 0x00008000); TEST_CASE(test_quiet, 0); TEST_CASE(test_immediate, 0); TEST_CASE(test_immediate_reschedule, 0); TEST_CASE(test_immediate_plus_delayed, 0); TEST_CASE(test_single, 0); TEST_CASE(test_two_inorder, 0); TEST_CASE(test_two_reverse, 0); TEST_CASE(test_two_duplicate, 0); TEST_CASE(test_separated, 0); TEST_CASE(test_big, 0); int i; for (i = 0; i < 16; i++) qd_timer_free(timers[i]); return result; }
int timer_tests() { char *test_group = "timer_tests"; int result = 0; fire_mask = fired = 0; time_value = 1; timers[0] = qd_timer(0, on_timer, (void*) 0x00000001); timers[1] = qd_timer(0, on_timer, (void*) 0x00000002); timers[2] = qd_timer(0, on_timer, (void*) 0x00000004); timers[3] = qd_timer(0, on_timer, (void*) 0x00000008); timers[4] = qd_timer(0, on_timer, (void*) 0x00000010); timers[5] = qd_timer(0, on_timer, (void*) 0x00000020); timers[6] = qd_timer(0, on_timer, (void*) 0x00000040); timers[7] = qd_timer(0, on_timer, (void*) 0x00000080); timers[8] = qd_timer(0, on_timer, (void*) 0x00000100); timers[9] = qd_timer(0, on_timer, (void*) 0x00000200); timers[10] = qd_timer(0, on_timer, (void*) 0x00000400); timers[11] = qd_timer(0, on_timer, (void*) 0x00000800); timers[12] = qd_timer(0, on_timer, (void*) 0x00001000); timers[13] = qd_timer(0, on_timer, (void*) 0x00002000); timers[14] = qd_timer(0, on_timer, (void*) 0x00004000); timers[15] = qd_timer(0, on_timer, (void*) 0x00008000); TEST_CASE(test_quiet, 0); TEST_CASE(test_immediate, 0); TEST_CASE(test_immediate_reschedule, 0); TEST_CASE(test_immediate_plus_delayed, 0); TEST_CASE(test_single, 0); TEST_CASE(test_two_inorder, 0); TEST_CASE(test_two_reverse, 0); TEST_CASE(test_two_duplicate, 0); TEST_CASE(test_separated, 0); TEST_CASE(test_big, 0); int i; for (i = 0; i < 16; i++) qd_timer_free(timers[i]); return result; }
void qdr_core_free(qdr_core_t *core) { // // Stop and join the thread // core->running = false; sys_cond_signal(core->action_cond); sys_thread_join(core->thread); // // Free the core resources // qdr_core_unsubscribe(core->agent_subscription_mobile); qdr_core_unsubscribe(core->agent_subscription_local); sys_thread_free(core->thread); sys_cond_free(core->action_cond); sys_mutex_free(core->action_lock); sys_mutex_free(core->work_lock); sys_mutex_free(core->id_lock); qd_timer_free(core->work_timer); free(core); }
void qdr_core_free(qdr_core_t *core) { // // Stop and join the thread // core->running = false; sys_cond_signal(core->action_cond); sys_thread_join(core->thread); // Drain the general work lists qdr_general_handler(core); // // Free the core resources // sys_thread_free(core->thread); sys_cond_free(core->action_cond); sys_mutex_free(core->action_lock); sys_mutex_free(core->work_lock); sys_mutex_free(core->id_lock); qd_timer_free(core->work_timer); //we can't call qdr_core_unsubscribe on the subscriptions because the action processing thread has //already been shut down. But, all the action would have done at this point is free the subscriptions //so we just do that directly. free(core->agent_subscription_mobile); free(core->agent_subscription_local); for (int i = 0; i <= QD_TREATMENT_LINK_BALANCED; ++i) { if (core->forwarders[i]) { free(core->forwarders[i]); } } qdr_link_route_t *link_route = 0; while ( (link_route = DEQ_HEAD(core->link_routes))) { DEQ_REMOVE_HEAD(core->link_routes); qdr_core_delete_link_route(core, link_route); } qdr_auto_link_t *auto_link = 0; while ( (auto_link = DEQ_HEAD(core->auto_links))) { DEQ_REMOVE_HEAD(core->auto_links); qdr_core_delete_auto_link(core, auto_link); } qdr_exchange_free_all(core); qdr_address_t *addr = 0; while ( (addr = DEQ_HEAD(core->addrs)) ) { qdr_core_remove_address(core, addr); } qdr_address_config_t *addr_config = 0; while ( (addr_config = DEQ_HEAD(core->addr_config))) { qdr_core_remove_address_config(core, addr_config); } qd_hash_free(core->addr_hash); qd_parse_tree_free(core->addr_parse_tree); qd_parse_tree_free(core->link_route_tree[QD_INCOMING]); qd_parse_tree_free(core->link_route_tree[QD_OUTGOING]); qdr_node_t *rnode = 0; while ( (rnode = DEQ_HEAD(core->routers)) ) { qdr_router_node_free(core, rnode); } qdr_link_t *link = DEQ_HEAD(core->open_links); while (link) { DEQ_REMOVE_HEAD(core->open_links); if (link->core_endpoint) qdrc_endpoint_do_cleanup_CT(core, link->core_endpoint); qdr_del_link_ref(&link->conn->links, link, QDR_LINK_LIST_CLASS_CONNECTION); qdr_del_link_ref(&link->conn->links_with_work[link->priority], link, QDR_LINK_LIST_CLASS_WORK); free(link->name); free(link->disambiguated_name); free(link->terminus_addr); free(link->ingress_histogram); free(link->insert_prefix); free(link->strip_prefix); link->name = 0; free_qdr_link_t(link); link = DEQ_HEAD(core->open_links); } qdr_connection_t *conn = DEQ_HEAD(core->open_connections); while (conn) { DEQ_REMOVE_HEAD(core->open_connections); if (conn->conn_id) { qdr_del_connection_ref(&conn->conn_id->connection_refs, conn); qdr_route_check_id_for_deletion_CT(core, conn->conn_id); } qdr_connection_work_t *work = DEQ_HEAD(conn->work_list); while (work) { DEQ_REMOVE_HEAD(conn->work_list); qdr_connection_work_free_CT(work); work = DEQ_HEAD(conn->work_list); } qdr_connection_free(conn); conn = DEQ_HEAD(core->open_connections); } // at this point all the conn identifiers have been freed qd_hash_free(core->conn_id_hash); qdr_modules_finalize(core); if (core->query_lock) sys_mutex_free(core->query_lock); if (core->routers_by_mask_bit) free(core->routers_by_mask_bit); if (core->control_links_by_mask_bit) free(core->control_links_by_mask_bit); if (core->data_links_by_mask_bit) free(core->data_links_by_mask_bit); if (core->neighbor_free_mask) qd_bitmask_free(core->neighbor_free_mask); free(core); }