static void accept_cb(struct ev_loop *loop, ev_uinet *w, int revents) { struct passive_context *passive = w->data; struct uinet_socket *newso = NULL; struct uinet_socket *newpeerso = NULL; struct connection_context *conn = NULL; struct connection_context *peerconn = NULL; int error; int batch_limit = 32; int processed = 0; while ((processed < batch_limit) && (UINET_EWOULDBLOCK != (error = uinet_soaccept(w->so, NULL, &newso)))) { processed++; if (0 == error) { newpeerso = NULL; conn = NULL; peerconn = NULL; if (passive->verbose) printf("accept succeeded\n"); conn = create_conn(passive, newso, 1); if (NULL == conn) goto fail; newpeerso = uinet_sogetpassivepeer(newso); peerconn = create_conn(passive, newpeerso, 0); if (NULL == peerconn) goto fail; conn->peer = peerconn; peerconn->peer = conn; ev_uinet_start(loop, &conn->watcher); if (!passive->extract) ev_uinet_start(loop, &peerconn->watcher); passive->interface->num_sockets += 2; continue; fail: if (conn) destroy_conn(conn); if (newso) uinet_soclose(newso); if (newpeerso) uinet_soclose(newpeerso); } } if (processed > passive->interface->max_accept_batch) passive->interface->max_accept_batch = processed; }
static void passive_accept_cb(struct ev_loop *loop, ev_uinet *w, int revents) { struct uinet_demo_passive *passive = w->data; struct uinet_socket *newso = NULL; struct uinet_socket *newpeerso = NULL; struct passive_connection *conn = NULL; struct passive_connection *peerconn = NULL; int error; unsigned int batch_limit = 32; unsigned int processed = 0; while ((processed < batch_limit) && (UINET_EWOULDBLOCK != (error = uinet_soaccept(w->so, NULL, &newso)))) { processed++; if (0 == error) { newpeerso = NULL; conn = NULL; peerconn = NULL; if (passive->cfg.verbose) printf("%s: Accept succeeded\n", passive->cfg.name); conn = create_conn(passive, newso, 1); if (NULL == conn) { printf("%s: Failed to alloc new connection context\n", passive->cfg.name); goto fail; } newpeerso = uinet_sogetpassivepeer(newso); peerconn = create_conn(passive, newpeerso, 0); if (NULL == peerconn) { printf("%s: Failed to alloc new peer connection context\n", passive->cfg.name); goto fail; } conn->peer = peerconn; peerconn->peer = conn; ev_uinet_start(loop, &conn->watcher); ev_uinet_start(loop, &peerconn->watcher); if (conn->verbose || (passive->cfg.copy_mode & UINET_IP_COPY_MODE_MAYBE)) ev_uinet_start(loop, &conn->connected_watcher); if (peerconn->verbose || (passive->cfg.copy_mode & UINET_IP_COPY_MODE_MAYBE)) ev_uinet_start(loop, &peerconn->connected_watcher); passive->num_sockets += 2; continue; fail: if (conn) destroy_conn(conn); if (newso) uinet_soclose(newso); if (newpeerso) uinet_soclose(newpeerso); } } if (processed > passive->max_accept_batch) passive->max_accept_batch = processed; }