From d74fad98ca037a539de873a92c033d3d0364fca7 Mon Sep 17 00:00:00 2001 From: "Neal H. Walfield" Date: Tue, 17 May 2005 10:31:09 +0100 Subject: pflocal: Handle non-blocking connect with no pending acceptors. * pflocal/connq.h (struct connq_request): Remove forward. (connq_listen): Wait for a request to be queued not until there is a connection attempt. Remove REQ parameter. Update callers. (connq_request_complete): Remove declaration. (connq_connect): Wait for a slot to queue a request not until there is an acceptor. Remove SOCK parameter. Update callers. (connq_connect_complete): New declaration. (connq_connect_cancel): New declaration. * pflocal/connq.c (struct connq): Remove fields noqueue, queue, length, head and tail. Add fields head, tail, count, max, connectors and num_connectors. That is, replace the circular buffer with a singly linked list. (qnext): Remove function. (struct connq_request): Remove field signal, lock, completed and err. Add field next. (connq_request_init): Rewrite according to new semantics. (connq_request_enqueue): New function. (connq_request_dequeue): New function. (connq_create): Update according to new semantics. (connq_destroy): Likewise. (connq_listen): Rewrite to not block until there is a connector but until there is a request in the queue. (connq_request_complete): Remove function. (connq_connect): Rewrite to not block until there is an acceptor but until there is space for a request. (connq_connect_complete): New function. (connq_connect_cancel): New function. (connq_compress): Remove dead code. (connq_set_length): Rewrite. * pflocal/socket.c (S_socket_connect): Create the server socket here... (S_socket_accept): ... not here. --- pflocal/io.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'pflocal/io.c') diff --git a/pflocal/io.c b/pflocal/io.c index 36221a66..b2ae7593 100644 --- a/pflocal/io.c +++ b/pflocal/io.c @@ -1,6 +1,6 @@ /* Socket I/O operations - Copyright (C) 1995, 1996, 1998, 1999, 2000, 2002, 2007 + Copyright (C) 1995, 1996, 1998, 1999, 2000, 2002, 2007, 2012 Free Software Foundation, Inc. Written by Miles Bader @@ -199,16 +199,16 @@ S_io_select (struct sock_user *user, if (*select_type & SELECT_READ) { - /* Wait for a connect. Passing in NULL for REQ means that the - request won't be dequeued. */ - if (connq_listen (sock->listen_queue, 1, NULL, NULL) == 0) + /* Wait for a connect. Passing in NULL for SOCK means that + the request won't be dequeued. */ + if (connq_listen (sock->listen_queue, 1, NULL) == 0) /* We can satisfy this request immediately. */ return 0; else /* Gotta wait... */ { ports_interrupt_self_on_port_death (user, reply); - return connq_listen (sock->listen_queue, 0, NULL, NULL); + return connq_listen (sock->listen_queue, 0, NULL); } } } -- cgit v1.2.3