From a3a0792012f6ca1bba25b902ad1dc19958aaa761 Mon Sep 17 00:00:00 2001 From: Alex Hultman Date: Sat, 20 Feb 2016 15:32:57 +0100 Subject: [PATCH] Make sure every handle is closed before destroying the uv loop --- changelog | 5 +++++ lib/libuv.c | 16 +++++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/changelog b/changelog index 4d47f43..a961aa6 100644 --- a/changelog +++ b/changelog @@ -1,6 +1,11 @@ Changelog --------- +Fixes +----- + +1) libuv one-per-session valgrind leak fixed + v1.7.1 ====== diff --git a/lib/libuv.c b/lib/libuv.c index 461dc3e..6925c2d 100644 --- a/lib/libuv.c +++ b/lib/libuv.c @@ -115,6 +115,16 @@ lws_uv_initloop(struct lws_context *context, uv_loop_t *loop, uv_signal_cb cb, return status; } +void lws_uv_close_cb(uv_handle_t *handle) +{ + +} + +void lws_uv_walk_cb(uv_handle_t *handle, void *arg) +{ + uv_close(handle, lws_uv_close_cb); +} + void lws_libuv_destroyloop(struct lws_context *context, int tsi) { @@ -132,8 +142,12 @@ lws_libuv_destroyloop(struct lws_context *context, int tsi) for (m = 0; m < ARRAY_SIZE(sigs); m++) uv_signal_stop(&pt->signals[m]); if (!pt->ev_loop_foreign) { + uv_stop(pt->io_loop_uv); + uv_walk(pt->io_loop_uv, lws_uv_walk_cb, NULL); + while (uv_run(pt->io_loop_uv, UV_RUN_NOWAIT)); m = uv_loop_close(pt->io_loop_uv); - lwsl_debug("%s: uv_loop_close: %d\n", __func__, m); + if (m == UV_EBUSY) + lwsl_debug("%s: uv_loop_close: UV_EBUSY\n", __func__); lws_free(pt->io_loop_uv); } } -- 2.7.4