summaryrefslogtreecommitdiff
path: root/common/src
diff options
context:
space:
mode:
Diffstat (limited to 'common/src')
-rw-r--r--common/src/http_healthcheck.cpp64
1 files changed, 57 insertions, 7 deletions
diff --git a/common/src/http_healthcheck.cpp b/common/src/http_healthcheck.cpp
index 30d1fd5..f36d59f 100644
--- a/common/src/http_healthcheck.cpp
+++ b/common/src/http_healthcheck.cpp
@@ -12,6 +12,8 @@ struct http_status_ctx
{
pthread_t pthread;
struct event_base *base;
+ struct event *ev;
+ struct evhttp *http;
unsigned int enable;
unsigned int port;
@@ -25,19 +27,67 @@ static void http_callback(struct evhttp_request *req, void *arg)
evhttp_send_reply(req, HTTP_OK, "", NULL);
}
+static void gc_callback(evutil_socket_t fd, short what, void *arg)
+{
+ // do nothing
+
+ // add gc_callback to avoid event_base_dispatch blocking, handle event_base_loopbreak inmediately
+}
+
static void *http_healthcheck_thread(void *arg)
{
- printf("http_healthcheck_thread running (%s:%d/%s)\n", g_ctx.addr, g_ctx.port, g_ctx.path);
+ struct timeval gc_delay = {0, 500 * 1000}; // Microseconds, we set 500 miliseconds here.
+ printf("[http_healthcheck_thread]: running (listen: %s:%d path: %s)\n", g_ctx.addr, g_ctx.port, g_ctx.path);
g_ctx.base = event_base_new();
- struct evhttp *http = evhttp_new(g_ctx.base);
- evhttp_set_cb(http, g_ctx.path, http_callback, NULL);
- evhttp_bind_socket(http, g_ctx.addr, g_ctx.port);
+ if (g_ctx.base == NULL)
+ {
+ printf("[http_healthcheck_thread]: event_base_new failed\n");
+ goto end;
+ }
+
+ g_ctx.ev = event_new(g_ctx.base, -1, EV_PERSIST, gc_callback, NULL);
+ if (g_ctx.ev == NULL)
+ {
+ printf("[http_healthcheck_thread]: event_new failed\n");
+ goto end;
+ }
+
+ if (evtimer_add(g_ctx.ev, &gc_delay) < 0)
+ {
+ printf("[http_healthcheck_thread]: evtimer_add failed\n");
+ goto end;
+ }
+
+ g_ctx.http = evhttp_new(g_ctx.base);
+ if (evhttp_set_cb(g_ctx.http, g_ctx.path, http_callback, NULL) < 0)
+ {
+ printf("[http_healthcheck_thread]: evhttp_set_cb failed\n");
+ goto end;
+ }
+
+ if (evhttp_bind_socket(g_ctx.http, g_ctx.addr, g_ctx.port) < 0)
+ {
+ printf("[http_healthcheck_thread]: evhttp_bind_socket failed\n");
+ goto end;
+ }
event_base_dispatch(g_ctx.base);
- evhttp_free(http);
- event_base_free(g_ctx.base);
- printf("http_healthcheck_thread exit\n");
+end:
+ if (g_ctx.http)
+ {
+ evhttp_free(g_ctx.http);
+ }
+ if (g_ctx.ev)
+ {
+ event_free(g_ctx.ev);
+ }
+ if (g_ctx.base)
+ {
+ event_base_free(g_ctx.base);
+ }
+
+ printf("[http_healthcheck_thread]: exit\n");
return NULL;
}