X-Git-Url: http://git.madism.org/?a=blobdiff_plain;f=common%2Fserver.c;h=838e9f74c3df42a2728151d08d393027c3370459;hb=840ef69e66dd78da380501ae93fac2230283ad53;hp=5a9e081c8ad3617b6aae817daa9988b119a8d80a;hpb=521bf8a6290d26b27c332639fe8cc4e47c3d5c4f;p=apps%2Fpfixtools.git diff --git a/common/server.c b/common/server.c index 5a9e081..838e9f7 100644 --- a/common/server.c +++ b/common/server.c @@ -44,27 +44,20 @@ static server_t* server_new(void) { server_t* server = p_new(server_t, 1); server->fd = -1; - server->fd2 = -1; return server; } static void server_wipe(server_t *server) { - server->listener = server->event = false; - if (server->fd > 0) { - epoll_modify(server->fd, 0, NULL); + server->listener = false; + if (server->fd >= 0) { + epoll_unregister(server->fd); close(server->fd); server->fd = -1; } - if (server->fd2 > 0) { - close(server->fd2); - server->fd2 = -1; - } if (server->data && server->clear_data) { server->clear_data(&server->data); } - array_shrink(server->ibuf, 512); - array_shrink(server->obuf, 512); } static void server_delete(server_t **server) @@ -86,7 +79,7 @@ static server_t* server_acquire(void) } } -static void server_release(server_t *server) +void server_release(server_t *server) { server_wipe(server); array_add(server_pool, server); @@ -94,6 +87,7 @@ static void server_release(server_t *server) static void server_shutdown(void) { + printf("Server shutdown"); array_deep_wipe(listeners, server_delete); array_deep_wipe(server_pool, server_delete); } @@ -128,6 +122,7 @@ int start_server(int port, start_listener_t starter, delete_client_t deleter) tmp->fd = sock; tmp->listener = true; tmp->data = data; + tmp->run = NULL; tmp->clear_data = deleter; epoll_register(sock, EPOLLIN, tmp); array_add(listeners, tmp); @@ -135,7 +130,7 @@ int start_server(int port, start_listener_t starter, delete_client_t deleter) } static int start_client(server_t *server, start_client_t starter, - delete_client_t deleter) + run_client_t runner, delete_client_t deleter) { server_t *tmp; void* data = NULL; @@ -156,60 +151,34 @@ static int start_client(server_t *server, start_client_t starter, } tmp = server_acquire(); + tmp->listener = false; tmp->fd = sock; tmp->data = data; + tmp->run = runner; tmp->clear_data = deleter; epoll_register(sock, EPOLLIN, tmp); return 0; } -event_t event_register(void *data) +server_t *server_register(int fd, run_client_t runner, void *data) { - int fds[2]; - if (pipe(fds) != 0) { - UNIXERR("pipe"); - return NULL; - } - if (setnonblock(fds[0]) != 0) { - close(fds[0]); - close(fds[1]); + if (fd < 0) { return NULL; } - server_t *tmp = server_acquire(); - tmp->event = true; - tmp->fd = fds[0]; - tmp->fd2 = fds[1]; - tmp->data = data; - epoll_register(fds[0], EPOLLIN, tmp); + server_t *tmp = server_acquire(); + tmp->listener = false; + tmp->fd = fd; + tmp->data = data; + tmp->run = runner; + tmp->clear_data = NULL; + epoll_register(fd, EPOLLIN, tmp); return tmp; } -bool event_fire(event_t event) -{ - static const char *data = ""; - return write(event->fd2, data, 1) == 0; -} - -static bool event_cancel(event_t event) -{ - char buff[32]; - while (true) { - ssize_t res = read(event->fd, buff, 32); - if (res == -1 && errno != EAGAIN && errno != EINTR) { - UNIXERR("read"); - return false; - } else if (res == -1 && errno == EINTR) { - continue; - } else if (res != 32) { - return true; - } - } -} - int server_loop(start_client_t starter, delete_client_t deleter, - run_client_t runner, event_handler_t handler, - refresh_t refresh, void* config) { + run_client_t runner, refresh_t refresh, void* config) +{ info("entering processing loop"); while (!sigint) { struct epoll_event evts[1024]; @@ -238,28 +207,10 @@ int server_loop(start_client_t starter, delete_client_t deleter, server_t *d = evts[n].data.ptr; if (d->listener) { - (void)start_client(d, starter, deleter); - continue; - } else if (d->event) { - if (!event_cancel(d)) { - server_release(d); - continue; - } - if (handler) { - if (!handler(d, config)) { - server_release(d); - } - } + (void)start_client(d, starter, runner, deleter); continue; } - if (evts[n].events & EPOLLIN) { - if (runner(d, config) < 0) { - server_release(d); - continue; - } - } - if ((evts[n].events & EPOLLOUT) && d->obuf.len) { if (buffer_write(&d->obuf, d->fd) < 0) { server_release(d); @@ -269,6 +220,13 @@ int server_loop(start_client_t starter, delete_client_t deleter, epoll_modify(d->fd, EPOLLIN, d); } } + + if (evts[n].events & EPOLLIN) { + if (d->run(d, config) < 0) { + server_release(d); + } + continue; + } } } info("exit requested");