diff --git a/ldso/linux/dynlink.c b/ldso/linux/dynlink.c index a0105b6f7f609d0eb3a79fec4fe85b21ea670a86..1d687c63530d2152f966ee27a9c8f12759251e5e 100644 --- a/ldso/linux/dynlink.c +++ b/ldso/linux/dynlink.c @@ -4459,6 +4459,7 @@ static int do_dlclose(struct dso *p, bool check_deps_all) hidden int __dlclose(void *p) { pthread_mutex_lock(&dlclose_lock); + setDlcloseLockStatus(gettid()); int rc; pthread_rwlock_wrlock(&lock); if (shutting_down) { @@ -4482,6 +4483,8 @@ hidden int __dlclose(void *p) rc = do_dlclose(p, 0); #endif pthread_rwlock_unlock(&lock); + setDlcloseLockLastExitTid(gettid()); + setDlcloseLockStatus(0); pthread_mutex_unlock(&dlclose_lock); return rc; } @@ -4655,6 +4658,7 @@ no_redir: int dl_iterate_phdr(int(*callback)(struct dl_phdr_info *info, size_t size, void *data), void *data) { pthread_mutex_lock(&dlclose_lock); + setDlcloseLockStatus(gettid()); struct dso *current; struct dl_phdr_info info; int ret = 0; @@ -4679,6 +4683,8 @@ int dl_iterate_phdr(int(*callback)(struct dl_phdr_info *info, size_t size, void current = current->next; pthread_rwlock_unlock(&lock); } + setDlcloseLockLastExitTid(gettid()); + setDlcloseLockStatus(0); pthread_mutex_unlock(&dlclose_lock); return ret; } diff --git a/src/internal/pthread_impl.h b/src/internal/pthread_impl.h index 671ac61bde11bd3f7e31f9ed49538581467bc900..585eed4bc2a429628075dcf43077e55ae2d0f587 100644 --- a/src/internal/pthread_impl.h +++ b/src/internal/pthread_impl.h @@ -343,4 +343,9 @@ extern hidden unsigned __default_guardsize; hidden int __thread_clone(int (*func)(void *), int flags, struct pthread *thread, unsigned char *sp); #endif +extern hidden pid_t getDlcloseLockStatus(); +extern hidden pid_t getDlcloseLockLastExitTid(); +extern hidden void setDlcloseLockStatus(pid_t); +extern hidden void setDlcloseLockLastExitTid(pid_t); + #endif diff --git a/src/sigchain/linux/sigchain.c b/src/sigchain/linux/sigchain.c index d9dbef8e81edbc3b1d61ad14c061534731d11719..88158581e1bc8da96149bbf29dff8ee15f3ba9e1 100644 --- a/src/sigchain/linux/sigchain.c +++ b/src/sigchain/linux/sigchain.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -234,7 +234,9 @@ static void signal_chain_handler(int signo, siginfo_t* siginfo, void* ucontext_r "install_new_tls_tl_lock=%{public}d " "set_syscall_hooks_tl_lock=%{public}d " "set_syscall_hooks_linux_tl_lock=%{public}d " - "fork_tl_lock=%{public}d ", + "fork_tl_lock=%{public}d " + "g_dlcloseLockStatus=%{public}d" + "g_dlcloseLockLastExitTid=%{public}d", __func__, idx, signo, (unsigned long long)sig_chains[signo - 1].sca_special_actions[idx].sca_sigaction, noreturn, signo, thread_list_lock_status, get_tl_lock_count(), get_tl_lock_waiters(), get_tl_lock_tid_fail(), get_tl_lock_count_tid(), @@ -251,7 +253,9 @@ static void signal_chain_handler(int signo, siginfo_t* siginfo, void* ucontext_r call_tl_lock_dump->install_new_tls_tl_lock, call_tl_lock_dump->set_syscall_hooks_tl_lock, call_tl_lock_dump->set_syscall_hooks_linux_tl_lock, - call_tl_lock_dump->fork_tl_lock); + call_tl_lock_dump->fork_tl_lock, + getDlcloseLockStatus(), + getDlcloseLockLastExitTid()); if (sig_chains[signo - 1].sca_special_actions[idx].sca_sigaction(signo, siginfo, ucontext_raw)) { set_handling_signal(previous_value); diff --git a/src/thread/linux/pthread_create.c b/src/thread/linux/pthread_create.c index 60a9321afe2b5cef0f4ecc17dbebb616eafb8177..25af614a708c8c570bff7433e5cf526eb8698f7d 100644 --- a/src/thread/linux/pthread_create.c +++ b/src/thread/linux/pthread_create.c @@ -115,6 +115,7 @@ static int thread_list_lock_after_lock = TID_ERROR_INIT; static int thread_list_lock_pre_unlock = TID_ERROR_INIT; static int thread_list_lock_pthread_exit = TID_ERROR_INIT; static int thread_list_lock_tid_overlimit = TID_ERROR_INIT; +static pid_t g_dlcloseLockStatus = TID_ERROR_0, g_dlcloseLockLastExitTid = TID_ERROR_0; struct call_tl_lock tl_lock_caller_count = { 0 }; @@ -442,6 +443,26 @@ static int start(void *p) return 0; } +pid_t getDlcloseLockStatus() +{ + return g_dlcloseLockStatus; +} + +pid_t getDlcloseLockLastExitTid() +{ + return g_dlcloseLockLastExitTid; +} + +void setDlcloseLockStatus(pid_t value) +{ + g_dlcloseLockStatus = value; +} + +void setDlcloseLockLastExitTid(pid_t value) +{ + g_dlcloseLockLastExitTid = value; +} + #ifdef ENABLE_HWASAN __attribute__((no_sanitize("hwaddress"))) #endif