mirror of
https://github.com/FirebirdSQL/firebird.git
synced 2025-01-23 19:23:03 +01:00
Backport from master:
Remove not necessary sync points - dbb_threads_sync and dbb_lck_sync
This commit is contained in:
parent
ef980a2015
commit
8ca97fb718
@ -601,9 +601,6 @@ void Jrd::Attachment::detachLocks()
|
||||
if (!att_long_locks)
|
||||
return;
|
||||
|
||||
Sync lckSync(&att_database->dbb_lck_sync, "Attachment::detachLocks");
|
||||
lckSync.lock(SYNC_EXCLUSIVE);
|
||||
|
||||
Lock* long_lock = att_long_locks;
|
||||
while (long_lock)
|
||||
long_lock = long_lock->detach();
|
||||
|
@ -96,14 +96,6 @@ namespace Jrd
|
||||
delete dbb_monitoring_data;
|
||||
delete dbb_backup_manager;
|
||||
delete dbb_crypto_manager;
|
||||
|
||||
while (dbb_active_threads)
|
||||
{
|
||||
thread_db* tdbb = dbb_active_threads;
|
||||
tdbb->deactivate();
|
||||
tdbb->setDatabase(NULL);
|
||||
}
|
||||
|
||||
delete dbb_tip_cache;
|
||||
|
||||
fb_assert(!locked());
|
||||
|
@ -370,7 +370,6 @@ public:
|
||||
|
||||
Firebird::SyncObject dbb_sync;
|
||||
Firebird::SyncObject dbb_sys_attach; // synchronize operations with dbb_sys_attachments
|
||||
Firebird::SyncObject dbb_lck_sync; // synchronize operations with att_long_locks at different attachments
|
||||
|
||||
MemoryPool* dbb_permanent;
|
||||
|
||||
@ -431,9 +430,6 @@ public:
|
||||
Firebird::SyncObject dbb_sortbuf_sync;
|
||||
Firebird::Array<UCHAR*> dbb_sort_buffers; // sort buffers ready for reuse
|
||||
|
||||
Firebird::SyncObject dbb_threads_sync;
|
||||
thread_db* dbb_active_threads;
|
||||
|
||||
TraNumber dbb_oldest_active; // Cached "oldest active" transaction
|
||||
TraNumber dbb_oldest_transaction; // Cached "oldest interesting" transaction
|
||||
TraNumber dbb_oldest_snapshot; // Cached "oldest snapshot" of all active transactions
|
||||
|
@ -7447,16 +7447,8 @@ void thread_db::setDatabase(Database* val)
|
||||
{
|
||||
if (database != val)
|
||||
{
|
||||
const bool wasActive = database && (priorThread || nextThread || database->dbb_active_threads == this);
|
||||
|
||||
if (wasActive)
|
||||
deactivate();
|
||||
|
||||
database = val;
|
||||
dbbStat = val ? &val->dbb_stats : RuntimeStatistics::getDummy();
|
||||
|
||||
if (wasActive)
|
||||
activate();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -381,7 +381,6 @@ private:
|
||||
jrd_tra* transaction;
|
||||
jrd_req* request;
|
||||
RuntimeStatistics *reqStat, *traStat, *attStat, *dbbStat;
|
||||
thread_db *priorThread, *nextThread;
|
||||
|
||||
public:
|
||||
explicit thread_db(FbStatusVector* status)
|
||||
@ -391,8 +390,6 @@ public:
|
||||
attachment(NULL),
|
||||
transaction(NULL),
|
||||
request(NULL),
|
||||
priorThread(NULL),
|
||||
nextThread(NULL),
|
||||
tdbb_status_vector(status),
|
||||
tdbb_quantum(QUANTUM),
|
||||
tdbb_flags(0),
|
||||
@ -578,54 +575,6 @@ public:
|
||||
return true;
|
||||
}
|
||||
|
||||
void activate()
|
||||
{
|
||||
fb_assert(!priorThread && !nextThread);
|
||||
|
||||
if (database)
|
||||
{
|
||||
Firebird::SyncLockGuard sync(&database->dbb_threads_sync, Firebird::SYNC_EXCLUSIVE,
|
||||
"thread_db::activate");
|
||||
|
||||
if (database->dbb_active_threads)
|
||||
{
|
||||
fb_assert(!database->dbb_active_threads->priorThread);
|
||||
database->dbb_active_threads->priorThread = this;
|
||||
nextThread = database->dbb_active_threads;
|
||||
}
|
||||
|
||||
database->dbb_active_threads = this;
|
||||
}
|
||||
}
|
||||
|
||||
void deactivate()
|
||||
{
|
||||
if (database)
|
||||
{
|
||||
Firebird::SyncLockGuard sync(&database->dbb_threads_sync, Firebird::SYNC_EXCLUSIVE,
|
||||
"thread_db::deactivate");
|
||||
|
||||
if (nextThread)
|
||||
{
|
||||
fb_assert(nextThread->priorThread == this);
|
||||
nextThread->priorThread = priorThread;
|
||||
}
|
||||
|
||||
if (priorThread)
|
||||
{
|
||||
fb_assert(priorThread->nextThread == this);
|
||||
priorThread->nextThread = nextThread;
|
||||
}
|
||||
else
|
||||
{
|
||||
fb_assert(database->dbb_active_threads == this);
|
||||
database->dbb_active_threads = nextThread;
|
||||
}
|
||||
}
|
||||
|
||||
priorThread = nextThread = NULL;
|
||||
}
|
||||
|
||||
void resetStack()
|
||||
{
|
||||
if (tdbb_flags & TDBB_reset_stack)
|
||||
@ -860,23 +809,13 @@ namespace Jrd {
|
||||
{
|
||||
public:
|
||||
explicit DatabaseContextHolder(thread_db* tdbb)
|
||||
: Jrd::ContextPoolHolder(tdbb, tdbb->getDatabase()->dbb_permanent),
|
||||
savedTdbb(tdbb)
|
||||
{
|
||||
savedTdbb->activate();
|
||||
}
|
||||
|
||||
~DatabaseContextHolder()
|
||||
{
|
||||
savedTdbb->deactivate();
|
||||
}
|
||||
: Jrd::ContextPoolHolder(tdbb, tdbb->getDatabase()->dbb_permanent)
|
||||
{}
|
||||
|
||||
private:
|
||||
// copying is prohibited
|
||||
DatabaseContextHolder(const DatabaseContextHolder&);
|
||||
DatabaseContextHolder& operator=(const DatabaseContextHolder&);
|
||||
|
||||
thread_db* const savedTdbb;
|
||||
};
|
||||
|
||||
class BackgroundContextHolder : public ThreadContextHolder, public DatabaseContextHolder,
|
||||
|
@ -70,6 +70,7 @@ static void internal_dequeue(thread_db*, Lock*);
|
||||
static USHORT internal_downgrade(thread_db*, CheckStatusWrapper*, Lock*);
|
||||
static bool internal_enqueue(thread_db*, CheckStatusWrapper*, Lock*, USHORT, SSHORT, bool);
|
||||
static SLONG get_owner_handle(thread_db* tdbb, enum lck_t lock_type);
|
||||
static lck_owner_t get_owner_type(enum lck_t lock_type);
|
||||
|
||||
#ifdef DEBUG_LCK
|
||||
namespace
|
||||
@ -508,6 +509,33 @@ static SLONG get_owner_handle(thread_db* tdbb, enum lck_t lock_type)
|
||||
|
||||
SLONG handle = 0;
|
||||
|
||||
switch (get_owner_type(lock_type))
|
||||
{
|
||||
case LCK_OWNER_database:
|
||||
handle = *LCK_OWNER_HANDLE_DBB(tdbb);
|
||||
break;
|
||||
|
||||
case LCK_OWNER_attachment:
|
||||
handle = *LCK_OWNER_HANDLE_ATT(tdbb);
|
||||
break;
|
||||
|
||||
default:
|
||||
bug_lck("Invalid lock owner type in get_owner_handle()");
|
||||
}
|
||||
|
||||
if (!handle)
|
||||
{
|
||||
bug_lck("Invalid lock owner handle");
|
||||
}
|
||||
|
||||
return handle;
|
||||
}
|
||||
|
||||
|
||||
static lck_owner_t get_owner_type(enum lck_t lock_type)
|
||||
{
|
||||
lck_owner_t owner_type;
|
||||
|
||||
switch (lock_type)
|
||||
{
|
||||
case LCK_database:
|
||||
@ -519,7 +547,7 @@ static SLONG get_owner_handle(thread_db* tdbb, enum lck_t lock_type)
|
||||
case LCK_sweep:
|
||||
case LCK_crypt:
|
||||
case LCK_crypt_status:
|
||||
handle = *LCK_OWNER_HANDLE_DBB(tdbb);
|
||||
owner_type = LCK_OWNER_database;
|
||||
break;
|
||||
|
||||
case LCK_attachment:
|
||||
@ -543,19 +571,14 @@ static SLONG get_owner_handle(thread_db* tdbb, enum lck_t lock_type)
|
||||
case LCK_btr_dont_gc:
|
||||
case LCK_rel_gc:
|
||||
case LCK_record_gc:
|
||||
handle = *LCK_OWNER_HANDLE_ATT(tdbb);
|
||||
owner_type = LCK_OWNER_attachment;
|
||||
break;
|
||||
|
||||
default:
|
||||
bug_lck("Invalid lock type in get_owner_handle()");
|
||||
bug_lck("Invalid lock type in get_owner_type()");
|
||||
}
|
||||
|
||||
if (!handle)
|
||||
{
|
||||
bug_lck("Invalid lock owner handle");
|
||||
}
|
||||
|
||||
return handle;
|
||||
return owner_type;
|
||||
}
|
||||
|
||||
|
||||
@ -1473,20 +1496,20 @@ Lock::Lock(thread_db* tdbb, USHORT length, lck_t type, void* object, lock_ast_t
|
||||
|
||||
void Lock::setLockAttachment(thread_db* tdbb, Jrd::Attachment* attachment)
|
||||
{
|
||||
if (get_owner_type(lck_type) == LCK_OWNER_database)
|
||||
return;
|
||||
|
||||
SET_TDBB(tdbb);
|
||||
Database* dbb = tdbb->getDatabase();
|
||||
fb_assert(dbb);
|
||||
if (!dbb)
|
||||
return;
|
||||
|
||||
Sync lckSync(&dbb->dbb_lck_sync, "setLockAttachment");
|
||||
lckSync.lock(SYNC_EXCLUSIVE);
|
||||
|
||||
Attachment* att = lck_attachment ? lck_attachment->getHandle() : NULL;
|
||||
if (att == attachment)
|
||||
return;
|
||||
|
||||
// If lock has an attachment it must not be a part of linked list
|
||||
// If lock has no attachment it must not be a part of linked list
|
||||
fb_assert(!lck_attachment ? !lck_prior && !lck_next : true);
|
||||
|
||||
// Delist in old attachment
|
||||
|
Loading…
Reference in New Issue
Block a user