kore

An easy to use, scalable and secure web application framework for writing web APIs in C.
Commits | Files | Refs | README | LICENSE | git clone https://git.kore.io/kore.git

commit 541870c10aa766cde4af6b1efff11c39e43b9ab2
parent c6ca68f3f258bd76460f703b9ad7165138c6d434
Author: Joris Vink <joris@coders.se>
Date:   Wed, 22 Feb 2017 18:30:50 +0100

Improve keymgr_await_data().

Before this function would block client I/O and existing HTTP requests
until the keymgr process responsed with a result.

This commit changes that behaviour and makes this function call
the http_process() function if we end up waiting for the keymgr.

This means that while waiting for a response we at least start
making headway with existing HTTP requests if the response is
not immediate.

Diffstat:
src/domain.c | 42++++++++++++++++++++++++++++++++++++++----
1 file changed, 38 insertions(+), 4 deletions(-)

diff --git a/src/domain.c b/src/domain.c @@ -29,6 +29,10 @@ #include "kore.h" +#if !defined(KORE_NO_HTTP) +#include "http.h" +#endif + #define SSL_SESSION_ID "kore_ssl_sessionid" struct kore_domain_h domains; @@ -553,6 +557,9 @@ keymgr_await_data(void) int ret; struct pollfd pfd[1]; u_int64_t start, cur; +#if !defined(KORE_NO_HTTP) + int process_requests; +#endif /* * We need to wait until the keymgr responds to us, so keep doing @@ -562,10 +569,15 @@ keymgr_await_data(void) * This means other internal messages can still be delivered by * this worker process to the appropriate callbacks but we do not * drop out until we've either received an answer from the keymgr - * or until the timeout has been reached. + * or until the timeout has been reached (1 second currently). * - * It will however block any other I/O and request handling on - * this worker until either of the above criteria is met. + * If we end up waiting for the keymgr process we will call + * http_process (if not built with NOHTTP=1) to further existing + * requests so those do not block too much. + * + * This means that all incoming data will stop being processed + * while existing requests will get processed until we return + * from this call. */ start = kore_time_ms(); kore_platform_disable_read(worker->msg[1]->fd); @@ -573,7 +585,17 @@ keymgr_await_data(void) keymgr_response = 0; memset(keymgr_buf, 0, sizeof(keymgr_buf)); +#if !defined(KORE_NO_HTTP) + process_requests = 0; +#endif + for (;;) { +#if !defined(KORE_NO_HTTP) + if (process_requests) { + http_process(); + process_requests = 0; + } +#endif pfd[0].fd = worker->msg[1]->fd; pfd[0].events = POLLIN; pfd[0].revents = 0; @@ -589,8 +611,13 @@ keymgr_await_data(void) if ((cur - start) > 1000) break; - if (ret == 0) + if (ret == 0) { +#if !defined(KORE_NO_HTTP) + /* No activity on channel, process HTTP requests. */ + process_requests = 1; +#endif continue; + } if (pfd[0].revents & (POLLERR | POLLHUP)) break; @@ -603,6 +630,13 @@ keymgr_await_data(void) if (keymgr_response) break; + +#if !defined(KORE_NO_HTTP) + /* If we've spent 100ms already, process HTTP requests. */ + if ((cur - start) > 100) { + process_requests = 1; + } +#endif } }