[Libreoffice-commits] core.git: Branch 'libreoffice-5-3' - external/firebird

Stephan Bergmann sbergman at redhat.com
Wed Feb 15 17:02:39 UTC 2017


 external/firebird/0001-Avoid-hangup-in-SS-when-error-happens-at-system-atta.patch.1 |   51 
 external/firebird/0002-Backported-fix-for-CORE-5452-Segfault-when-engine-s-.patch.1 | 1013 ++++++++++
 external/firebird/UnpackedTarball_firebird.mk                                       |    2 
 3 files changed, 1066 insertions(+)

New commits:
commit ae318272cf19134dd020e1755ddbb480fb2b721f
Author: Stephan Bergmann <sbergman at redhat.com>
Date:   Mon Jan 16 21:35:20 2017 +0100

    external/firebird: Backport fix for CORE-5452 causing spurious SEGV
    
    ...while building LO.  Patches from <https://github.com/FirebirdSQL/firebird>'s
    B3_0_Release branch; to apply, 0002 needed 0001 first (which looks like a
    reasonable thing to include in itself, anyway), plus a trivial whitespace
    modification, plus an additional #include for Windows.
    
    Reviewed-on: https://gerrit.libreoffice.org/33186
    Reviewed-by: Stephan Bergmann <sbergman at redhat.com>
    Tested-by: Stephan Bergmann <sbergman at redhat.com>
    
    (cherry picked from commit 592f4f6a5941e42e6b2b3fa76e74b8ad509724c9)
    Change-Id: Idd2e326432fa52762742a168c7e880a9c6fb650c
    Reviewed-on: https://gerrit.libreoffice.org/34305
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

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 at 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 at 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)


More information about the Libreoffice-commits mailing list