mirror of
https://github.com/FirebirdSQL/firebird.git
synced 2025-01-24 02:03:03 +01:00
Backported fix for CORE-900: Deadlock when attaching simultaneously with services and standard APIs
This commit is contained in:
parent
a3c4fe1f4d
commit
66625457d4
@ -183,15 +183,45 @@ const SSHORT WAIT_PERIOD = -1;
|
|||||||
#ifdef SUPERSERVER
|
#ifdef SUPERSERVER
|
||||||
|
|
||||||
extern SLONG trace_pools;
|
extern SLONG trace_pools;
|
||||||
static REC_MUTX_T databases_rec_mutex;
|
|
||||||
|
|
||||||
// BRS. 03/23/2003
|
// BRS. 03/23/2003
|
||||||
// Those empty defines was substituted with #if defined(V4_THREADING) && !defined(SUPERSERVER)
|
// Those empty defines was substituted with #if defined(V4_THREADING) && !defined(SUPERSERVER)
|
||||||
//#define V4_JRD_MUTEX_LOCK(mutx)
|
//#define V4_JRD_MUTEX_LOCK(mutx)
|
||||||
//#define V4_JRD_MUTEX_UNLOCK(mutx)
|
//#define V4_JRD_MUTEX_UNLOCK(mutx)
|
||||||
|
|
||||||
#define JRD_SS_INIT_MUTEX THD_rec_mutex_init (&databases_rec_mutex)
|
namespace
|
||||||
#define JRD_SS_DESTROY_MUTEX THD_rec_mutex_destroy (&databases_rec_mutex)
|
{
|
||||||
|
REC_MUTX_T databases_rec_mutex;
|
||||||
|
|
||||||
|
class DatabasesInit
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static void init()
|
||||||
|
{
|
||||||
|
THD_rec_mutex_init(&databases_rec_mutex);
|
||||||
|
}
|
||||||
|
static void cleanup()
|
||||||
|
{
|
||||||
|
THD_rec_mutex_destroy(&databases_rec_mutex);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class DatabasesInitInstance : public Firebird::InitMutex<DatabasesInit>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DatabasesInitInstance()
|
||||||
|
{
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
~DatabasesInitInstance()
|
||||||
|
{
|
||||||
|
cleanup();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
DatabasesInitInstance holder;
|
||||||
|
}
|
||||||
|
|
||||||
#define JRD_SS_MUTEX_LOCK {THREAD_EXIT();\
|
#define JRD_SS_MUTEX_LOCK {THREAD_EXIT();\
|
||||||
THD_rec_mutex_lock (&databases_rec_mutex);\
|
THD_rec_mutex_lock (&databases_rec_mutex);\
|
||||||
THREAD_ENTER();}
|
THREAD_ENTER();}
|
||||||
@ -200,8 +230,6 @@ static REC_MUTX_T databases_rec_mutex;
|
|||||||
#define JRD_SS_THD_MUTEX_UNLOCK THD_rec_mutex_unlock (&databases_rec_mutex)
|
#define JRD_SS_THD_MUTEX_UNLOCK THD_rec_mutex_unlock (&databases_rec_mutex)
|
||||||
|
|
||||||
#else
|
#else
|
||||||
#define JRD_SS_INIT_MUTEX
|
|
||||||
#define JRD_SS_DESTROY_MUTEX
|
|
||||||
#define JRD_SS_MUTEX_LOCK
|
#define JRD_SS_MUTEX_LOCK
|
||||||
#define JRD_SS_MUTEX_UNLOCK
|
#define JRD_SS_MUTEX_UNLOCK
|
||||||
#define JRD_SS_THD_MUTEX_LOCK
|
#define JRD_SS_THD_MUTEX_LOCK
|
||||||
@ -3453,16 +3481,20 @@ ISC_STATUS GDS_SERVICE_ATTACH(ISC_STATUS* user_status,
|
|||||||
|
|
||||||
tdbb->tdbb_status_vector = user_status;
|
tdbb->tdbb_status_vector = user_status;
|
||||||
tdbb->tdbb_database = NULL;
|
tdbb->tdbb_database = NULL;
|
||||||
|
|
||||||
|
JRD_SS_MUTEX_LOCK;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
*svc_handle = SVC_attach(service_length, service_name, spb_length, spb);
|
*svc_handle = SVC_attach(service_length, service_name, spb_length, spb);
|
||||||
}
|
}
|
||||||
catch (const std::exception& ex)
|
catch (const std::exception& ex)
|
||||||
{
|
{
|
||||||
|
JRD_SS_MUTEX_UNLOCK;
|
||||||
return error(user_status, ex);
|
return error(user_status, ex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
JRD_SS_MUTEX_UNLOCK;
|
||||||
return return_success(tdbb);
|
return return_success(tdbb);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4819,7 +4851,6 @@ static void cleanup(void* arg)
|
|||||||
#if defined(V4_THREADING) && !defined(SUPERSERVER)
|
#if defined(V4_THREADING) && !defined(SUPERSERVER)
|
||||||
V4_MUTEX_DESTROY(databases_mutex);
|
V4_MUTEX_DESTROY(databases_mutex);
|
||||||
#endif
|
#endif
|
||||||
JRD_SS_DESTROY_MUTEX;
|
|
||||||
initialized = false;
|
initialized = false;
|
||||||
databases = NULL;
|
databases = NULL;
|
||||||
}
|
}
|
||||||
@ -5526,7 +5557,6 @@ static Database* init(thread_db* tdbb,
|
|||||||
#if defined(V4_THREADING) && !defined(SUPERSERVER)
|
#if defined(V4_THREADING) && !defined(SUPERSERVER)
|
||||||
V4_MUTEX_INIT(databases_mutex);
|
V4_MUTEX_INIT(databases_mutex);
|
||||||
#endif
|
#endif
|
||||||
JRD_SS_INIT_MUTEX;
|
|
||||||
gds__register_cleanup(cleanup, 0);
|
gds__register_cleanup(cleanup, 0);
|
||||||
initialized = true;
|
initialized = true;
|
||||||
JRD_cache_default = Config::getDefaultDbCachePages();
|
JRD_cache_default = Config::getDefaultDbCachePages();
|
||||||
|
Loading…
Reference in New Issue
Block a user