static void update_sofar(struct perf *p) { struct timeval current; ASSERT(!gettimeofday(¤t, NULL)); p->sofar += (double) tv_subtract(¤t, &p->start, 600) / 1000000.0; tv_clear(&p->start); }
static int multi_tcp_wait_lite(struct multi_context *m, struct multi_instance *mi, const int action, bool *tun_input_pending) { struct context *c = multi_tcp_context(m, mi); unsigned int looking_for = 0; dmsg(D_MULTI_DEBUG, "MULTI TCP: multi_tcp_wait_lite a=%s mi=" ptr_format, pract(action), (ptr_type)mi); tv_clear(&c->c2.timeval); /* ZERO-TIMEOUT */ switch (action) { case TA_TUN_READ: looking_for = TUN_READ; tun_input_pending = NULL; io_wait(c, IOW_READ_TUN); break; case TA_SOCKET_READ: looking_for = SOCKET_READ; tun_input_pending = NULL; io_wait(c, IOW_READ_LINK); break; case TA_TUN_WRITE: looking_for = TUN_WRITE; tun_input_pending = NULL; c->c2.timeval.tv_sec = 1; /* For some reason, the Linux 2.2 TUN/TAP driver hits this timeout */ perf_push(PERF_PROC_OUT_TUN_MTCP); io_wait(c, IOW_TO_TUN); perf_pop(); break; case TA_SOCKET_WRITE: looking_for = SOCKET_WRITE; io_wait(c, IOW_TO_LINK|IOW_READ_TUN_FORCE); break; default: msg(M_FATAL, "MULTI TCP: multi_tcp_wait_lite, unhandled action=%d", action); } if (tun_input_pending && (c->c2.event_set_status & TUN_READ)) { *tun_input_pending = true; } if (c->c2.event_set_status & looking_for) { return action; } else { switch (action) { /* TCP socket output buffer is full */ case TA_SOCKET_WRITE: return TA_SOCKET_WRITE_DEFERRED; /* TUN device timed out on accepting write */ case TA_TUN_WRITE: return TA_TUN_WRITE_TIMEOUT; } return TA_UNDEF; } }