From b3546067e4a59c17892ef47bc20715f1b09d229e Mon Sep 17 00:00:00 2001 From: liyiming13 Date: Sat, 2 Nov 2024 17:06:09 +0800 Subject: [PATCH] Add tl_lock_count_tid_sub Issue:https://gitee.com/openharmony/third_party_musl/issues/IB1MKA?from=project-issue Test:libc-test Signed-off-by: liyiming13 --- src/internal/pthread_impl.h | 2 ++ src/sigchain/linux/sigchain.c | 6 ++++-- src/thread/linux/pthread_create.c | 14 ++++++++++++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/internal/pthread_impl.h b/src/internal/pthread_impl.h index bd05b5868..b84db77bc 100644 --- a/src/internal/pthread_impl.h +++ b/src/internal/pthread_impl.h @@ -284,7 +284,9 @@ hidden int get_tl_lock_count(void); hidden int get_tl_lock_waiters(void); hidden int get_tl_lock_tid_fail(void); hidden int get_tl_lock_count_tid(void); +hidden int get_tl_lock_count_tid_sub(void); hidden int get_tl_lock_count_fail(void); +hidden int get_thread_list_lock_after_lock(void); hidden int get_thread_list_lock_pre_unlock(void); hidden struct pthread* __pthread_list_find(pthread_t, const char*); hidden void __pthread_mutex_unlock_recursive_inner(pthread_mutex_t *m); diff --git a/src/sigchain/linux/sigchain.c b/src/sigchain/linux/sigchain.c index 7825fe1aa..122bc1732 100644 --- a/src/sigchain/linux/sigchain.c +++ b/src/sigchain/linux/sigchain.c @@ -192,11 +192,13 @@ static void signal_chain_handler(int signo, siginfo_t* siginfo, void* ucontext_r "FREEZE_signo_%{public}d thread_list_lock_status:%{public}d " "tl_lock_count=%{public}d tl_lock_waiters=%{public}d " "tl_lock_tid_fail=%{public}d tl_lock_count_tid=%{public}d " - "tl_lock_count_fail=%{public}d thread_list_lock_pre_unlock=%{public}d", + "tl_lock_count_fail=%{public}d tl_lock_count_tid_sub=%{public}d " + "thread_list_lock_after_lock=%{public}d thread_list_lock_pre_unlock=%{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(), - get_tl_lock_count_fail(), get_thread_list_lock_pre_unlock()); + get_tl_lock_count_fail(), get_tl_lock_count_tid_sub(), + get_thread_list_lock_after_lock(), get_thread_list_lock_pre_unlock()); 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 a3a7c7f0c..2a8c03fc5 100644 --- a/src/thread/linux/pthread_create.c +++ b/src/thread/linux/pthread_create.c @@ -109,7 +109,9 @@ static int tl_lock_count; static int tl_lock_waiters; static int tl_lock_tid_fail = TID_ERROR_INIT; static int tl_lock_count_tid = TID_ERROR_INIT; +static int tl_lock_count_tid_sub = TID_ERROR_INIT; static int tl_lock_count_fail = COUNT_ERROR_INIT; +static int thread_list_lock_after_lock = TID_ERROR_INIT; static int thread_list_lock_pre_unlock = TID_ERROR_INIT; int get_tl_lock_count(void) @@ -132,11 +134,21 @@ int get_tl_lock_count_tid(void) return tl_lock_count_tid; } +int get_tl_lock_count_tid_sub(void) +{ + return tl_lock_count_tid_sub; +} + int get_tl_lock_count_fail(void) { return tl_lock_count_fail; } +int get_thread_list_lock_after_lock(void) +{ + return thread_list_lock_after_lock; +} + int get_thread_list_lock_pre_unlock(void) { return thread_list_lock_pre_unlock; @@ -157,12 +169,14 @@ void __tl_lock(void) } while ((val = a_cas(&__thread_list_lock, 0, tid))) __wait(&__thread_list_lock, &tl_lock_waiters, val, 0); + thread_list_lock_after_lock = __thread_list_lock; } void __tl_unlock(void) { if (tl_lock_count) { tl_lock_count--; + tl_lock_count_tid_sub = __thread_list_lock; return; } thread_list_lock_pre_unlock = __thread_list_lock; -- Gitee