From 7f498769aca2b18a463e627bdc9cb8deccd9f59c Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Boric Date: Wed, 28 Apr 2021 12:26:36 +0200 Subject: [PATCH] LibThread: Port Lock to foreign environments --- Userland/Libraries/LibThread/Lock.h | 56 ++++++++++++++--------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/Userland/Libraries/LibThread/Lock.h b/Userland/Libraries/LibThread/Lock.h index f684e08771..165082d708 100644 --- a/Userland/Libraries/LibThread/Lock.h +++ b/Userland/Libraries/LibThread/Lock.h @@ -6,12 +6,15 @@ #pragma once -#ifdef __serenity__ +#include +#include +#include -# include -# include -# include +#ifdef __serenity__ # include +#else +# include +#endif namespace LibThread { @@ -24,7 +27,22 @@ public: void unlock(); private: - Atomic m_holder { 0 }; +#ifdef __serenity__ + using ThreadID = int; + + ALWAYS_INLINE static ThreadID self() + { + return gettid(); + } +#else + using ThreadID = pthread_t; + + ALWAYS_INLINE static ThreadID self() + { + return pthread_self(); + } +#endif + Atomic m_holder { 0 }; u32 m_level { 0 }; }; @@ -45,24 +63,26 @@ private: ALWAYS_INLINE void Lock::lock() { - pid_t tid = gettid(); + ThreadID tid = self(); if (m_holder == tid) { ++m_level; return; } for (;;) { - int expected = 0; + ThreadID expected = 0; if (m_holder.compare_exchange_strong(expected, tid, AK::memory_order_acq_rel)) { m_level = 1; return; } +#ifdef __serenity__ donate(expected); +#endif } } inline void Lock::unlock() { - VERIFY(m_holder == gettid()); + VERIFY(m_holder == self()); VERIFY(m_level); if (m_level == 1) m_holder.store(0, AK::memory_order_release); @@ -100,23 +120,3 @@ private: }; } - -#else - -namespace LibThread { - -class Lock { -public: - Lock() { } - ~Lock() { } -}; - -class Locker { -public: - explicit Locker(Lock&) { } - ~Locker() { } -}; - -} - -#endif