From ffbe87961ee7cbb9fa4cdbac63a9d1dde8a9968b Mon Sep 17 00:00:00 2001 From: EZ4Stephen Date: Tue, 2 Dec 2025 23:03:12 +0400 Subject: [PATCH] Replace DECLARE_DEFAULT_COMPARISONS in pthread_utils, revert some changes from about 3 weeks ago 1. Replaced DECLARE_DEFAULT_COMPARISONS (pthread_t) with 5 ddifferent LIBPBD_API inline bool operators. 2. Revert some if (pthread_equal (t.first, pthread_self ()) != 0) { to if (pthread_equal (t.first, pthread_self ())) { (along with one other example). --- libs/pbd/pthread_utils.cc | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/libs/pbd/pthread_utils.cc b/libs/pbd/pthread_utils.cc index d2d24f38c4..81ed0311f6 100644 --- a/libs/pbd/pthread_utils.cc +++ b/libs/pbd/pthread_utils.cc @@ -38,11 +38,21 @@ #include "pbd/pthread_utils.h" #ifdef COMPILER_MSVC -DECLARE_DEFAULT_COMPARISONS (pthread_t) // Needed for 'DECLARE_DEFAULT_COMPARISONS'. Objects in an STL container can be - // searched and sorted. Thus, when instantiating the container, MSVC complains - // if the type of object being contained has no appropriate comparison operators - // defined (specifically, if operators '<' and '==' are undefined). This seems - // to be the case with ptw32 'pthread_t' which is a simple struct. +LIBPBD_API inline bool operator<(const pthread_t& lhs, const pthread_t& rhs) { + return lhs.p != rhs.p ? lhs.p < rhs.p : lhs.x < rhs.x; +} +LIBPBD_API inline bool operator==(const pthread_t& lhs, const pthread_t& rhs) { + return lhs.p == rhs.p && lhs.x == rhs.x; +} +LIBPBD_API inline bool operator!=(const pthread_t& lhs, const pthread_t& rhs) { + return !(lhs == rhs); +} +LIBPBD_API inline bool operator==(const pthread_t& lhs, int rhs) { + return !rhs && !lhs.p; +} +LIBPBD_API inline bool operator!=(const pthread_t& lhs, int rhs) { + return rhs || lhs.p; +} #define pthread_gethandle pthread_getw32threadhandle_np #endif @@ -194,7 +204,7 @@ fake_thread_start (void* arg) pthread_mutex_lock (&thread_map_lock); for (auto const& t : all_threads) { - if (pthread_equal (t.first, pthread_self ()) != 0) { + if (pthread_equal (t.first, pthread_self ())) { DEBUG_TRACE (PBD::DEBUG::Threads, string_compose ("Terminated: '%1'\n", t.second)); all_threads.erase (t.first); break; @@ -262,7 +272,7 @@ pthread_kill_all (int signum) { pthread_mutex_lock (&thread_map_lock); for (auto const& t : all_threads) { - if (pthread_equal (t.first, pthread_self ()) != 0) { + if (pthread_equal (t.first, pthread_self ())) { continue; } DEBUG_TRACE (PBD::DEBUG::Threads, string_compose ("Kill: '%1'\n", t.second)); @@ -277,7 +287,7 @@ pthread_cancel_all () { pthread_mutex_lock (&thread_map_lock); for (auto const& t : all_threads) { - if (pthread_equal (t.first, pthread_self ()) != 0) { + if (pthread_equal (t.first, pthread_self ())) { continue; } DEBUG_TRACE (PBD::DEBUG::Threads, string_compose ("Cancel: '%1'\n", t.second)); @@ -292,7 +302,7 @@ pthread_cancel_one (pthread_t thread) { pthread_mutex_lock (&thread_map_lock); for (auto const& t : all_threads) { - if (pthread_equal (t.first, thread) != 0) { + if (pthread_equal (t.first, thread)) { all_threads.erase (t.first); break; } @@ -588,7 +598,7 @@ PBD::Thread::_run (void* arg) /* cleanup */ pthread_mutex_lock (&thread_map_lock); for (auto const& t : all_threads) { - if (pthread_equal (t.first, pthread_self ()) != 0) { + if (pthread_equal (t.first, pthread_self ())) { DEBUG_TRACE (PBD::DEBUG::Threads, string_compose ("Terminated: '%1'\n", t.second)); all_threads.erase (t.first); break; @@ -611,5 +621,5 @@ PBD::Thread::join () bool PBD::Thread::caller_is_self () const { - return pthread_equal (_t, pthread_self ()) != 0; + return pthread_equal (_t, pthread_self ()); }