From d01dcd6c4ba7c5b296dc0ced2aa0e83fc9792716 Mon Sep 17 00:00:00 2001 From: zzulilyw Date: Fri, 22 Aug 2025 10:38:02 +0800 Subject: [PATCH] Add maintenance log Issue: https://gitee.com/openharmony/third_party_musl/issues/ICU6HH Signed-off-by: zzulilyw --- ldso/linux/dynlink.c | 6 ++++++ src/internal/pthread_impl.h | 5 +++++ src/sigchain/linux/sigchain.c | 10 +++++++--- src/thread/linux/pthread_create.c | 21 +++++++++++++++++++++ 4 files changed, 39 insertions(+), 3 deletions(-) diff --git a/ldso/linux/dynlink.c b/ldso/linux/dynlink.c index a0105b6f7..1d687c635 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 671ac61bd..585eed4bc 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 d9dbef8e8..88158581e 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 60a9321af..25af614a7 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 -- Gitee