diff --git a/lib/libuv.c b/lib/libuv.c index fbdf160d..abea7566 100644 --- a/lib/libuv.c +++ b/lib/libuv.c @@ -66,7 +66,7 @@ lws_io_cb(uv_poll_t *watcher, int status, int revents) } LWS_VISIBLE void -lws_uv_sigint_cb(uv_loop_t *loop, uv_signal_t *watcher, int signum) +lws_uv_sigint_cb(uv_signal_t *watcher, int signum) { lwsl_info("internal signal handler caught signal %d\n", signum); lws_libuv_stop(watcher->data); @@ -74,7 +74,7 @@ lws_uv_sigint_cb(uv_loop_t *loop, uv_signal_t *watcher, int signum) LWS_VISIBLE int lws_uv_sigint_cfg(struct lws_context *context, int use_uv_sigint, - lws_uv_signal_cb_t *cb) + uv_signal_cb cb) { context->use_ev_sigint = use_uv_sigint; if (cb) @@ -98,22 +98,8 @@ lws_uv_timeout_cb(uv_timer_t *timer) static const int sigs[] = { SIGINT, SIGTERM, SIGSEGV, SIGFPE }; -struct lws_uv_sigint_ctx { - struct lws_context *context; - lws_uv_signal_cb_t *cb; -}; - -static void lws_uv_sigint_cb_wrapper(uv_signal_t *signal, int signum) -{ - struct lws_uv_sigint_ctx *p = signal->data; - uv_signal_t signal_fwd = *signal; - signal_fwd.data = p->context; - p->cb(signal->loop, &signal_fwd, signum); -} - LWS_VISIBLE int -lws_uv_initloop(struct lws_context *context, uv_loop_t *loop, uv_signal_cb cb, - int tsi) +lws_uv_initloop(struct lws_context *context, uv_loop_t *loop, int tsi) { struct lws_context_per_thread *pt = &context->pt[tsi]; struct lws *wsi = wsi_from_fd(context, pt->lserv_fd); @@ -131,12 +117,9 @@ lws_uv_initloop(struct lws_context *context, uv_loop_t *loop, uv_signal_cb cb, if (pt->context->use_ev_sigint) { assert(ARRAY_SIZE(sigs) <= ARRAY_SIZE(pt->signals)); for (n = 0; n < ARRAY_SIZE(sigs); n++) { - struct lws_uv_sigint_ctx *wrap_ctx = lws_malloc(sizeof(*wrap_ctx)); - wrap_ctx->context = pt->context; - wrap_ctx->cb = context->lws_uv_sigint_cb; uv_signal_init(loop, &pt->signals[n]); - pt->signals[n].data = wrap_ctx; - uv_signal_start(&pt->signals[n], lws_uv_sigint_cb_wrapper, sigs[n]); + pt->signals[n].data = pt->context; + uv_signal_start(&pt->signals[n], context->lws_uv_sigint_cb, sigs[n]); } } @@ -185,10 +168,8 @@ lws_libuv_destroyloop(struct lws_context *context, int tsi) if (context->use_ev_sigint) uv_signal_stop(&pt->w_sigint.uv_watcher); - for (m = 0; m < ARRAY_SIZE(sigs); m++) { + for (m = 0; m < ARRAY_SIZE(sigs); m++) uv_signal_stop(&pt->signals[m]); - lws_free(pt->signals[m].data); - } if (!pt->ev_loop_foreign) { uv_stop(pt->io_loop_uv); uv_walk(pt->io_loop_uv, lws_uv_walk_cb, NULL); diff --git a/lib/libwebsockets.h b/lib/libwebsockets.h index 31e04550..a43d773e 100644 --- a/lib/libwebsockets.h +++ b/lib/libwebsockets.h @@ -1522,11 +1522,9 @@ lws_ev_sigint_cb(struct ev_loop *loop, struct ev_signal *watcher, int revents); #endif /* LWS_USE_LIBEV */ #ifdef LWS_USE_LIBUV -typedef void (lws_uv_signal_cb_t)(uv_loop_t *l, uv_signal_t *w, int signum); - LWS_VISIBLE LWS_EXTERN int lws_uv_sigint_cfg(struct lws_context *context, int use_uv_sigint, - lws_uv_signal_cb_t *cb); + uv_signal_cb cb); LWS_VISIBLE LWS_EXTERN void lws_libuv_run(const struct lws_context *context, int tsi); @@ -1535,13 +1533,13 @@ LWS_VISIBLE void lws_libuv_stop(struct lws_context *context); LWS_VISIBLE LWS_EXTERN int -lws_uv_initloop(struct lws_context *context, uv_loop_t *loop, uv_signal_cb cb, int tsi); +lws_uv_initloop(struct lws_context *context, uv_loop_t *loop, int tsi); LWS_VISIBLE LWS_EXTERN uv_loop_t * lws_uv_getloop(struct lws_context *context, int tsi); LWS_VISIBLE void -lws_uv_sigint_cb(uv_loop_t *loop, uv_signal_t *watcher, int signum); +lws_uv_sigint_cb(uv_signal_t *watcher, int signum); #endif /* LWS_USE_LIBUV */ LWS_VISIBLE LWS_EXTERN int diff --git a/lib/private-libwebsockets.h b/lib/private-libwebsockets.h index f3d6f5c1..3021b12d 100644 --- a/lib/private-libwebsockets.h +++ b/lib/private-libwebsockets.h @@ -637,7 +637,7 @@ struct lws_context { lws_ev_signal_cb_t * lws_ev_sigint_cb; #endif #if defined(LWS_USE_LIBUV) - lws_uv_signal_cb_t * lws_uv_sigint_cb; + uv_signal_cb lws_uv_sigint_cb; #endif char http_proxy_address[128]; char proxy_basic_auth_token[128]; diff --git a/test-server/test-server-libuv.c b/test-server/test-server-libuv.c index b6ef5282..f09c5b36 100644 --- a/test-server/test-server-libuv.c +++ b/test-server/test-server-libuv.c @@ -112,7 +112,7 @@ static const struct lws_extension exts[] = { { NULL, NULL, NULL /* terminator */ } }; -void signal_cb(uv_loop_t *loop, uv_signal_t *watcher, int signum) +void signal_cb(uv_signal_t *watcher, int signum) { lwsl_err("Signal %d caught, exiting...\n", watcher->signum); switch (watcher->signum) { @@ -289,7 +289,7 @@ int main(int argc, char **argv) lws_uv_sigint_cfg(context, 1, signal_cb); - lws_uv_initloop(context, NULL, NULL, 0); + lws_uv_initloop(context, NULL, 0); uv_timer_init(lws_uv_getloop(context, 0), &timeout_watcher); uv_timer_start(&timeout_watcher, uv_timeout_cb_dumb_increment, 50, 50);