void cos_init(void *arg) { int c, accept_fd, ret; long eid; char *init_str = cos_init_args(), *create_str; int lag, nthds, prio; cvect_init_static(&evts); cvect_init_static(&tor_from); cvect_init_static(&tor_to); lock_static_init(&sc_lock); sscanf(init_str, "%d:%d:%d", &lag, &nthds, &prio); printc("lag: %d, nthds:%d, prio:%d\n", lag, nthds, prio); create_str = strstr(init_str, "/"); assert(create_str); eid = evt_get(); ret = c = from_tsplit(cos_spd_id(), td_root, create_str, strlen(create_str), TOR_ALL, eid); if (ret <= td_root) BUG(); accept_fd = c; evt_add(c, eid); /* event loop... */ while (1) { struct tor_conn tc; int t; long evt; memset(&tc, 0, sizeof(struct tor_conn)); evt = evt_wait_all(); t = evt_torrent(evt); if (t > 0) { tc.feid = evt; tc.from = t; if (t == accept_fd) { tc.to = 0; accept_new(accept_fd); } else { tc.to = tor_get_to(t, &tc.teid); assert(tc.to > 0); from_data_new(&tc); } } else { t *= -1; tc.teid = evt; tc.to = t; tc.from = tor_get_from(t, &tc.feid); assert(tc.from > 0); to_data_new(&tc); } cos_mpd_update(); } }
void cos_init(void *arg) { int c, accept_fd, ret; long eid; cvect_init_static(&evts); cvect_init_static(&tor_from); cvect_init_static(&tor_to); eid = evt_get(); c = net_create_tcp_connection(cos_spd_id(), cos_get_thd_id(), eid); if (c < 0) BUG(); ret = net_bind(cos_spd_id(), c, 0, 200); if (ret < 0) BUG(); ret = net_listen(cos_spd_id(), c, 255); if (ret < 0) BUG(); accept_fd = c; evt_add(c, eid); while (1) { struct tor_conn tc; int t; long evt; memset(&tc, 0, sizeof(struct tor_conn)); printc("waiting...\n"); evt = evt_grp_wait(cos_spd_id()); t = evt_torrent(evt); if (t > 0) { tc.feid = evt; tc.from = t; if (t == accept_fd) { tc.to = 0; printc("accepting event.\n"); accept_new(accept_fd); } else { tc.to = tor_get_to(t); assert(tc.to > 0); printc("data from net.\n"); from_data_new(&tc); } } else { t *= -1; tc.teid = evt; tc.to = t; tc.from = tor_get_from(t); assert(tc.from > 0); printc("data from torrent.\n"); to_data_new(&tc); } cos_mpd_update(); } }
static inline void mapping_add(int from, int to, long feid, long teid) { tor_add_pair(from, to); evt_add(from, feid); evt_add(to * -1, teid); assert(tor_get_to(from) == to); assert(tor_get_from(to) == from); assert(evt_torrent(feid) == from); assert(evt_torrent(teid) == (-1*to)); }
static inline void mapping_add(int from, int to, long feid, long teid) { long tf, tt; LOCK(); tor_add_pair(from, to, feid, teid); evt_add(from, feid); evt_add(to * -1, teid); assert(tor_get_to(from, &tt) == to); assert(tor_get_from(to, &tf) == from); assert(evt_torrent(feid) == from); assert(evt_torrent(teid) == (-1*to)); assert(tt == teid); assert(tf == feid); UNLOCK(); }