/* in this implementation, mylisten() is assumed to follow mybind() */ int mylisten(mysocket_t sd, int backlog) { mysock_context_t *ctx = _mysock_get_context(sd); assert(ctx->bound); MYSOCK_CHECK(ctx != NULL, EBADF); MYSOCK_CHECK(ctx->bound, EINVAL); /* set up the socket for demultiplexing */ ctx->listening = TRUE; _mysock_set_backlog(ctx, backlog); if (_network_listen(&ctx->network_state, backlog) < 0) return -1; /* since we don't spawn an STCP worker thread for passive sockets * (there's no transport layer related work to do, so * _mysock_transport_init() is never called for such sockets), we * begin receiving network packets here... */ if (_network_start_recv_thread(ctx) < 0) { assert(0); return -1; } return 0; }
/* initiate a new STCP connection; called by myconnect() and myaccept() */ void _mysock_transport_init(mysocket_t sd, bool_t is_active) { mysock_context_t *connection_context = _mysock_get_context(sd); assert(!connection_context->listening); connection_context->is_active = is_active; /* start a new network thread; this handles incoming data, passing it * up to the transport layer. (the network input is threaded so we can * keep track of timeouts/when data arrives, in a portable manner * independent of the underlying network I/O functionality). */ if (_network_start_recv_thread(connection_context) < 0) { assert(0); abort(); } /* start a new transport layer thread */ connection_context->transport_thread = _mysock_create_thread( transport_thread_func, connection_context, FALSE); connection_context->transport_thread_started = TRUE; }