diff options
Diffstat (limited to 'external/firebird/0002-Backported-fix-for-CORE-5452-Segfault-when-engine-s-.patch.1')
-rw-r--r-- | external/firebird/0002-Backported-fix-for-CORE-5452-Segfault-when-engine-s-.patch.1 | 1013 |
1 files changed, 0 insertions, 1013 deletions
diff --git a/external/firebird/0002-Backported-fix-for-CORE-5452-Segfault-when-engine-s-.patch.1 b/external/firebird/0002-Backported-fix-for-CORE-5452-Segfault-when-engine-s-.patch.1 deleted file mode 100644 index c55df4d0ae71..000000000000 --- a/external/firebird/0002-Backported-fix-for-CORE-5452-Segfault-when-engine-s-.patch.1 +++ /dev/null @@ -1,1013 +0,0 @@ -From 40f782ae3e918c4f3842571ff8064be1c4f54961 Mon Sep 17 00:00:00 2001 -From: AlexPeshkoff <peshkoff@mail.ru> -Date: Fri, 13 Jan 2017 14:29:54 +0300 -Subject: [PATCH] Backported fix for CORE-5452: Segfault when engine's dynamic - library is unloaded right after closing worker threads (GC and/or cache - writer) - ---- - src/alice/alice_meta.epp | 1 - - src/burp/burp.h | 2 - - src/common/ThreadStart.h | 86 ++++++++++++++++++++++++++++ - src/common/classes/Synchronize.h | 5 +- - src/common/classes/misc/class_perf.cpp | 1 - - src/common/xdr.cpp | 2 - - src/gpre/boot/gpre_meta_boot.cpp | 1 - - src/gpre/std/gpre_meta.epp | 1 - - src/include/fb_exception.h | 1 - - src/include/firebird.h | 1 - - src/isql/OptionsBase.cpp | 1 - - src/isql/extract.epp | 1 - - src/isql/isql.epp | 5 -- - src/jrd/Attachment.h | 1 + - src/jrd/Database.h | 6 +- - src/jrd/Mapping.cpp | 26 +++++---- - src/jrd/cch.cpp | 31 +++++----- - src/jrd/cch.h | 14 ++++- - src/jrd/event.cpp | 13 +++-- - src/jrd/event_proto.h | 7 +-- - src/jrd/intl.cpp | 1 - - src/jrd/trace/TraceConfigStorage.h | 1 + - src/jrd/vio.cpp | 23 ++++---- - src/lock/lock.cpp | 29 ++++++---- - src/lock/lock_proto.h | 8 +-- - src/qli/command.cpp | 1 - - src/qli/dtr.h | 1 - - src/qli/lex.cpp | 4 -- - src/qli/meta.epp | 1 - - src/utilities/gsec/gsecswi.h | 1 - - src/utilities/gstat/dba.epp | 1 + - src/utilities/nbackup/nbkswi.h | 1 - - src/utilities/ntrace/os/win32/FileObject.cpp | 1 - - src/yvalve/gds.cpp | 1 + - src/yvalve/preparse.cpp | 1 - - 35 files changed, 182 insertions(+), 99 deletions(-) - -diff --git a/src/alice/alice_meta.epp b/src/alice/alice_meta.epp -index d0f59bc..65dc37e 100644 ---- a/src/alice/alice_meta.epp -+++ b/src/alice/alice_meta.epp -@@ -30,7 +30,6 @@ - #include "firebird.h" - #include <stdio.h> - #include "../jrd/ibase.h" --//#include "../jrd/license.h" - #include "../alice/alice.h" - #include "../alice/alice_meta.h" - #include "../yvalve/gds_proto.h" -diff --git a/src/burp/burp.h b/src/burp/burp.h -index 293a91f..fe26335 100644 ---- a/src/burp/burp.h -+++ b/src/burp/burp.h -@@ -769,8 +769,6 @@ struct burp_meta_obj - // I need to review if we tolerate different lengths for different OS's here. - const unsigned int MAX_FILE_NAME_SIZE = 256; - --//#include "../jrd/svc.h" -- - #include "../burp/std_desc.h" - - #ifdef WIN_NT -diff --git a/src/common/ThreadStart.h b/src/common/ThreadStart.h -index 85e6a38..823c5c1 100644 ---- a/src/common/ThreadStart.h -+++ b/src/common/ThreadStart.h -@@ -31,6 +31,7 @@ - #define JRD_THREADSTART_H - - #include "../common/ThreadData.h" -+#include "../common/classes/semaphore.h" - - #ifdef WIN_NT - #include <windows.h> -@@ -89,4 +90,89 @@ inline ThreadId getThreadId() - return Thread::getId(); - } - -+ -+#ifndef USE_POSIX_THREADS -+#define USE_FINI_SEM -+#endif -+ -+template <typename TA> -+class ThreadFinishSync -+{ -+public: -+ typedef void ThreadRoutine(TA); -+ -+ ThreadFinishSync(Firebird::MemoryPool& pool, ThreadRoutine* routine, int priority_arg) -+ : -+#ifdef USE_FINI_SEM -+ fini(pool), -+#else -+ threadHandle(0), -+#endif -+ threadRoutine(routine), -+ threadPriority(priority_arg) -+ { } -+ -+ void run(TA arg) -+ { -+ threadArg = arg; -+ -+ Thread::start(internalRun, this, threadPriority -+#ifndef USE_FINI_SEM -+ , &threadHandle -+#endif -+ ); -+ } -+ -+ void waitForCompletion() -+ { -+#ifdef USE_FINI_SEM -+ fini.enter(); -+#else -+ Thread::waitForCompletion(threadHandle); -+ threadHandle = 0; -+#endif -+ } -+ -+private: -+#ifdef USE_FINI_SEM -+ Firebird::Semaphore fini; -+#else -+ Thread::Handle threadHandle; -+#endif -+ -+ TA threadArg; -+ ThreadRoutine* threadRoutine; -+ int threadPriority; -+ bool starting; -+ -+ static THREAD_ENTRY_DECLARE internalRun(THREAD_ENTRY_PARAM arg) -+ { -+ ((ThreadFinishSync*)arg)->internalRun(); -+ return 0; -+ } -+ -+ void internalRun() -+ { -+ try -+ { -+ threadRoutine(threadArg); -+ } -+ catch (const Firebird::Exception& ex) -+ { -+ threadArg->exceptionHandler(ex, threadRoutine); -+ } -+ -+#ifdef USE_FINI_SEM -+ try -+ { -+ fini.release(); -+ } -+ catch (const Firebird::Exception& ex) -+ { -+ threadArg->exceptionHandler(ex, threadRoutine); -+ } -+#endif -+ } -+}; -+ - #endif // JRD_THREADSTART_H -diff --git a/src/common/classes/Synchronize.h b/src/common/classes/Synchronize.h -index 198de44..3788541 100644 ---- a/src/common/classes/Synchronize.h -+++ b/src/common/classes/Synchronize.h -@@ -33,10 +33,7 @@ - #define CLASSES_SYNCHRONIZE_H - - #include "../common/classes/SyncObject.h" -- --#ifndef WIN_NT --#include "fb_pthread.h" --#endif -+#include "../common/ThreadStart.h" - - - namespace Firebird { -diff --git a/src/common/classes/misc/class_perf.cpp b/src/common/classes/misc/class_perf.cpp -index 97b7bb3..142bfde 100644 ---- a/src/common/classes/misc/class_perf.cpp -+++ b/src/common/classes/misc/class_perf.cpp -@@ -28,7 +28,6 @@ - - #include "tree.h" - #include "alloc.h" --//#include "../memory/memory_pool.h" - #include <stdio.h> - #include <time.h> - #include <set> -diff --git a/src/common/xdr.cpp b/src/common/xdr.cpp -index b9f9f4d..1dfff76 100644 ---- a/src/common/xdr.cpp -+++ b/src/common/xdr.cpp -@@ -26,9 +26,7 @@ - - #include "firebird.h" - #include <string.h> --//#include "../remote/remote.h" - #include "../common/xdr.h" --//#include "../remote/proto_proto.h" - #include "../common/xdr_proto.h" - #include "../yvalve/gds_proto.h" - #include "../common/gdsassert.h" -diff --git a/src/gpre/boot/gpre_meta_boot.cpp b/src/gpre/boot/gpre_meta_boot.cpp -index 0fde018..1f302c6 100644 ---- a/src/gpre/boot/gpre_meta_boot.cpp -+++ b/src/gpre/boot/gpre_meta_boot.cpp -@@ -32,7 +32,6 @@ - #include <string.h> - #include "../jrd/ibase.h" - #include "../gpre/gpre.h" --//#include "../jrd/license.h" - #include "../jrd/intl.h" - #include "../gpre/gpre_proto.h" - #include "../gpre/hsh_proto.h" -diff --git a/src/gpre/std/gpre_meta.epp b/src/gpre/std/gpre_meta.epp -index 34ff932..0780dd4 100644 ---- a/src/gpre/std/gpre_meta.epp -+++ b/src/gpre/std/gpre_meta.epp -@@ -32,7 +32,6 @@ - #include <string.h> - #include "../jrd/ibase.h" - #include "../gpre/gpre.h" --//#include "../jrd/license.h" - #include "../jrd/intl.h" - #include "../gpre/gpre_proto.h" - #include "../gpre/hsh_proto.h" -diff --git a/src/include/fb_exception.h b/src/include/fb_exception.h -index 030cf94..c4c1df4 100644 ---- a/src/include/fb_exception.h -+++ b/src/include/fb_exception.h -@@ -43,7 +43,6 @@ - - #include "fb_types.h" - #include "firebird/Interface.h" --#include "../common/ThreadStart.h" - - namespace Firebird - { -diff --git a/src/include/firebird.h b/src/include/firebird.h -index 3d74354..87f0a11 100644 ---- a/src/include/firebird.h -+++ b/src/include/firebird.h -@@ -68,7 +68,6 @@ - - #ifdef __cplusplus - #include "../common/common.h" --//#include "fb_exception.h" - #endif - - #ifndef NULL -diff --git a/src/isql/OptionsBase.cpp b/src/isql/OptionsBase.cpp -index 5a78540..0974fa3 100644 ---- a/src/isql/OptionsBase.cpp -+++ b/src/isql/OptionsBase.cpp -@@ -24,7 +24,6 @@ - - #include "firebird.h" - #include "OptionsBase.h" --//#include "../common/utils_proto.h" // strnicmp - #include "../common/gdsassert.h" - - -diff --git a/src/isql/extract.epp b/src/isql/extract.epp -index ec2ddb1..99e821c 100644 ---- a/src/isql/extract.epp -+++ b/src/isql/extract.epp -@@ -59,7 +59,6 @@ - #include "../jrd/ods.h" - #include "../common/utils_proto.h" - #include "../jrd/constants.h" --//#include "../common/classes/ImplementHelper.h" - - using MsgFormat::SafeArg; - -diff --git a/src/isql/isql.epp b/src/isql/isql.epp -index ccadce2..98b37bb 100644 ---- a/src/isql/isql.epp -+++ b/src/isql/isql.epp -@@ -46,7 +46,6 @@ - #include "firebird.h" - #include <stdio.h> - #include "../yvalve/keywords.h" --//#include "../yvalve/gds_proto.h" - #include "../jrd/intl.h" - #include <stdlib.h> - #include <stdarg.h> -@@ -79,10 +78,6 @@ - #include <locale.h> - #endif - --//#ifdef HAVE_IO_H --//#include <io.h> // mktemp --//#endif -- - #ifdef HAVE_EDITLINE_H - // This is a local file included in our distribution - but not always - // compiled into the system -diff --git a/src/jrd/Attachment.h b/src/jrd/Attachment.h -index 2807db3..e71610e 100644 ---- a/src/jrd/Attachment.h -+++ b/src/jrd/Attachment.h -@@ -39,6 +39,7 @@ - #include "../common/classes/array.h" - #include "../common/classes/stack.h" - #include "../common/classes/timestamp.h" -+#include "../common/ThreadStart.h" - - #include "../jrd/EngineInterface.h" - -diff --git a/src/jrd/Database.h b/src/jrd/Database.h -index 0eab40d..f0f44d3 100644 ---- a/src/jrd/Database.h -+++ b/src/jrd/Database.h -@@ -440,7 +440,7 @@ public: - GarbageCollector* dbb_garbage_collector; // GarbageCollector class - Firebird::Semaphore dbb_gc_sem; // Event to wake up garbage collector - Firebird::Semaphore dbb_gc_init; // Event for initialization garbage collector -- Firebird::Semaphore dbb_gc_fini; // Event for finalization garbage collector -+ ThreadFinishSync<Database*> dbb_gc_fini; // Sync for finalization garbage collector - - Firebird::MemoryStats dbb_memory_stats; - RuntimeStatistics dbb_stats; -@@ -511,6 +511,7 @@ private: - dbb_owner(*p), - dbb_pools(*p, 4), - dbb_sort_buffers(*p), -+ dbb_gc_fini(*p, garbage_collector, THREAD_medium), - dbb_stats(*p), - dbb_lock_owner_id(getLockOwnerId()), - dbb_tip_cache(NULL), -@@ -560,6 +561,9 @@ public: - // reset sweep flags and release sweep lock - void clearSweepFlags(thread_db* tdbb); - -+ static void garbage_collector(Database* dbb); -+ void exceptionHandler(const Firebird::Exception& ex, ThreadFinishSync<Database*>::ThreadRoutine* routine); -+ - private: - //static int blockingAstSharedCounter(void*); - static int blocking_ast_sweep(void* ast_object); -diff --git a/src/jrd/Mapping.cpp b/src/jrd/Mapping.cpp -index c1bcf0e..8df7e2f 100644 ---- a/src/jrd/Mapping.cpp -+++ b/src/jrd/Mapping.cpp -@@ -581,7 +581,8 @@ class MappingIpc FB_FINAL : public Firebird::IpcObject - - public: - explicit MappingIpc(MemoryPool&) -- : processId(getpid()) -+ : processId(getpid()), -+ cleanupSync(*getDefaultMemoryPool(), clearDelivery, THREAD_high) - { } - - ~MappingIpc() -@@ -602,7 +603,7 @@ public: - sMem->process[process].flags &= ~MappingHeader::FLAG_ACTIVE; - (void) // Ignore errors in cleanup - sharedMemory->eventPost(&sMem->process[process].notifyEvent); -- cleanupSemaphore.tryEnter(5); -+ cleanupSync.waitForCompletion(); - - // Ignore errors in cleanup - sharedMemory->eventFini(&sMem->process[process].notifyEvent); -@@ -755,7 +756,7 @@ public: - - try - { -- Thread::start(clearDelivery, this, THREAD_high); -+ cleanupSync.run(this); - } - catch (const Exception&) - { -@@ -764,6 +765,12 @@ public: - } - } - -+ void exceptionHandler(const Exception& ex, ThreadFinishSync<MappingIpc*>::ThreadRoutine*) -+ { -+ iscLogException("Fatal error in clearDeliveryThread", ex); -+ fb_utils::logAndDie("Fatal error in clearDeliveryThread"); -+ } -+ - private: - void clearDeliveryThread() - { -@@ -801,13 +808,10 @@ private: - } - if (startup) - startupSemaphore.release(); -- -- cleanupSemaphore.release(); - } - catch (const Exception& ex) - { -- iscLogException("Fatal error in clearDeliveryThread", ex); -- fb_utils::logAndDie("Fatal error in clearDeliveryThread"); -+ exceptionHandler(ex, NULL); - } - } - -@@ -862,11 +866,9 @@ private: - MappingIpc* const data; - }; - -- static THREAD_ENTRY_DECLARE clearDelivery(THREAD_ENTRY_PARAM par) -+ static void clearDelivery(MappingIpc* mapping) - { -- MappingIpc* m = (MappingIpc*)par; -- m->clearDeliveryThread(); -- return 0; -+ mapping->clearDeliveryThread(); - } - - AutoPtr<SharedMemory<MappingHeader> > sharedMemory; -@@ -874,7 +876,7 @@ private: - const SLONG processId; - unsigned process; - Semaphore startupSemaphore; -- Semaphore cleanupSemaphore; -+ ThreadFinishSync<MappingIpc*> cleanupSync; - }; - - GlobalPtr<MappingIpc, InstanceControl::PRIORITY_DELETE_FIRST> mappingIpc; -diff --git a/src/jrd/cch.cpp b/src/jrd/cch.cpp -index e1d403b..1bf714f 100644 ---- a/src/jrd/cch.cpp -+++ b/src/jrd/cch.cpp -@@ -120,14 +120,11 @@ static BufferDesc* alloc_bdb(thread_db*, BufferControl*, UCHAR **); - static Lock* alloc_page_lock(Jrd::thread_db*, BufferDesc*); - static int blocking_ast_bdb(void*); - #ifdef CACHE_READER --static THREAD_ENTRY_DECLARE cache_reader(THREAD_ENTRY_PARAM); -- - static void prefetch_epilogue(Prefetch*, FbStatusVector *); - static void prefetch_init(Prefetch*, thread_db*); - static void prefetch_io(Prefetch*, FbStatusVector *); - static void prefetch_prologue(Prefetch*, SLONG *); - #endif --static THREAD_ENTRY_DECLARE cache_writer(THREAD_ENTRY_PARAM); - static void check_precedence(thread_db*, WIN*, PageNumber); - static void clear_precedence(thread_db*, BufferDesc*); - static BufferDesc* dealloc_bdb(BufferDesc*); -@@ -1438,7 +1435,7 @@ void CCH_init2(thread_db* tdbb) - - try - { -- Thread::start(cache_writer, dbb, THREAD_medium); -+ bcb->bcb_writer_fini.run(bcb); - } - catch (const Exception&) - { -@@ -2017,7 +2014,7 @@ void CCH_shutdown(thread_db* tdbb) - { - bcb->bcb_flags &= ~BCB_cache_writer; - bcb->bcb_writer_sem.release(); // Wake up running thread -- bcb->bcb_writer_fini.enter(); -+ bcb->bcb_writer_fini.waitForCompletion(); - } - - SyncLockGuard bcbSync(&bcb->bcb_syncObject, SYNC_EXCLUSIVE, "CCH_shutdown"); -@@ -2692,7 +2689,7 @@ static void flushAll(thread_db* tdbb, USHORT flush_flag) - - - #ifdef CACHE_READER --static THREAD_ENTRY_DECLARE cache_reader(THREAD_ENTRY_PARAM arg) -+void BufferControl::cache_reader(BufferControl* bcb) - { - /************************************** - * -@@ -2706,7 +2703,7 @@ static THREAD_ENTRY_DECLARE cache_reader(THREAD_ENTRY_PARAM arg) - * busy at a time. - * - **************************************/ -- Database* dbb = (Database*) arg; -+ Database* dbb = bcb->bcb_database; - Database::SyncGuard dsGuard(dbb); - - FbLocalStatus status_vector; -@@ -2846,7 +2843,7 @@ static THREAD_ENTRY_DECLARE cache_reader(THREAD_ENTRY_PARAM arg) - #endif - - --static THREAD_ENTRY_DECLARE cache_writer(THREAD_ENTRY_PARAM arg) -+void BufferControl::cache_writer(BufferControl* bcb) - { - /************************************** - * -@@ -2859,8 +2856,7 @@ static THREAD_ENTRY_DECLARE cache_writer(THREAD_ENTRY_PARAM arg) - * - **************************************/ - FbLocalStatus status_vector; -- Database* const dbb = (Database*) arg; -- BufferControl* const bcb = dbb->dbb_bcb; -+ Database* const dbb = bcb->bcb_database; - - try - { -@@ -2964,8 +2960,7 @@ static THREAD_ENTRY_DECLARE cache_writer(THREAD_ENTRY_PARAM arg) - } // try - catch (const Firebird::Exception& ex) - { -- ex.stuffException(&status_vector); -- iscDbLogStatus(dbb->dbb_filename.c_str(), &status_vector); -+ bcb->exceptionHandler(ex, cache_writer); - } - - bcb->bcb_flags &= ~BCB_cache_writer; -@@ -2977,15 +2972,19 @@ static THREAD_ENTRY_DECLARE cache_writer(THREAD_ENTRY_PARAM arg) - bcb->bcb_flags &= ~BCB_writer_start; - bcb->bcb_writer_init.release(); - } -- bcb->bcb_writer_fini.release(); - } - catch (const Firebird::Exception& ex) - { -- ex.stuffException(&status_vector); -- iscDbLogStatus(dbb->dbb_filename.c_str(), &status_vector); -+ bcb->exceptionHandler(ex, cache_writer); - } -+} - -- return 0; -+ -+void BufferControl::exceptionHandler(const Firebird::Exception& ex, BcbSync::ThreadRoutine* /*routine*/) -+{ -+ FbLocalStatus status_vector; -+ ex.stuffException(&status_vector); -+ iscDbLogStatus(bcb_database->dbb_filename.c_str(), &status_vector); - } - - -diff --git a/src/jrd/cch.h b/src/jrd/cch.h -index b920566..b7f8486 100644 ---- a/src/jrd/cch.h -+++ b/src/jrd/cch.h -@@ -29,6 +29,7 @@ - #include "../common/classes/RefCounted.h" - #include "../common/classes/semaphore.h" - #include "../common/classes/SyncObject.h" -+#include "../common/ThreadStart.h" - #ifdef SUPERSERVER_V2 - #include "../jrd/sbm.h" - #include "../jrd/pag.h" -@@ -85,7 +86,8 @@ class BufferControl : public pool_alloc<type_bcb> - BufferControl(MemoryPool& p, Firebird::MemoryStats& parentStats) - : bcb_bufferpool(&p), - bcb_memory_stats(&parentStats), -- bcb_memory(p) -+ bcb_memory(p), -+ bcb_writer_fini(p, cache_writer, THREAD_medium) - { - bcb_database = NULL; - QUE_INIT(bcb_in_use); -@@ -144,18 +146,24 @@ public: - Firebird::SyncObject bcb_syncLRU; - //Firebird::SyncObject bcb_syncPageWrite; - -+ typedef ThreadFinishSync<BufferControl*> BcbSync; -+ -+ static void cache_writer(BufferControl* bcb); - Firebird::Semaphore bcb_writer_sem; // Wake up cache writer - Firebird::Semaphore bcb_writer_init; // Cache writer initialization -- Firebird::Semaphore bcb_writer_fini; // Cache writer finalization -+ BcbSync bcb_writer_fini; // Cache writer finalization - #ifdef SUPERSERVER_V2 -+ static void cache_reader(BufferControl* bcb); - // the code in cch.cpp is not tested for semaphore instead event !!! - Firebird::Semaphore bcb_reader_sem; // Wake up cache reader - Firebird::Semaphore bcb_reader_init; // Cache reader initialization -- Firebird::Semaphore bcb_reader_fini; // Cache reader finalization -+ BcbSync bcb_reader_fini; // Cache reader finalization - - PageBitmap* bcb_prefetch; // Bitmap of pages to prefetch - #endif - -+ void exceptionHandler(const Firebird::Exception& ex, BcbSync::ThreadRoutine* routine); -+ - bcb_repeat* bcb_rpt; - }; - -diff --git a/src/jrd/event.cpp b/src/jrd/event.cpp -index 3a6bf28..cb6dc33 100644 ---- a/src/jrd/event.cpp -+++ b/src/jrd/event.cpp -@@ -126,6 +126,7 @@ EventManager::EventManager(const Firebird::string& id, Firebird::RefPtr<Config> - m_processOffset(0), - m_dbId(getPool(), id), - m_config(conf), -+ m_cleanupSync(getPool(), watcher_thread, THREAD_medium), - m_sharedFileCreated(false), - m_exiting(false) - { -@@ -146,7 +147,7 @@ EventManager::~EventManager() - // Terminate the event watcher thread - m_startupSemaphore.tryEnter(5); - (void) m_sharedMemory->eventPost(&m_process->prb_event); -- m_cleanupSemaphore.tryEnter(5); -+ m_cleanupSync.waitForCompletion(); - - #ifdef HAVE_OBJECT_MAP - m_sharedMemory->unmapObject(&localStatus, &m_process); -@@ -697,7 +698,7 @@ void EventManager::create_process() - - release_shmem(); - -- Thread::start(watcher_thread, this, THREAD_medium); -+ m_cleanupSync.run(this); - } - - -@@ -1414,12 +1415,16 @@ void EventManager::watcher_thread() - { - m_startupSemaphore.release(); - } -- m_cleanupSemaphore.release(); - } - catch (const Firebird::Exception& ex) - { -- iscLogException("Error closing event watcher thread\n", ex); -+ exceptionHandler(ex, NULL); - } - } - -+void EventManager::exceptionHandler(const Firebird::Exception& ex, ThreadFinishSync<EventManager*>::ThreadRoutine*) -+{ -+ iscLogException("Error closing event watcher thread\n", ex); -+} -+ - } // namespace -diff --git a/src/jrd/event_proto.h b/src/jrd/event_proto.h -index 3301203..9bfd20e 100644 ---- a/src/jrd/event_proto.h -+++ b/src/jrd/event_proto.h -@@ -63,6 +63,7 @@ public: - - bool initialize(Firebird::SharedMemoryBase*, bool); - void mutexBug(int osErrorCode, const char* text); -+ void exceptionHandler(const Firebird::Exception& ex, ThreadFinishSync<EventManager*>::ThreadRoutine* routine); - - private: - void acquire_shmem(); -@@ -91,11 +92,9 @@ private: - void detach_shared_file(); - void get_shared_file_name(Firebird::PathName&) const; - -- static THREAD_ENTRY_DECLARE watcher_thread(THREAD_ENTRY_PARAM arg) -+ static void watcher_thread(EventManager* eventMgr) - { -- EventManager* const eventMgr = static_cast<EventManager*>(arg); - eventMgr->watcher_thread(); -- return 0; - } - - static void mutex_bugcheck(const TEXT*, int); -@@ -109,7 +108,7 @@ private: - Firebird::AutoPtr<Firebird::SharedMemory<evh> > m_sharedMemory; - - Firebird::Semaphore m_startupSemaphore; -- Firebird::Semaphore m_cleanupSemaphore; -+ ThreadFinishSync<EventManager*> m_cleanupSync; - - bool m_sharedFileCreated; - bool m_exiting; -diff --git a/src/jrd/intl.cpp b/src/jrd/intl.cpp -index 6666c5f..b0e662b 100644 ---- a/src/jrd/intl.cpp -+++ b/src/jrd/intl.cpp -@@ -104,7 +104,6 @@ - #include "../intl/charsets.h" - #include "../intl/country_codes.h" - #include "../common/gdsassert.h" --//#include "../jrd/license.h" - #ifdef INTL_BUILTIN - #include "../intl/ld_proto.h" - #endif -diff --git a/src/jrd/trace/TraceConfigStorage.h b/src/jrd/trace/TraceConfigStorage.h -index ca973c0..3d08143 100644 ---- a/src/jrd/trace/TraceConfigStorage.h -+++ b/src/jrd/trace/TraceConfigStorage.h -@@ -32,6 +32,7 @@ - #include "../../common/classes/fb_string.h" - #include "../../common/classes/init.h" - #include "../../common/isc_s_proto.h" -+#include "../../common/ThreadStart.h" - #include "../../jrd/trace/TraceSession.h" - #include "../../common/classes/RefCounted.h" - -diff --git a/src/jrd/vio.cpp b/src/jrd/vio.cpp -index 02c5809..8ca9f66 100644 ---- a/src/jrd/vio.cpp -+++ b/src/jrd/vio.cpp -@@ -107,7 +107,6 @@ static bool dfw_should_know(record_param* org_rpb, record_param* new_rpb, - USHORT irrelevant_field, bool void_update_is_relevant = false); - static void garbage_collect(thread_db*, record_param*, ULONG, RecordStack&); - static void garbage_collect_idx(thread_db*, record_param*, Record*, Record*); --static THREAD_ENTRY_DECLARE garbage_collector(THREAD_ENTRY_PARAM); - - - #ifdef VIO_DEBUG -@@ -1958,7 +1957,7 @@ void VIO_fini(thread_db* tdbb) - { - dbb->dbb_flags &= ~DBB_garbage_collector; - dbb->dbb_gc_sem.release(); // Wake up running thread -- dbb->dbb_gc_fini.enter(); -+ dbb->dbb_gc_fini.waitForCompletion(); - } - } - -@@ -2420,7 +2419,7 @@ void VIO_init(thread_db* tdbb) - { - try - { -- Thread::start(garbage_collector, dbb, THREAD_medium); -+ dbb->dbb_gc_fini.run(dbb); - } - catch (const Exception&) - { -@@ -4741,7 +4740,7 @@ static void garbage_collect_idx(thread_db* tdbb, - } - - --static THREAD_ENTRY_DECLARE garbage_collector(THREAD_ENTRY_PARAM arg) -+void Database::garbage_collector(Database* dbb) - { - /************************************** - * -@@ -4758,7 +4757,6 @@ static THREAD_ENTRY_DECLARE garbage_collector(THREAD_ENTRY_PARAM arg) - * - **************************************/ - FbLocalStatus status_vector; -- Database* const dbb = (Database*) arg; - - try - { -@@ -4989,8 +4987,7 @@ static THREAD_ENTRY_DECLARE garbage_collector(THREAD_ENTRY_PARAM arg) - } // try - catch (const Firebird::Exception& ex) - { -- ex.stuffException(&status_vector); -- iscDbLogStatus(dbb->dbb_filename.c_str(), &status_vector); -+ dbb->exceptionHandler(ex, NULL); - } - - dbb->dbb_flags &= ~(DBB_garbage_collector | DBB_gc_active | DBB_gc_pending); -@@ -5003,15 +5000,19 @@ static THREAD_ENTRY_DECLARE garbage_collector(THREAD_ENTRY_PARAM arg) - dbb->dbb_flags &= ~DBB_gc_starting; - dbb->dbb_gc_init.release(); - } -- dbb->dbb_gc_fini.release(); - } - catch (const Firebird::Exception& ex) - { -- ex.stuffException(&status_vector); -- iscDbLogStatus(dbb->dbb_filename.c_str(), &status_vector); -+ dbb->exceptionHandler(ex, NULL); - } -+} -+ - -- return 0; -+void Database::exceptionHandler(const Firebird::Exception& ex, ThreadFinishSync<Database*>::ThreadRoutine* /*routine*/) -+{ -+ FbLocalStatus status_vector; -+ ex.stuffException(&status_vector); -+ iscDbLogStatus(dbb_filename.c_str(), &status_vector); - } - - -diff --git a/src/lock/lock.cpp b/src/lock/lock.cpp -index 89eb4c5..2ab3358 100644 ---- a/src/lock/lock.cpp -+++ b/src/lock/lock.cpp -@@ -214,6 +214,7 @@ LockManager::LockManager(const Firebird::string& id, RefPtr<Config> conf) - m_sharedFileCreated(false), - m_process(NULL), - m_processOffset(0), -+ m_cleanupSync(getPool(), blocking_action_thread, THREAD_high), - m_sharedMemory(NULL), - m_blockage(false), - m_dbId(getPool(), id), -@@ -259,7 +260,7 @@ LockManager::~LockManager() - m_sharedMemory->eventPost(&m_process->prc_blocking); - - // Wait for the AST thread to finish cleanup or for 5 seconds -- m_cleanupSemaphore.tryEnter(5); -+ m_cleanupSync.waitForCompletion(); - } - - #ifdef HAVE_OBJECT_MAP -@@ -1548,16 +1549,22 @@ void LockManager::blocking_action_thread() - { - iscLogException("Error in blocking action thread\n", x); - } -+} - -- try -- { -- // Wakeup the main thread waiting for our exit -- m_cleanupSemaphore.release(); -- } -- catch (const Firebird::Exception& x) -- { -- iscLogException("Error closing blocking action thread\n", x); -- } -+ -+void LockManager::exceptionHandler(const Firebird::Exception& ex, ThreadFinishSync<LockManager*>::ThreadRoutine* /*routine*/) -+{ -+/************************************** -+ * -+ * e x c e p t i o n H a n d l e r -+ * -+ ************************************** -+ * -+ * Functional description -+ * Handler for blocking thread close bugs. -+ * -+ **************************************/ -+ iscLogException("Error closing blocking action thread\n", ex); - } - - -@@ -1815,7 +1822,7 @@ bool LockManager::create_process(CheckStatusWrapper* statusVector) - { - try - { -- Thread::start(blocking_action_thread, this, THREAD_high); -+ m_cleanupSync.run(this); - } - catch (const Exception& ex) - { -diff --git a/src/lock/lock_proto.h b/src/lock/lock_proto.h -index d991c1e..2faec49 100644 ---- a/src/lock/lock_proto.h -+++ b/src/lock/lock_proto.h -@@ -418,6 +418,8 @@ public: - SINT64 readData2(USHORT, const UCHAR*, USHORT, SRQ_PTR); - SINT64 writeData(SRQ_PTR, SINT64); - -+ void exceptionHandler(const Firebird::Exception& ex, ThreadFinishSync<LockManager*>::ThreadRoutine* routine); -+ - private: - explicit LockManager(const Firebird::string&, Firebird::RefPtr<Config>); - ~LockManager(); -@@ -471,11 +473,9 @@ private: - void detach_shared_file(Firebird::CheckStatusWrapper*); - void get_shared_file_name(Firebird::PathName&, ULONG extend = 0) const; - -- static THREAD_ENTRY_DECLARE blocking_action_thread(THREAD_ENTRY_PARAM arg) -+ static void blocking_action_thread(LockManager* lockMgr) - { -- LockManager* const lockMgr = static_cast<LockManager*>(arg); - lockMgr->blocking_action_thread(); -- return 0; - } - - bool initialize(Firebird::SharedMemoryBase* sm, bool init); -@@ -490,7 +490,7 @@ private: - Firebird::RWLock m_remapSync; - Firebird::AtomicCounter m_waitingOwners; - -- Firebird::Semaphore m_cleanupSemaphore; -+ ThreadFinishSync<LockManager*> m_cleanupSync; - Firebird::Semaphore m_startupSemaphore; - - public: -diff --git a/src/qli/command.cpp b/src/qli/command.cpp -index 5f949f3..fbbf4fb 100644 ---- a/src/qli/command.cpp -+++ b/src/qli/command.cpp -@@ -30,7 +30,6 @@ - #include "../qli/parse.h" - #include "../qli/compile.h" - #include "../qli/exe.h" --//#include "../jrd/license.h" - #include "../qli/all_proto.h" - #include "../qli/err_proto.h" - #include "../qli/exe_proto.h" -diff --git a/src/qli/dtr.h b/src/qli/dtr.h -index ba5cd64..e246ef4 100644 ---- a/src/qli/dtr.h -+++ b/src/qli/dtr.h -@@ -480,7 +480,6 @@ struct qli_fun - }; - - // Program wide globals --//#include <setjmp.h> - - #ifdef QLI_MAIN - #define EXTERN -diff --git a/src/qli/lex.cpp b/src/qli/lex.cpp -index c20d1f9..9e26046 100644 ---- a/src/qli/lex.cpp -+++ b/src/qli/lex.cpp -@@ -50,10 +50,6 @@ using MsgFormat::SafeArg; - #include <unistd.h> - #endif - --//#ifdef HAVE_CTYPES_H --//#include <ctypes.h> --//#endif -- - #ifdef HAVE_IO_H - #include <io.h> // isatty - #endif -diff --git a/src/qli/meta.epp b/src/qli/meta.epp -index a7f222c..2d55716 100644 ---- a/src/qli/meta.epp -+++ b/src/qli/meta.epp -@@ -28,7 +28,6 @@ - #include "../qli/dtr.h" - #include "../qli/compile.h" - #include "../qli/exe.h" --//#include "../jrd/license.h" - #include "../jrd/flags.h" - #include "../jrd/ibase.h" - #include "../qli/reqs.h" -diff --git a/src/utilities/gsec/gsecswi.h b/src/utilities/gsec/gsecswi.h -index b8519f5..9b560e3 100644 ---- a/src/utilities/gsec/gsecswi.h -+++ b/src/utilities/gsec/gsecswi.h -@@ -24,7 +24,6 @@ - #ifndef GSEC_GSECSWI_H - #define GSEC_GSECSWI_H - --//#include "../common/common.h" - #include "../jrd/constants.h" - - /* Switch handling constants. Note that the first IN_SW_DATA_ITEMS -diff --git a/src/utilities/gstat/dba.epp b/src/utilities/gstat/dba.epp -index 379b418..19b99d1 100644 ---- a/src/utilities/gstat/dba.epp -+++ b/src/utilities/gstat/dba.epp -@@ -56,6 +56,7 @@ - #include "../common/classes/UserBlob.h" - #include "../common/os/os_utils.h" - #include "../common/StatusHolder.h" -+#include "../common/ThreadStart.h" - - using MsgFormat::SafeArg; - -diff --git a/src/utilities/nbackup/nbkswi.h b/src/utilities/nbackup/nbkswi.h -index 4326c3d..b8d43da 100644 ---- a/src/utilities/nbackup/nbkswi.h -+++ b/src/utilities/nbackup/nbkswi.h -@@ -27,7 +27,6 @@ - #ifndef NBACKUP_NBKSWI_H - #define NBACKUP_NBKSWI_H - --//#include "../common/common.h" - #include "../jrd/constants.h" - - // Switch handling constants -diff --git a/src/utilities/ntrace/os/win32/FileObject.cpp b/src/utilities/ntrace/os/win32/FileObject.cpp -index 73ed38f..53fbfc0 100644 ---- a/src/utilities/ntrace/os/win32/FileObject.cpp -+++ b/src/utilities/ntrace/os/win32/FileObject.cpp -@@ -27,7 +27,6 @@ - - #include "firebird.h" - #include "../FileObject.h" --//#include "../common/classes/locks.h" - - using namespace Firebird; - Firebird::Mutex open_mutex; -diff --git a/src/yvalve/gds.cpp b/src/yvalve/gds.cpp -index c851f7c..998bbde 100644 ---- a/src/yvalve/gds.cpp -+++ b/src/yvalve/gds.cpp -@@ -57,6 +57,7 @@ - #include "../common/classes/init.h" - #include "../common/classes/TempFile.h" - #include "../common/utils_proto.h" -+#include "../common/ThreadStart.h" - - #ifdef HAVE_UNISTD_H - #include <unistd.h> -diff --git a/src/yvalve/preparse.cpp b/src/yvalve/preparse.cpp -index b2335a5..e742784 100644 ---- a/src/yvalve/preparse.cpp -+++ b/src/yvalve/preparse.cpp -@@ -25,7 +25,6 @@ - #include "firebird.h" - #include <stdlib.h> - #include <string.h> --//#include "../dsql/chars.h" - #include "../yvalve/prepa_proto.h" - #include "../yvalve/gds_proto.h" - #include "../yvalve/YObjects.h" ---- a/src/common/isc_sync.cpp -+++ b/src/common/isc_sync.cpp -@@ -67,6 +67,7 @@ - #include "../common/classes/RefMutex.h" - #include "../common/classes/array.h" - #include "../common/StatusHolder.h" -+#include "../common/ThreadStart.h" - - static int process_id; - --- -2.9.3 - |