From c4646977058b66c9f075602eb0cd90e01ec1502b Mon Sep 17 00:00:00 2001 From: alexpeshkoff Date: Mon, 4 Jun 2012 11:53:49 +0000 Subject: [PATCH] Fixed CORE-3859: Too many different dynamic events crash server --- src/jrd/event.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/jrd/event.cpp b/src/jrd/event.cpp index 7459b7b2918..bbc44946b5e 100644 --- a/src/jrd/event.cpp +++ b/src/jrd/event.cpp @@ -500,6 +500,10 @@ SLONG EVENT_que(ISC_STATUS* status_vector, } +// Protects EVENT_header from being changed by another thread +// when MUTEX is already passed to ISC_mutex_lock() +static Firebird::Mutex remapMutex; + static EVH acquire(void) { /************************************** @@ -513,6 +517,8 @@ static EVH acquire(void) * **************************************/ + Firebird::MutexLockGuard g(remapMutex); + int mutex_state; #ifdef MULTI_THREAD if (mutex_state = ISC_mutex_lock(MUTEX)) @@ -584,6 +590,8 @@ static FRB alloc_global(UCHAR type, ULONG length, bool recurse) } if (!best && !recurse) { + Firebird::MutexLockGuard g(remapMutex); + const SLONG old_length = EVENT_data.sh_mem_length_mapped; const SLONG ev_length = old_length + EVENT_EXTEND_SIZE;