From 9c3b6177808fe4ab57208e4612f38c5ca7c8ecb2 Mon Sep 17 00:00:00 2001 From: Antti Ajanki Date: Tue, 6 Aug 2013 10:32:17 +0300 Subject: Avoid waiting for the timeout on mainmenu --- src/libwebvi/pipecomponent.c | 48 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/libwebvi/pipecomponent.c b/src/libwebvi/pipecomponent.c index a0743da..34e7634 100644 --- a/src/libwebvi/pipecomponent.c +++ b/src/libwebvi/pipecomponent.c @@ -46,6 +46,7 @@ struct PipeCallbackWrapper { struct PipeMainMenuDownloader { PipeComponent pipe_data; + int kickstart_fd; const WebviContext *context; /* borrowed reference */ }; @@ -85,6 +86,13 @@ static void pipe_downloader_finished(PipeComponent *instance, RequestState state static void pipe_downloader_delete(PipeComponent *instance); static size_t curl_write_wrapper(char *ptr, size_t size, size_t nmemb, void *userdata); +static void pipe_mainmenu_downloader_fdset(PipeComponent *instance, + fd_set *readfd, + fd_set *writefd, + fd_set *excfd, + int *maxfd); +static gboolean pipe_mainmenu_downloader_handle_socket(PipeComponent *instance, + int fd, int bitmask); static void pipe_mainmenu_downloader_delete(PipeComponent *instance); static void pipe_local_file_fdset(PipeComponent *instance, fd_set *readfd, @@ -314,9 +322,12 @@ void pipe_downloader_delete(PipeComponent *instance) { PipeMainMenuDownloader *pipe_mainmenu_downloader_create(WebviContext *context) { - INITIALIZE_PIPE(PipeMainMenuDownloader, NULL, NULL, - pipe_mainmenu_downloader_delete); + INITIALIZE_PIPE_WITH_FDSET(PipeMainMenuDownloader, NULL, NULL, + pipe_mainmenu_downloader_delete, + pipe_mainmenu_downloader_fdset, + pipe_mainmenu_downloader_handle_socket); self->context = context; + self->kickstart_fd = -1; return self; } @@ -330,11 +341,44 @@ void pipe_mainmenu_downloader_start(PipeMainMenuDownloader *self) { pipe_component_append(&self->pipe_data, mainmenu, strlen(mainmenu)); pipe_component_finished(&self->pipe_data, WEBVISTATE_FINISHED_OK); + /* To kickstart downloading, create a fake read event for the client + * so that select returns immediately instead of waiting until the + * timeout. */ + int pipefd[2]; + if (pipe(pipefd) != -1) { + write(pipefd[1], "*", 1); + close(pipefd[1]); + self->kickstart_fd = pipefd[0]; + } + g_free(mainmenu); } +void pipe_mainmenu_downloader_fdset(PipeComponent *instance, fd_set *readfd, + fd_set *writefd, fd_set *excfd, int *maxfd) +{ + PipeMainMenuDownloader *self = (PipeMainMenuDownloader *)instance; + append_to_fdset(self->kickstart_fd, readfd, maxfd); +} + +gboolean pipe_mainmenu_downloader_handle_socket(PipeComponent *instance, + int fd, int bitmask) +{ + PipeMainMenuDownloader *self = (PipeMainMenuDownloader *)instance; + char buf; + if (self->kickstart_fd != -1) { + read(self->kickstart_fd, &buf, 1); + close(self->kickstart_fd); + self->kickstart_fd = -1; + } + return TRUE; +} + void pipe_mainmenu_downloader_delete(PipeComponent *instance) { PipeMainMenuDownloader *self = (PipeMainMenuDownloader *)instance; + if (self->kickstart_fd != -1) { + close(self->kickstart_fd); + } free(self); } -- cgit v1.2.3