static inline void mapping_remove(int from, int to, long feid, long teid) { LOCK(); tor_del_pair(from, to); cvect_del(&evts, feid); cvect_del(&evts, teid); UNLOCK(); }
static void to_data_new(struct tor_conn *tc) { int from, to, amnt; char *buf; from = tc->from; to = tc->to; buf = cos_argreg_alloc(BUFF_SZ); assert(buf); while (1) { int ret; amnt = tread_pack(cos_spd_id(), to, buf, BUFF_SZ-1); if (0 == amnt) break; else if (-EPIPE == amnt) { goto close; } else if (amnt < 0) { printc("read from fd %d produced %d.\n", from, amnt); BUG(); } if (amnt != (ret = net_send(cos_spd_id(), from, buf, amnt))) { printc("conn_mgr: write failed w/ %d on fd %d\n", ret, to); goto close; } } done: cos_argreg_free(buf); return; close: net_close(cos_spd_id(), from); trelease(cos_spd_id(), to); tor_del_pair(from, to); if (tc->feid) cvect_del(&evts, tc->feid); if (tc->teid) cvect_del(&evts, tc->teid); goto done; }