static void multiplex(const char *exe, const char *tx_addr, int port) { Queue *runq = queue_new(); Queue *waitq = queue_new(); for (int i = 0; i < THREADS; ++i) { Exec *e = mem_alloc(sizeof(Exec)); str_cpy(e->exe, exe); str_cpy(e->tx, tx_addr); e->runq = runq; e->waitq = waitq; sys_thread(exec_thread, e); if (i == 0) /* only one waitq thread (reuses the same operand) */ sys_thread(waitq_thread, e); } IO *sio = sys_socket(&port); sys_log('E', "started port=%d, tx=%s\n", port, tx_addr); for (;;) { IO *io = sys_accept(sio, IO_STREAM); queue_put(waitq, conn_new(io)); } queue_free(waitq); queue_free(runq); }
qdr_core_t *qdr_core(qd_dispatch_t *qd, qd_router_mode_t mode, const char *area, const char *id) { qdr_core_t *core = NEW(qdr_core_t); ZERO(core); core->qd = qd; core->router_mode = mode; core->router_area = area; core->router_id = id; // // Set up the logging sources for the router core // core->log = qd_log_source("ROUTER_CORE"); core->agent_log = qd_log_source("AGENT"); // // Report on the configuration for unsettled multicasts // qd_log(core->log, QD_LOG_INFO, "Allow Unsettled Multicast: %s", qd->allow_unsettled_multicast ? "yes" : "no"); // // Set up the threading support // core->action_cond = sys_cond(); core->action_lock = sys_mutex(); core->running = true; DEQ_INIT(core->action_list); core->work_lock = sys_mutex(); DEQ_INIT(core->work_list); core->work_timer = qd_timer(core->qd, qdr_general_handler, core); // // Set up the unique identifier generator // core->next_identifier = 1; core->id_lock = sys_mutex(); // // Launch the core thread // core->thread = sys_thread(router_core_thread, core); // // Perform outside-of-thread setup for the management agent // core->agent_subscription_mobile = qdr_core_subscribe(core, "$management", 'M', '0', QD_TREATMENT_ANYCAST_CLOSEST, qdr_management_agent_on_message, core); core->agent_subscription_local = qdr_core_subscribe(core, "$management", 'L', '0', QD_TREATMENT_ANYCAST_CLOSEST, qdr_management_agent_on_message, core); return core; }