diff --git a/src/common/ThreadStart.cpp b/src/common/ThreadStart.cpp index 2fe2b6defc1..186bbac3fff 100644 --- a/src/common/ThreadStart.cpp +++ b/src/common/ThreadStart.cpp @@ -219,11 +219,6 @@ ThreadId Thread::getId() #endif } -ThreadId Thread::getIdFromHandle(Handle threadHandle) -{ - return threadHandle; -} - bool Thread::isCurrent(InternalId iid) { return pthread_equal(iid, pthread_self()); @@ -373,11 +368,6 @@ ThreadId Thread::getId() return GetCurrentThreadId(); } -ThreadId Thread::getIdFromHandle(Handle threadHandle) -{ - return GetThreadId(threadHandle); -} - bool Thread::isCurrent(InternalId iid) { return GetCurrentThreadId() == iid; @@ -430,10 +420,6 @@ Thread::Handle Thread::getId() { } -Thread::Handle Thread::getIdFromHandle(Handle) -{ -} - void Thread::sleep(unsigned milliseconds) { } diff --git a/src/common/ThreadStart.h b/src/common/ThreadStart.h index 7bea8899c05..51a74504fd8 100644 --- a/src/common/ThreadStart.h +++ b/src/common/ThreadStart.h @@ -82,8 +82,14 @@ class Thread static void waitForCompletion(Handle& handle); static void kill(Handle& handle); + // Returns TID of current OS thread static ThreadId getId(); - static ThreadId getIdFromHandle(Handle threadHandle); + + // Returns internal ID of given thread instance + InternalId getInternalId() const + { + return internalId; + } static void sleep(unsigned milliseconds); static void yield(); diff --git a/src/jrd/CryptoManager.cpp b/src/jrd/CryptoManager.cpp index fe342e7f791..b079df75947 100644 --- a/src/jrd/CryptoManager.cpp +++ b/src/jrd/CryptoManager.cpp @@ -339,6 +339,8 @@ namespace Jrd { flDown(false), run(false) { + memset(&cryptThreadId, 0, sizeof(cryptThreadId)); + stateLock = FB_NEW_RPT(getPool(), 0) Lock(tdbb, 0, LCK_crypt_status, this, blockingAstChangeCryptState); threadLock = FB_NEW_RPT(getPool(), 0) Lock(tdbb, 0, LCK_crypt); @@ -995,7 +997,8 @@ namespace Jrd { // ready to go guard.leave(); // release in advance to avoid races with cryptThread() - Thread::start(cryptThreadStatic, (THREAD_ENTRY_PARAM) this, THREAD_medium, &cryptThreadHandle); + const Thread& thread = Thread::start(cryptThreadStatic, (THREAD_ENTRY_PARAM) this, THREAD_medium, &cryptThreadHandle); + cryptThreadId = thread.getInternalId(); } catch (const Firebird::Exception&) { diff --git a/src/jrd/CryptoManager.h b/src/jrd/CryptoManager.h index 730462ee388..5592c03adff 100644 --- a/src/jrd/CryptoManager.h +++ b/src/jrd/CryptoManager.h @@ -302,9 +302,11 @@ class CryptoManager FB_FINAL : public Firebird::PermanentStorage, public BarSync ULONG getCurrentPage(thread_db* tdbb) const; UCHAR getCurrentState(thread_db* tdbb) const; const char* getKeyName() const; - Thread::Handle getCryptThreadHandle() const + + // Return true if crypt thread is running and it is the current thread. + bool isCryptThreadCurrent() const { - return cryptThreadHandle; + return cryptThreadHandle && Thread::isCurrent(cryptThreadId); } private: @@ -393,6 +395,7 @@ class CryptoManager FB_FINAL : public Firebird::PermanentStorage, public BarSync Firebird::string hash; Firebird::RefPtr dbInfo; Thread::Handle cryptThreadHandle; + Thread::InternalId cryptThreadId; Firebird::IDbCryptPlugin* cryptPlugin; Factory* checkFactory; Database& dbb; diff --git a/src/jrd/jrd.cpp b/src/jrd/jrd.cpp index 625ba775306..145716cbcd2 100644 --- a/src/jrd/jrd.cpp +++ b/src/jrd/jrd.cpp @@ -6440,8 +6440,7 @@ static void release_attachment(thread_db* tdbb, Jrd::Attachment* attachment) // avoid races with special threads XThreadEnsureUnlock threadGuard(dbb->dbb_thread_mutex, FB_FUNCTION); XThreadEnsureUnlock* activeThreadGuard = &threadGuard; - if (dbb->dbb_crypto_manager - && Thread::isCurrent(Thread::getIdFromHandle(dbb->dbb_crypto_manager->getCryptThreadHandle()))) + if (dbb->dbb_crypto_manager && dbb->dbb_crypto_manager->isCryptThreadCurrent()) { activeThreadGuard = &dummyGuard; }