From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:46208) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YnPQo-00027d-J1 for qemu-devel@nongnu.org; Wed, 29 Apr 2015 06:41:31 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YnPQi-0006Ng-P2 for qemu-devel@nongnu.org; Wed, 29 Apr 2015 06:41:30 -0400 Received: from mx1.redhat.com ([209.132.183.28]:38230) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YnPQi-0006IX-Gv for qemu-devel@nongnu.org; Wed, 29 Apr 2015 06:41:24 -0400 Message-ID: <5540B546.4040305@redhat.com> Date: Wed, 29 Apr 2015 12:41:10 +0200 From: Paolo Bonzini MIME-Version: 1.0 References: <1430303875-31647-1-git-send-email-famz@redhat.com> <1430303875-31647-3-git-send-email-famz@redhat.com> In-Reply-To: <1430303875-31647-3-git-send-email-famz@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [RFC PATCH 2/8] qemu-nbd: Switch to qemu_set_fd_handler List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Fam Zheng , qemu-devel@nongnu.org Cc: Kevin Wolf , Jason Wang , Vincenzo Maffione , Stefan Hajnoczi , Giuseppe Lettieri , Luigi Rizzo On 29/04/2015 12:37, Fam Zheng wrote: > Achieved by: > > - Remembering the server fd with a global variable, in order to access > it from nbd_client_closed. > > - Checking nbd_can_accept() and updating server_fd handler whenever > client connects or disconnects. > > Signed-off-by: Fam Zheng > --- > qemu-nbd.c | 21 +++++++++++++++++---- > 1 file changed, 17 insertions(+), 4 deletions(-) > > diff --git a/qemu-nbd.c b/qemu-nbd.c > index 7e690ff..5af6d11 100644 > --- a/qemu-nbd.c > +++ b/qemu-nbd.c > @@ -53,6 +53,7 @@ static int persistent = 0; > static enum { RUNNING, TERMINATE, TERMINATING, TERMINATED } state; > static int shared = 1; > static int nb_fds; > +static int server_fd; > > static void usage(const char *name) > { > @@ -340,7 +341,7 @@ out: > return (void *) EXIT_FAILURE; > } > > -static int nbd_can_accept(void *opaque) > +static int nbd_can_accept(void) > { > return nb_fds < shared; > } > @@ -351,19 +352,21 @@ static void nbd_export_closed(NBDExport *exp) > state = TERMINATED; > } > > +static void nbd_update_server_fd_handler(int fd); > + > static void nbd_client_closed(NBDClient *client) > { > nb_fds--; > if (nb_fds == 0 && !persistent && state == RUNNING) { > state = TERMINATE; > } > + nbd_update_server_fd_handler(server_fd); > qemu_notify_event(); > nbd_client_put(client); > } > > static void nbd_accept(void *opaque) > { > - int server_fd = (uintptr_t) opaque; > struct sockaddr_in addr; > socklen_t addr_len = sizeof(addr); > > @@ -380,12 +383,22 @@ static void nbd_accept(void *opaque) > > if (nbd_client_new(exp, fd, nbd_client_closed)) { > nb_fds++; > + nbd_update_server_fd_handler(server_fd); > } else { > shutdown(fd, 2); > close(fd); > } > } > > +static void nbd_update_server_fd_handler(int fd) > +{ > + if (nbd_can_accept()) { > + qemu_set_fd_handler(fd, nbd_accept, NULL, (void *)(uintptr_t)fd); > + } else { > + qemu_set_fd_handler(fd, NULL, NULL, NULL); > + } > +} > + > int main(int argc, char **argv) > { > BlockBackend *blk; > @@ -761,8 +774,8 @@ int main(int argc, char **argv) > memset(&client_thread, 0, sizeof(client_thread)); > } > > - qemu_set_fd_handler2(fd, nbd_can_accept, nbd_accept, NULL, > - (void *)(uintptr_t)fd); > + server_fd = fd; > + nbd_update_server_fd_handler(fd); > > /* now when the initialization is (almost) complete, chdir("/") > * to free any busy filesystems */ > Reviewed-by: Paolo Bonzini