diff options
author | Gerd Hoffmann <kraxel@redhat.com> | 2010-03-29 11:10:51 +0200 |
---|---|---|
committer | Gerd Hoffmann <kraxel@redhat.com> | 2010-05-19 11:22:06 +0200 |
commit | 1a69ea662719b607546375b1b18683914ec6af33 (patch) | |
tree | e7f9279e3e1662216f4d1239d706b0231f79117c | |
parent | d1ab29c1af10c810ac0718a11188029e92be0cbe (diff) | |
download | spice-1a69ea662719b607546375b1b18683914ec6af33.tar.gz spice-1a69ea662719b607546375b1b18683914ec6af33.tar.xz spice-1a69ea662719b607546375b1b18683914ec6af33.zip |
new watch api: switch liasync read
-rw-r--r-- | server/reds.c | 24 | ||||
-rw-r--r-- | server/reds.h | 1 |
2 files changed, 12 insertions, 13 deletions
diff --git a/server/reds.c b/server/reds.c index 8ce07a0a..80f5fca6 100644 --- a/server/reds.c +++ b/server/reds.c @@ -298,7 +298,6 @@ typedef struct AsyncRead { void *opaque; uint8_t *now; uint8_t *end; - int active_file_handlers; void (*done)(void *opaque); void (*error)(void *opaque, int err); } AsyncRead; @@ -2549,14 +2548,14 @@ static void reds_handle_ticket(void *opaque) static inline void async_read_clear_handlers(AsyncRead *obj) { - if (!obj->active_file_handlers) { + if (!obj->peer->watch) { return; } - obj->active_file_handlers = FALSE; - core->set_file_handlers(core, obj->peer->socket, NULL, NULL, NULL); + core->watch_remove(obj->peer->watch); + obj->peer->watch = NULL; } -static void async_read_handler(void *data) +static void async_read_handler(int fd, int event, void *data) { AsyncRead *obj = (AsyncRead *)data; @@ -2568,10 +2567,10 @@ static void async_read_handler(void *data) if (n < 0) { switch (errno) { case EAGAIN: - if (!obj->active_file_handlers) { - obj->active_file_handlers = TRUE; - core->set_file_handlers(core, obj->peer->socket, async_read_handler, NULL, - obj); + if (!obj->peer->watch) { + obj->peer->watch = core->watch_add(obj->peer->socket, + SPICE_WATCH_EVENT_READ, + async_read_handler, obj); } return; case EINTR: @@ -2640,7 +2639,7 @@ static void reds_handle_read_link_done(void *opaque) obj->now = (uint8_t *)&link->tiTicketing.encrypted_ticket.encrypted_data; obj->end = obj->now + link->tiTicketing.rsa_size; obj->done = reds_handle_ticket; - async_read_handler(&link->asyc_read); + async_read_handler(0, 0, &link->asyc_read); } static void reds_handle_link_error(void *opaque, int err) @@ -2693,7 +2692,7 @@ static void reds_handle_read_header_done(void *opaque) obj->now = (uint8_t *)link->link_mess; obj->end = obj->now + header->size; obj->done = reds_handle_read_link_done; - async_read_handler(&link->asyc_read); + async_read_handler(0, 0, &link->asyc_read); } static void reds_handle_new_link(RedLinkInfo *link) @@ -2703,10 +2702,9 @@ static void reds_handle_new_link(RedLinkInfo *link) obj->peer = link->peer; obj->now = (uint8_t *)&link->link_header; obj->end = (uint8_t *)((SpiceLinkHeader *)&link->link_header + 1); - obj->active_file_handlers = FALSE; obj->done = reds_handle_read_header_done; obj->error = reds_handle_link_error; - async_read_handler(&link->asyc_read); + async_read_handler(0, 0, &link->asyc_read); } static void reds_handle_ssl_accept(void *data) diff --git a/server/reds.h b/server/reds.h index a4c9f89c..60eef4a5 100644 --- a/server/reds.h +++ b/server/reds.h @@ -28,6 +28,7 @@ typedef struct RedsStreamContext { void *ctx; int socket; + SpiceWatch *watch; /* set it to TRUE if you shutdown the socket. shutdown read doesn't work as accepted - receive may return data afterwards. check the flag before calling receive*/ |