diff options
author | Christoph Willing <chris.willing@iinet.net.au> | 2017-02-15 13:01:34 +1000 |
---|---|---|
committer | Willy Sudiarto Raharjo <willysr@slackbuilds.org> | 2017-02-18 07:54:40 +0700 |
commit | b621ff6cd78034f6423ff3062af8e351a0a97966 (patch) | |
tree | 54eb6a18f95235b4e3912f4fd01b7a50e88ba93d /office/LibreOffice/firebird.diff | |
parent | bc56dbdd7001c81d56e29b32e7276903f81b65cd (diff) | |
download | slackbuilds-b621ff6cd78034f6423ff3062af8e351a0a97966.tar.gz |
office/LibreOffice: Upstream patch for firebird build race
Signed-off-by: Christoph Willing <chris.willing@iinet.net.au>
Diffstat (limited to 'office/LibreOffice/firebird.diff')
-rw-r--r-- | office/LibreOffice/firebird.diff | 1091 |
1 files changed, 1091 insertions, 0 deletions
diff --git a/office/LibreOffice/firebird.diff b/office/LibreOffice/firebird.diff new file mode 100644 index 0000000000..49bc2750c4 --- /dev/null +++ b/office/LibreOffice/firebird.diff @@ -0,0 +1,1091 @@ +diff --git a/external/firebird/0001-Avoid-hangup-in-SS-when-error-happens-at-system-atta.patch.1 b/external/firebird/0001-Avoid-hangup-in-SS-when-error-happens-at-system-atta.patch.1 +new file mode 100644 +index 0000000..e569fcc +--- /dev/null ++++ b/external/firebird/0001-Avoid-hangup-in-SS-when-error-happens-at-system-atta.patch.1 +@@ -0,0 +1,51 @@ ++From 36a7a2634669075be3294a1d075524a0b6f80962 Mon Sep 17 00:00:00 2001 ++From: hvlad <hvlad@users.sourceforge.net> ++Date: Wed, 17 Aug 2016 15:45:30 +0300 ++Subject: [PATCH] Avoid hangup in SS when error happens at system attachment ++ initialization time ++ ++--- ++ src/jrd/cch.cpp | 7 ++++++- ++ src/jrd/vio.cpp | 5 +++++ ++ 2 files changed, 11 insertions(+), 1 deletion(-) ++ ++diff --git a/src/jrd/cch.cpp b/src/jrd/cch.cpp ++index 35ea096..643cf4d 100644 ++--- a/src/jrd/cch.cpp +++++ b/src/jrd/cch.cpp ++@@ -2963,10 +2963,15 @@ static THREAD_ENTRY_DECLARE cache_writer(THREAD_ENTRY_PARAM arg) ++ iscDbLogStatus(dbb->dbb_filename.c_str(), &status_vector); ++ } ++ ++- bcb->bcb_flags &= ~(BCB_cache_writer | BCB_writer_start); +++ bcb->bcb_flags &= ~BCB_cache_writer; ++ ++ try ++ { +++ if (bcb->bcb_flags & BCB_writer_start) +++ { +++ bcb->bcb_flags &= ~BCB_writer_start; +++ bcb->bcb_writer_init.release(); +++ } ++ bcb->bcb_writer_fini.release(); ++ } ++ catch (const Firebird::Exception& ex) ++diff --git a/src/jrd/vio.cpp b/src/jrd/vio.cpp ++index a8cf0fc..3d35a27 100644 ++--- a/src/jrd/vio.cpp +++++ b/src/jrd/vio.cpp ++@@ -4988,6 +4988,11 @@ static THREAD_ENTRY_DECLARE garbage_collector(THREAD_ENTRY_PARAM arg) ++ try ++ { ++ // Notify the finalization caller that we're finishing. +++ if (dbb->dbb_flags & DBB_gc_starting) +++ { +++ dbb->dbb_flags &= ~DBB_gc_starting; +++ dbb->dbb_gc_init.release(); +++ } ++ dbb->dbb_gc_fini.release(); ++ } ++ catch (const Firebird::Exception& ex) ++-- ++2.9.3 ++ +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 +new file mode 100644 +index 0000000..c55df4d +--- /dev/null ++++ b/external/firebird/0002-Backported-fix-for-CORE-5452-Segfault-when-engine-s-.patch.1 +@@ -0,0 +1,1013 @@ ++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 ++ +diff --git a/external/firebird/UnpackedTarball_firebird.mk b/external/firebird/UnpackedTarball_firebird.mk +index b65d041..d62bad7 100644 +--- a/external/firebird/UnpackedTarball_firebird.mk ++++ b/external/firebird/UnpackedTarball_firebird.mk +@@ -22,6 +22,8 @@ $(eval $(call gb_UnpackedTarball_add_patches,firebird,\ + external/firebird/wnt-dbgutil.patch \ + external/firebird/debug-gfix-failure.patch \ + external/firebird/libc++.patch \ ++ external/firebird/0001-Avoid-hangup-in-SS-when-error-happens-at-system-atta.patch.1 \ ++ external/firebird/0002-Backported-fix-for-CORE-5452-Segfault-when-engine-s-.patch.1 \ + )) + + ifeq ($(OS)-$(COM),WNT-MSC) + +generated by cgit v0.10.2 at 2017-02-14 10:16:39 (GMT) |