Fix mutex lock when load library.
This commit is contained in:
@ -399,7 +399,7 @@ void* internal_load_library(const char* libname)
|
||||
u_sess->fmgr_cxt.file_init_tail = file_init_scanner;
|
||||
}
|
||||
|
||||
PthreadMutexUnlock(t_thrd.utils_cxt.CurrentResourceOwner, &file_list_lock, true);
|
||||
ResourceOwnerForgetIfExistPthreadMutex(t_thrd.utils_cxt.CurrentResourceOwner, &file_list_lock, true);
|
||||
|
||||
return file_scanner->handle;
|
||||
}
|
||||
|
||||
@ -2014,6 +2014,9 @@ void ResourceOwnerForgetPthreadRWlock(ResourceOwner owner, pthread_rwlock_t* pRW
|
||||
|
||||
int ResourceOwnerForgetIfExistPthreadMutex(ResourceOwner owner, pthread_mutex_t* pMutex, bool trace)
|
||||
{
|
||||
if (owner == NULL) {
|
||||
return PthreadMutexUnlock(owner, pMutex, trace);
|
||||
}
|
||||
pthread_mutex_t** mutexs = owner->pThdMutexs;
|
||||
int ns1 = owner->nPthreadMutex - 1;
|
||||
|
||||
|
||||
@ -2647,8 +2647,13 @@ int PthreadMutexLock(ResourceOwner owner, pthread_mutex_t* mutex, bool trace)
|
||||
ResourceOwnerEnlargePthreadMutex(owner);
|
||||
|
||||
int ret = pthread_mutex_lock(mutex);
|
||||
if (ret == 0 && trace && owner) {
|
||||
if (unlikely(ret != 0)) {
|
||||
ereport(ERROR, (errcode(ERRCODE_LOCK_NOT_AVAILABLE), errmsg("aquire mutex lock failed.")));
|
||||
}
|
||||
if (trace && owner) {
|
||||
ResourceOwnerRememberPthreadMutex(owner, mutex);
|
||||
} else {
|
||||
START_CRIT_SECTION();
|
||||
}
|
||||
RESUME_INTERRUPTS();
|
||||
return ret;
|
||||
@ -2661,8 +2666,12 @@ int PthreadMutexTryLock(ResourceOwner owner, pthread_mutex_t* mutex, bool trace)
|
||||
ResourceOwnerEnlargePthreadMutex(owner);
|
||||
|
||||
int ret = pthread_mutex_trylock(mutex);
|
||||
if (ret == 0 && trace && owner) {
|
||||
ResourceOwnerRememberPthreadMutex(owner, mutex);
|
||||
if (likely(ret == 0)) {
|
||||
if (trace && owner) {
|
||||
ResourceOwnerRememberPthreadMutex(owner, mutex);
|
||||
} else {
|
||||
START_CRIT_SECTION();
|
||||
}
|
||||
}
|
||||
RESUME_INTERRUPTS();
|
||||
return ret;
|
||||
@ -2672,8 +2681,14 @@ int PthreadMutexUnlock(ResourceOwner owner, pthread_mutex_t* mutex, bool trace)
|
||||
{
|
||||
HOLD_INTERRUPTS();
|
||||
int ret = pthread_mutex_unlock(mutex);
|
||||
if (ret == 0 && trace && owner)
|
||||
if (unlikely(ret != 0)) {
|
||||
ereport(ERROR, (errcode(ERRCODE_LOCK_NOT_AVAILABLE), errmsg("release mutex lock failed.")));
|
||||
}
|
||||
if (trace && owner) {
|
||||
ResourceOwnerForgetPthreadMutex(owner, mutex);
|
||||
} else {
|
||||
END_CRIT_SECTION();
|
||||
}
|
||||
RESUME_INTERRUPTS();
|
||||
|
||||
return ret;
|
||||
|
||||
Reference in New Issue
Block a user