diff --git a/src/uvw/loop.hpp b/src/uvw/loop.hpp index d174a393..9dbda44c 100644 --- a/src/uvw/loop.hpp +++ b/src/uvw/loop.hpp @@ -201,6 +201,35 @@ class Loop final: public Emitter, public std::enable_shared_from_this + * This function is a way to use external libraries that expose their own + * loop, such as luv. + * + * @param raw_loop The raw libuv loop pointer. + * + * @return The wrapped loop. + */ + static std::shared_ptr fromRaw(uv_loop_t* raw_loop) { + static std::weak_ptr ref; + std::shared_ptr loop; + + if(ref.expired()) { + if(raw_loop) { + auto ptr = std::unique_ptr(raw_loop, [](uv_loop_t *){}); + loop = std::shared_ptr{new Loop{std::move(ptr)}}; + } + + ref = loop; + } else { + loop = ref.lock(); + } + + return loop; + } + Loop(const Loop &) = delete; Loop(Loop &&other) = delete; Loop & operator=(const Loop &) = delete;