From 8a53c1a881c6a5272b647ca267d40fbc435d11d9 Mon Sep 17 00:00:00 2001 From: "Thiago Marcos P. Santos" Date: Thu, 18 Feb 2016 01:09:48 +0200 Subject: [PATCH] [core] libuv unref() not really needed The run loop will be kept alive because it has an `AsyncTask`. We also can simple stop the loop with `uv_stop()`. The `RunLoop` is still gonna be the last object to be destroyed because it is the first object to be created in the thread, so by design it won't outlive `Timer`s and `AsyncTask`s. This patch won't change the current behavior, will just make the code simpler. --- platform/default/async_task.cpp | 1 - platform/default/run_loop.cpp | 29 +---------------------------- platform/default/timer.cpp | 1 - 3 files changed, 1 insertion(+), 30 deletions(-) diff --git a/platform/default/async_task.cpp b/platform/default/async_task.cpp index 05cf75986..00fe9ac5f 100644 --- a/platform/default/async_task.cpp +++ b/platform/default/async_task.cpp @@ -28,7 +28,6 @@ public: } handle()->data = this; - uv_unref(handle()); } ~Impl() { diff --git a/platform/default/run_loop.cpp b/platform/default/run_loop.cpp index 76c01b80b..b259fdfd2 100644 --- a/platform/default/run_loop.cpp +++ b/platform/default/run_loop.cpp @@ -13,12 +13,6 @@ namespace { using namespace mbgl::util; static ThreadLocal& current = *new ThreadLocal; -#if UV_VERSION_MAJOR == 0 && UV_VERSION_MINOR <= 10 -void dummyCallback(uv_async_t*, int) {}; -#else -void dummyCallback(uv_async_t*) {}; -#endif - } // namespace namespace mbgl { @@ -62,18 +56,7 @@ RunLoop* RunLoop::Get() { class RunLoop::Impl { public: - void closeHolder() { - uv_close(holderHandle(), [](uv_handle_t* h) { - delete reinterpret_cast(h); - }); - } - - uv_handle_t* holderHandle() { - return reinterpret_cast(holder); - } - uv_loop_t *loop = nullptr; - uv_async_t* holder = new uv_async_t; RunLoop::Type type; std::unique_ptr async; @@ -99,12 +82,6 @@ RunLoop::RunLoop(Type type) : impl(std::make_unique()) { break; } - // Just for holding a ref to the main loop and keep - // it alive as required by libuv. - if (uv_async_init(impl->loop, impl->holder, dummyCallback) != 0) { - throw std::runtime_error("Failed to initialize async."); - } - impl->type = type; current.set(this); @@ -114,10 +91,6 @@ RunLoop::RunLoop(Type type) : impl(std::make_unique()) { RunLoop::~RunLoop() { current.set(nullptr); - // Close the dummy handle that we have - // just to keep the main loop alive. - impl->closeHolder(); - if (impl->type == Type::Default) { return; } @@ -161,7 +134,7 @@ void RunLoop::runOnce() { } void RunLoop::stop() { - invoke([&] { uv_unref(impl->holderHandle()); }); + invoke([&] { uv_stop(impl->loop); }); } void RunLoop::addWatch(int fd, Event event, std::function&& callback) { diff --git a/platform/default/timer.cpp b/platform/default/timer.cpp index 473f05913..5d7d0757e 100644 --- a/platform/default/timer.cpp +++ b/platform/default/timer.cpp @@ -22,7 +22,6 @@ public: } handle()->data = this; - uv_unref(handle()); } ~Impl() {