From 5f1acca43413c76c5a13c8e111780fd02ae99353 Mon Sep 17 00:00:00 2001 From: totaj Date: Sat, 18 May 2024 16:00:16 +0800 Subject: [PATCH] Fix mutex lock when load library. --- src/common/backend/utils/fmgr/dfmgr.cpp | 2 +- .../backend/utils/resowner/resowner.cpp | 3 +++ .../runtime/executor/execUtils.cpp | 23 +++++++++++++++---- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/common/backend/utils/fmgr/dfmgr.cpp b/src/common/backend/utils/fmgr/dfmgr.cpp index b0d56ef6c..38e45df86 100644 --- a/src/common/backend/utils/fmgr/dfmgr.cpp +++ b/src/common/backend/utils/fmgr/dfmgr.cpp @@ -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; } diff --git a/src/common/backend/utils/resowner/resowner.cpp b/src/common/backend/utils/resowner/resowner.cpp index 9eb9b8787..5e8c7b6f1 100755 --- a/src/common/backend/utils/resowner/resowner.cpp +++ b/src/common/backend/utils/resowner/resowner.cpp @@ -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; diff --git a/src/gausskernel/runtime/executor/execUtils.cpp b/src/gausskernel/runtime/executor/execUtils.cpp index 3b0254c6e..9792d66cd 100644 --- a/src/gausskernel/runtime/executor/execUtils.cpp +++ b/src/gausskernel/runtime/executor/execUtils.cpp @@ -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;