From: Fam Zheng <famz@redhat.com>
To: qemu-devel@nongnu.org
Cc: Kevin Wolf <kwolf@redhat.com>, Jason Wang <jasowang@redhat.com>,
Vincenzo Maffione <v.maffione@gmail.com>,
Stefan Hajnoczi <stefanha@redhat.com>,
Paolo Bonzini <pbonzini@redhat.com>,
Giuseppe Lettieri <g.lettieri@iet.unipi.it>,
Luigi Rizzo <rizzo@iet.unipi.it>
Subject: [Qemu-devel] [PATCH v4 02/13] qemu-nbd: Switch to qemu_set_fd_handler
Date: Thu, 4 Jun 2015 14:45:13 +0800 [thread overview]
Message-ID: <1433400324-7358-3-git-send-email-famz@redhat.com> (raw)
In-Reply-To: <1433400324-7358-1-git-send-email-famz@redhat.com>
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 <famz@redhat.com>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
---
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 */
--
2.4.2
next prev parent reply other threads:[~2015-06-04 6:45 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-06-04 6:45 [Qemu-devel] [PATCH v4 00/13] main-loop: Get rid of fd_read_poll and qemu_set_fd_handler2 Fam Zheng
2015-06-04 6:45 ` [Qemu-devel] [PATCH v4 01/13] stubs: Add qemu_set_fd_handler Fam Zheng
2015-06-04 6:45 ` Fam Zheng [this message]
2015-06-04 6:45 ` [Qemu-devel] [PATCH v4 03/13] l2tpv3: Drop l2tpv3_can_send Fam Zheng
2015-06-04 6:45 ` [Qemu-devel] [PATCH v4 04/13] netmap: Drop netmap_can_send Fam Zheng
2015-06-04 6:45 ` [Qemu-devel] [PATCH v4 05/13] net/socket: Drop net_socket_can_send Fam Zheng
2015-06-04 6:45 ` [Qemu-devel] [PATCH v4 06/13] tap: Drop tap_can_send Fam Zheng
2015-06-04 6:45 ` [Qemu-devel] [PATCH v4 07/13] Change qemu_set_fd_handler2(..., NULL, ...) to qemu_set_fd_handler Fam Zheng
2015-06-04 6:45 ` [Qemu-devel] [PATCH v4 08/13] main-loop: Drop qemu_set_fd_handler2 Fam Zheng
2015-06-04 6:45 ` [Qemu-devel] [PATCH v4 09/13] alsaaudio: Remove unused error handling of qemu_set_fd_handler Fam Zheng
2015-06-04 6:45 ` [Qemu-devel] [PATCH v4 10/13] oss: " Fam Zheng
2015-06-04 6:45 ` [Qemu-devel] [PATCH v4 11/13] xen_backend: " Fam Zheng
2015-06-04 6:45 ` [Qemu-devel] [PATCH v4 12/13] event-notifier: Always return 0 for posix implementation Fam Zheng
2015-06-04 6:45 ` [Qemu-devel] [PATCH v4 13/13] iohandler: Change return type of qemu_set_fd_handler to "void" Fam Zheng
2015-06-05 13:45 ` [Qemu-devel] [PATCH v4 00/13] main-loop: Get rid of fd_read_poll and qemu_set_fd_handler2 Stefan Hajnoczi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1433400324-7358-3-git-send-email-famz@redhat.com \
--to=famz@redhat.com \
--cc=g.lettieri@iet.unipi.it \
--cc=jasowang@redhat.com \
--cc=kwolf@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=rizzo@iet.unipi.it \
--cc=stefanha@redhat.com \
--cc=v.maffione@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).