From 4b89d01ccbf90ef6a13e49ef82b68339ad5cfcba Mon Sep 17 00:00:00 2001 From: "Fiorentino, Stefano" Date: Mon, 10 Jul 2023 10:52:08 +0200 Subject: [PATCH] Proposal for fixing the issue #292 Signed-off-by: Fiorentino, Stefano --- src/uvw/thread.cpp | 9 +++++++-- src/uvw/thread.h | 1 + test/uvw/thread.cpp | 11 +++++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/uvw/thread.cpp b/src/uvw/thread.cpp index c1cecf71..bbe6768f 100644 --- a/src/uvw/thread.cpp +++ b/src/uvw/thread.cpp @@ -9,7 +9,8 @@ namespace uvw { UVW_INLINE thread::thread(loop::token token, std::shared_ptr ref, task t, std::shared_ptr d) noexcept : uv_type{token, std::move(ref)}, data{std::move(d)}, - func{std::move(t)} {} + func{std::move(t)}, + joined{false} {} UVW_INLINE void thread::create_callback(void *arg) { thread &curr = *(static_cast(arg)); @@ -42,7 +43,11 @@ UVW_INLINE bool thread::run(create_flags opts, std::size_t stack) noexcept { } UVW_INLINE bool thread::join() noexcept { - return (0 == uv_thread_join(raw())); + if(!joined && 0 == uv_thread_join(raw())) { + joined = true; + return joined; + } + return false; } UVW_INLINE thread_local_storage::thread_local_storage(loop::token token, std::shared_ptr ref) noexcept diff --git a/src/uvw/thread.h b/src/uvw/thread.h index 6d65d7e1..7b45b686 100644 --- a/src/uvw/thread.h +++ b/src/uvw/thread.h @@ -106,6 +106,7 @@ class thread final: public uv_type { private: std::shared_ptr data; task func; + bool joined; }; /** diff --git a/test/uvw/thread.cpp b/test/uvw/thread.cpp index 6960bd88..765daccb 100644 --- a/test/uvw/thread.cpp +++ b/test/uvw/thread.cpp @@ -19,6 +19,17 @@ TEST(Thread, Run) { loop->run(); } +TEST(Thread, Join) { + auto loop = uvw::loop::get_default(); + auto cb = [](std::shared_ptr d) -> void { + }; + + auto handle = loop->resource(cb); + handle->run(); + ASSERT_TRUE(handle->join()); + ASSERT_FALSE(handle->join()); +} + TEST(ThreadLocalStorage, SetGet) { auto loop = uvw::loop::get_default(); auto localStorage = loop->resource();