[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v4 02/13] qemu-nbd: Switch to qemu_set_fd_handler
From: |
Fam Zheng |
Subject: |
[Qemu-devel] [PATCH v4 02/13] qemu-nbd: Switch to qemu_set_fd_handler |
Date: |
Thu, 4 Jun 2015 14:45:13 +0800 |
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 <address@hidden>
Reviewed-by: Paolo Bonzini <address@hidden>
---
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
- [Qemu-devel] [PATCH v4 00/13] main-loop: Get rid of fd_read_poll and qemu_set_fd_handler2, Fam Zheng, 2015/06/04
- [Qemu-devel] [PATCH v4 01/13] stubs: Add qemu_set_fd_handler, Fam Zheng, 2015/06/04
- [Qemu-devel] [PATCH v4 02/13] qemu-nbd: Switch to qemu_set_fd_handler,
Fam Zheng <=
- [Qemu-devel] [PATCH v4 03/13] l2tpv3: Drop l2tpv3_can_send, Fam Zheng, 2015/06/04
- [Qemu-devel] [PATCH v4 04/13] netmap: Drop netmap_can_send, Fam Zheng, 2015/06/04
- [Qemu-devel] [PATCH v4 05/13] net/socket: Drop net_socket_can_send, Fam Zheng, 2015/06/04
- [Qemu-devel] [PATCH v4 06/13] tap: Drop tap_can_send, Fam Zheng, 2015/06/04
- [Qemu-devel] [PATCH v4 07/13] Change qemu_set_fd_handler2(..., NULL, ...) to qemu_set_fd_handler, Fam Zheng, 2015/06/04
- [Qemu-devel] [PATCH v4 08/13] main-loop: Drop qemu_set_fd_handler2, Fam Zheng, 2015/06/04
- [Qemu-devel] [PATCH v4 09/13] alsaaudio: Remove unused error handling of qemu_set_fd_handler, Fam Zheng, 2015/06/04
- [Qemu-devel] [PATCH v4 10/13] oss: Remove unused error handling of qemu_set_fd_handler, Fam Zheng, 2015/06/04
- [Qemu-devel] [PATCH v4 11/13] xen_backend: Remove unused error handling of qemu_set_fd_handler, Fam Zheng, 2015/06/04
- [Qemu-devel] [PATCH v4 12/13] event-notifier: Always return 0 for posix implementation, Fam Zheng, 2015/06/04