Fix mutex lock when load library.

This commit is contained in:
totaj
2024-05-18 16:00:16 +08:00
committed by yaoxin
parent b8ecef3cc8
commit 5f1acca434
3 changed files with 23 additions and 5 deletions

View File

@ -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;
}

View File

@ -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;

View File

@ -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;