libuv create 1Hz background timeout check
Signed-off-by: Andy Green <andy.green@linaro.org>
diff --git a/lib/context.c b/lib/context.c
index 4ed0382..2574f22 100644
--- a/lib/context.c
+++ b/lib/context.c
@@ -162,6 +162,8 @@
return NULL;
}
+ context->pt[n].context = context;
+ context->pt[n].tid = n;
context->pt[n].http_header_data = lws_malloc(context->max_http_header_data *
context->max_http_header_pool);
if (!context->pt[n].http_header_data)
diff --git a/lib/libuv.c b/lib/libuv.c
index a9998df..ac1ab6d 100644
--- a/lib/libuv.c
+++ b/lib/libuv.c
@@ -74,6 +74,17 @@
return 0;
}
+static void
+lws_uv_timeout_cb(uv_timer_t *timer)
+{
+ struct lws_context_per_thread *pt = container_of(timer,
+ struct lws_context_per_thread, uv_timeout_watcher);
+
+ lwsl_info("%s\n", __func__);
+ /* do timeout check only */
+ lws_service_fd_tsi(pt->context, NULL, pt->tid);
+}
+
static const int sigs[] = { SIGINT, SIGTERM, SIGSEGV, SIGFPE };
LWS_VISIBLE int
@@ -112,6 +123,9 @@
uv_poll_start(&wsi->w_read.uv_watcher, UV_READABLE, lws_accept_cb);
}
+ uv_timer_init(pt->io_loop_uv, &pt->uv_timeout_watcher);
+ uv_timer_start(&pt->uv_timeout_watcher, lws_uv_timeout_cb, 1000, 1000);
+
return status;
}
diff --git a/lib/private-libwebsockets.h b/lib/private-libwebsockets.h
index 1de2ca5..a228cbc 100644
--- a/lib/private-libwebsockets.h
+++ b/lib/private-libwebsockets.h
@@ -538,6 +538,7 @@
struct lws *rx_draining_ext_list;
struct lws *tx_draining_ext_list;
struct lws *timeout_list;
+ struct lws_context *context;
#ifdef LWS_WITH_CGI
struct lws_cgi *cgi_list;
#endif
@@ -557,6 +558,7 @@
#if defined(LWS_USE_LIBUV)
uv_loop_t *io_loop_uv;
uv_signal_t signals[8];
+ uv_timer_t uv_timeout_watcher;
#endif
#if defined(LWS_USE_LIBEV)
struct lws_io_watcher w_accept;
@@ -582,6 +584,7 @@
unsigned int fds_count;
short ah_count_in_use;
+ unsigned char tid;
};
/*
diff --git a/test-server/test-server-libuv.c b/test-server/test-server-libuv.c
index 4ac7956..5716bdf 100644
--- a/test-server/test-server-libuv.c
+++ b/test-server/test-server-libuv.c
@@ -122,9 +122,8 @@
}
static void
-uv_timeout_cb(uv_timer_t *w)
+uv_timeout_cb_dumb_increment(uv_timer_t *w)
{
- lwsl_info("%s\n", __func__);
lws_callback_on_writable_all_protocol(context,
&protocols[PROTOCOL_DUMB_INCREMENT]);
}
@@ -273,6 +272,7 @@
info.gid = -1;
info.uid = -1;
info.max_http_header_pool = 1;
+ info.timeout_secs = 5;
info.options = opts | LWS_SERVER_OPTION_LIBUV;
context = lws_create_context(&info);
@@ -284,7 +284,7 @@
lws_uv_initloop(context, NULL, signal_cb, 0);
uv_timer_init(lws_uv_getloop(context, 0), &timeout_watcher);
- uv_timer_start(&timeout_watcher, uv_timeout_cb, 50, 50);
+ uv_timer_start(&timeout_watcher, uv_timeout_cb_dumb_increment, 50, 50);
lws_libuv_run(context, 0);