From patchwork Thu Jun 10 19:36:39 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella X-Patchwork-Id: 43829 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id BB72539A1420 for ; Thu, 10 Jun 2021 19:41:49 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org BB72539A1420 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1623354109; bh=NcK03V9uS7PmlKwYcMtZB2YfPGEEoKxA6/r60tO+HtA=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=VW+E6gtpBPjDrnsaSQNX9V+kYDWvLG9UzN9zcUC+DCftjGrvDV3MzN6Lu0QRHfMpm QuV6VA01ZiamUI9/B74moWaDbj63K1/A36fBWCTSSbUjuEjvcgvZb02ph3xLHcdsMP 40mNIBxiiPVjbNJKjSXBpnJNkzrE9uUkWIn22r9Y= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-qk1-x72a.google.com (mail-qk1-x72a.google.com [IPv6:2607:f8b0:4864:20::72a]) by sourceware.org (Postfix) with ESMTPS id E3A09399C8B5 for ; Thu, 10 Jun 2021 19:36:52 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org E3A09399C8B5 Received: by mail-qk1-x72a.google.com with SMTP id k11so26950436qkk.1 for ; Thu, 10 Jun 2021 12:36:52 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=NcK03V9uS7PmlKwYcMtZB2YfPGEEoKxA6/r60tO+HtA=; b=V4xn4Q9fhIfmIBifSlMtFfesNjuhkRTYs93OdSHzRulc0khLevCoo1q87L/WQE2RbG qrsNodLskoxWQdq7eu3dfLCGIV6OJcN4bsG+s3FCvnCP2IG/vMwCblNXcC2vY30GLT2R A6B2TcsbGUNqZArS+GegBaWnnML0GBk5oUrqMTQNe/tub/0rQH7m44s2SvDwHaNECSG0 1dLat1zUzD+Ymmg7SMaknd3L/SjQ4fvzp+2TlRTCt7xMOOojGpS3CJNPLxsrXD/jiscr EzoZYjpwORuFuAeihhHhxyhDGaUlF8q/CpOxLGz704JjZbWDnpOqzg0meZ4SSLoCQEse CYEA== X-Gm-Message-State: AOAM532/lEToChkUBVZeO8AWYHu73vj+0CrFDWKRpX3tA/4JZk8cIcXK aaZD886PaU6ltY0lQSQ7Yl+mI7ds5ZLhXA== X-Google-Smtp-Source: ABdhPJzBwebnowhZ5AEy5RYQLaDcAkR1EJyJ4iaO+yg1jkUE57wPBRGtF3qo6/3rb1uEgLshpWFpzQ== X-Received: by 2002:a05:620a:6c9:: with SMTP id 9mr197292qky.303.1623353812190; Thu, 10 Jun 2021 12:36:52 -0700 (PDT) Received: from birita.. ([177.194.59.218]) by smtp.googlemail.com with ESMTPSA id i21sm3012583qkl.20.2021.06.10.12.36.51 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 10 Jun 2021 12:36:51 -0700 (PDT) To: libc-alpha@sourceware.org Subject: [PATCH 6/6] nptl: Replace struct thread cancelhandling field Date: Thu, 10 Jun 2021 16:36:39 -0300 Message-Id: <20210610193639.3650754-7-adhemerval.zanella@linaro.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210610193639.3650754-1-adhemerval.zanella@linaro.org> References: <20210610193639.3650754-1-adhemerval.zanella@linaro.org> MIME-Version: 1.0 X-Spam-Status: No, score=-12.4 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Adhemerval Zanella via Libc-alpha From: Adhemerval Zanella Reply-To: Adhemerval Zanella Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" Now that both thread state and setxid is being tracked by two different PD members (joinstate and setxid_flag), there is no need to keep track of exiting (EXITING_BIT) and terminated (TERMINATED_BIT) state in 'cancelhandling'. The 'cancelhandling' field is renamed to 'cancelstatus' and now only signal whether the thread has been cancelled (set by pthread_cancel()). It allows simplify the atomic operation required. There is no need to check the thread state on __pthread_enable_asynccancel() nor on pthread_testcancel () anymore now that cancellation is explicit disabled when thread start the exit code (__do_cancel()). On __nptl_free_tcp(), the PD->joinstate now defines whether is the creating thread or created thread that calls it. So there is no concurrent call of the function and thus no need to set the TERMINATED_BIT. For SIGCANCEL handler, sigcancel_handler(), PD->joinstate is used instead (pthread_cancel() might still be called concurrenty in assynchronous mode). Finally the nptl_db is adjusted to check the PD->joinstate information instead of cancelhandling to check for the thread state. Checked on x86_64-linux-gnu and aarch64-linux-gnu. --- nptl/allocatestack.c | 2 +- nptl/cancellation.c | 10 ++-------- nptl/descr.h | 13 ++----------- nptl/nptl_free_tcb.c | 22 ++++++---------------- nptl/pthreadP.h | 3 --- nptl/pthread_cancel.c | 10 ++++------ nptl/pthread_create.c | 10 ++-------- nptl/pthread_join_common.c | 10 +++------- nptl/pthread_testcancel.c | 10 ++-------- nptl_db/structs.def | 2 +- nptl_db/td_thr_get_info.c | 16 +++++++--------- nptl_db/td_thr_getfpregs.c | 9 +++++---- nptl_db/td_thr_getgregs.c | 9 +++++---- nptl_db/td_thr_setfpregs.c | 9 +++++---- nptl_db/td_thr_setgregs.c | 9 +++++---- sysdeps/hppa/nptl/tcb-offsets.sym | 1 - sysdeps/i386/nptl/tcb-offsets.sym | 1 - sysdeps/sh/nptl/tcb-offsets.sym | 1 - sysdeps/x86_64/nptl/tcb-offsets.sym | 4 ---- 19 files changed, 50 insertions(+), 101 deletions(-) diff --git a/nptl/allocatestack.c b/nptl/allocatestack.c index aae2281517..f9829e2dae 100644 --- a/nptl/allocatestack.c +++ b/nptl/allocatestack.c @@ -160,7 +160,7 @@ get_cached_stack (size_t *sizep, void **memp) *memp = result->stackblock; /* Cancellation handling is back to the default. */ - result->cancelhandling = 0; + result->cancelstatus = 0; result->cancelstate = PTHREAD_CANCEL_ENABLE; result->canceltype = PTHREAD_CANCEL_DEFERRED; result->cleanup = NULL; diff --git a/nptl/cancellation.c b/nptl/cancellation.c index 6478c029de..a244b3eeea 100644 --- a/nptl/cancellation.c +++ b/nptl/cancellation.c @@ -35,15 +35,9 @@ __pthread_enable_asynccancel (void) int oldval = THREAD_GETMEM (self, canceltype); THREAD_SETMEM (self, canceltype, PTHREAD_CANCEL_ASYNCHRONOUS); - int ch = THREAD_GETMEM (self, cancelhandling); - if (self->cancelstate == PTHREAD_CANCEL_ENABLE - && (ch & CANCELED_BITMASK) - && !(ch & EXITING_BITMASK) - && !(ch & TERMINATED_BITMASK)) - { - __do_cancel (); - } + && self->cancelstatus == 1) + __do_cancel (); return oldval; } diff --git a/nptl/descr.h b/nptl/descr.h index 563b152bff..1bfa2b9b52 100644 --- a/nptl/descr.h +++ b/nptl/descr.h @@ -286,17 +286,8 @@ struct pthread struct pthread_unwind_buf *cleanup_jmp_buf; #define HAVE_CLEANUP_JMP_BUF - /* Flags determining processing of cancellation. */ - int cancelhandling; - /* Bit set if canceled. */ -#define CANCELED_BIT 3 -#define CANCELED_BITMASK (0x01 << CANCELED_BIT) - /* Bit set if thread is exiting. */ -#define EXITING_BIT 4 -#define EXITING_BITMASK (0x01 << EXITING_BIT) - /* Bit set if thread terminated and TCB is freed. */ -#define TERMINATED_BIT 5 -#define TERMINATED_BITMASK (0x01 << TERMINATED_BIT) + /* Flag to determine whether the thread is signaled to be cancelled. */ + int cancelstatus; /* Flags. Including those copied from the thread attribute. */ int flags; diff --git a/nptl/nptl_free_tcb.c b/nptl/nptl_free_tcb.c index cbf3580f59..15e1a18562 100644 --- a/nptl/nptl_free_tcb.c +++ b/nptl/nptl_free_tcb.c @@ -24,22 +24,12 @@ void __nptl_free_tcb (struct pthread *pd) { - /* The thread is exiting now. */ - if (atomic_bit_test_set (&pd->cancelhandling, TERMINATED_BIT) == 0) - { - /* Free TPP data. */ - if (pd->tpp != NULL) - { - struct priority_protection_data *tpp = pd->tpp; + free (pd->tpp); + pd->tpp = NULL; - pd->tpp = NULL; - free (tpp); - } - - /* Queue the stack memory block for reuse and exit the process. The - kernel will signal via writing to the address returned by - QUEUE-STACK when the stack is available. */ - __nptl_deallocate_stack (pd); - } + /* Queue the stack memory block for reuse and exit the process. The kernel + will signal via writing to the address returned by QUEUE-STACK when the + stack is available. */ + __nptl_deallocate_stack (pd); } libc_hidden_def (__nptl_free_tcb) diff --git a/nptl/pthreadP.h b/nptl/pthreadP.h index bfb0e40b44..18b7cfbd79 100644 --- a/nptl/pthreadP.h +++ b/nptl/pthreadP.h @@ -273,9 +273,6 @@ __exit_thread (void *value) { struct pthread *self = THREAD_SELF; - /* Make sure we get no more cancellations. */ - THREAD_ATOMIC_BIT_SET (self, cancelhandling, EXITING_BIT); - THREAD_SETMEM (self, result, value); /* It is required by POSIX XSH 2.9.5 Thread Cancellation under the heading diff --git a/nptl/pthread_cancel.c b/nptl/pthread_cancel.c index 577ff6c746..c3d07258b6 100644 --- a/nptl/pthread_cancel.c +++ b/nptl/pthread_cancel.c @@ -43,11 +43,8 @@ sigcancel_handler (int sig, siginfo_t *si, void *ctx) struct pthread *self = THREAD_SELF; - int ch = atomic_load_relaxed (&self->cancelhandling); - /* Cancelation not enabled, not cancelled, or already exitting. */ if (self->cancelstate == PTHREAD_CANCEL_DISABLE - || (ch & CANCELED_BITMASK) == 0 - || (ch & EXITING_BITMASK) != 0) + || atomic_load_relaxed (&self->joinstate) == THREAD_STATE_EXITING) return; /* Set the return value. */ @@ -88,8 +85,9 @@ __pthread_cancel (pthread_t th) } #endif - int oldch = atomic_fetch_or_acquire (&pd->cancelhandling, CANCELED_BITMASK); - if ((oldch & CANCELED_BITMASK) != 0) + /* If already cancelled just return (cancellation will be acted upon in next + cancellation entrypoint). */ + if (atomic_exchange_acquire (&pd->cancelstatus, 1) == 1) return 0; if (pd == THREAD_SELF) diff --git a/nptl/pthread_create.c b/nptl/pthread_create.c index 0b1c67f6d2..f34fbff096 100644 --- a/nptl/pthread_create.c +++ b/nptl/pthread_create.c @@ -469,12 +469,6 @@ start_thread (void *arg) } } - /* The thread is exiting now. Don't set this bit until after we've hit - the event-reporting breakpoint, so that td_thr_get_info on us while at - the breakpoint reports TD_THR_RUN state rather than TD_THR_ZOMBIE. */ - atomic_bit_set (&pd->cancelhandling, EXITING_BIT); - - /* CONCURRENCY NOTES: Concurrent pthread_detach() will either set state to @@ -538,8 +532,8 @@ start_thread (void *arg) do /* XXX This differs from the typical futex_wait_simple pattern in that the futex_wait condition (setxid_futex) is different from the - condition used in the surrounding loop (cancelhandling). We need - to check and document why this is correct. */ + condition used in the surrounding loop. We need to check and + document why this is correct. */ futex_wait_simple (&pd->setxid_futex, 0, FUTEX_PRIVATE); while (atomic_load_relaxed (&pd->setxid_flag) == 1); diff --git a/nptl/pthread_join_common.c b/nptl/pthread_join_common.c index 0870f36ecb..a131efba3b 100644 --- a/nptl/pthread_join_common.c +++ b/nptl/pthread_join_common.c @@ -33,14 +33,10 @@ check_for_deadlock (int state, struct pthread *pd) { struct pthread *self = THREAD_SELF; return ((pd == self - || (atomic_load_acquire (&self->joinstate) == THREAD_STATE_DETACHED - && (pd->cancelhandling - & (CANCELED_BITMASK | EXITING_BITMASK - | TERMINATED_BITMASK)) == 0)) + || (atomic_load_acquire (&self->joinstate) + == THREAD_STATE_DETACHED)) && !(self->cancelstate == PTHREAD_CANCEL_ENABLE - && (pd->cancelhandling & (CANCELED_BITMASK | EXITING_BITMASK - | TERMINATED_BITMASK)) - == CANCELED_BITMASK)); + && atomic_load_relaxed (&self->cancelstatus) == 1)); } int diff --git a/nptl/pthread_testcancel.c b/nptl/pthread_testcancel.c index e6adf12580..b06327ebe3 100644 --- a/nptl/pthread_testcancel.c +++ b/nptl/pthread_testcancel.c @@ -24,14 +24,8 @@ void ___pthread_testcancel (void) { struct pthread *self = THREAD_SELF; - int cancelhandling = THREAD_GETMEM (self, cancelhandling); - if (self->cancelstate == PTHREAD_CANCEL_ENABLE - && (cancelhandling & CANCELED_BITMASK) - && !(cancelhandling & EXITING_BITMASK) - && !(cancelhandling & TERMINATED_BITMASK)) - { - __do_cancel (); - } + if (self->cancelstate == PTHREAD_CANCEL_ENABLE && self->cancelstatus == 1) + __do_cancel (); } versioned_symbol (libc, ___pthread_testcancel, pthread_testcancel, GLIBC_2_34); versioned_symbol (libc, ___pthread_testcancel, __pthread_testcancel, diff --git a/nptl_db/structs.def b/nptl_db/structs.def index 6a726f207e..26f9a41f1a 100644 --- a/nptl_db/structs.def +++ b/nptl_db/structs.def @@ -57,7 +57,7 @@ DB_STRUCT_FIELD (pthread, list) DB_STRUCT_FIELD (pthread, report_events) DB_STRUCT_FIELD (pthread, tid) DB_STRUCT_FIELD (pthread, start_routine) -DB_STRUCT_FIELD (pthread, cancelhandling) +DB_STRUCT_FIELD (pthread, joinstate) DB_STRUCT_FIELD (pthread, schedpolicy) DB_STRUCT_FIELD (pthread, schedparam_sched_priority) DB_STRUCT_FIELD (pthread, specific) diff --git a/nptl_db/td_thr_get_info.c b/nptl_db/td_thr_get_info.c index 01af021d2a..82f1f2667c 100644 --- a/nptl_db/td_thr_get_info.c +++ b/nptl_db/td_thr_get_info.c @@ -28,7 +28,7 @@ td_thr_get_info (const td_thrhandle_t *th, td_thrinfo_t *infop) { td_err_e err; void *copy; - psaddr_t tls, schedpolicy, schedprio, cancelhandling, tid, report_events; + psaddr_t tls, schedpolicy, schedprio, joinstate, tid, report_events; LOG ("td_thr_get_info"); @@ -37,7 +37,7 @@ td_thr_get_info (const td_thrhandle_t *th, td_thrinfo_t *infop) /* Special case for the main thread before initialization. */ copy = NULL; tls = 0; - cancelhandling = 0; + joinstate = 0; schedpolicy = SCHED_OTHER; schedprio = 0; tid = 0; @@ -76,8 +76,8 @@ td_thr_get_info (const td_thrhandle_t *th, td_thrinfo_t *infop) err = DB_GET_FIELD_LOCAL (tid, th->th_ta_p, copy, pthread, tid, 0); if (err != TD_OK) return err; - err = DB_GET_FIELD_LOCAL (cancelhandling, th->th_ta_p, copy, pthread, - cancelhandling, 0); + err = DB_GET_FIELD_LOCAL (joinstate, th->th_ta_p, copy, pthread, + joinstate, 0); if (err != TD_OK) return err; err = DB_GET_FIELD_LOCAL (report_events, th->th_ta_p, copy, pthread, @@ -96,13 +96,11 @@ td_thr_get_info (const td_thrhandle_t *th, td_thrinfo_t *infop) ? 0 : (uintptr_t) schedprio); infop->ti_type = TD_THR_USER; - if ((((int) (uintptr_t) cancelhandling) & EXITING_BITMASK) == 0) - /* XXX For now there is no way to get more information. */ + int js = (int) (uintptr_t) joinstate; + if (js == THREAD_STATE_JOINABLE || js == THREAD_STATE_DETACHED) infop->ti_state = TD_THR_ACTIVE; - else if ((((int) (uintptr_t) cancelhandling) & TERMINATED_BITMASK) == 0) - infop->ti_state = TD_THR_ZOMBIE; else - infop->ti_state = TD_THR_UNKNOWN; + infop->ti_state = TD_THR_ZOMBIE; /* Initialization which are the same in both cases. */ infop->ti_ta_p = th->th_ta_p; diff --git a/nptl_db/td_thr_getfpregs.c b/nptl_db/td_thr_getfpregs.c index 3d08aa3f60..23a8a215c2 100644 --- a/nptl_db/td_thr_getfpregs.c +++ b/nptl_db/td_thr_getfpregs.c @@ -23,7 +23,7 @@ td_err_e td_thr_getfpregs (const td_thrhandle_t *th, prfpregset_t *regset) { - psaddr_t cancelhandling, tid; + psaddr_t joinstate, tid; td_err_e err; LOG ("td_thr_getfpregs"); @@ -34,13 +34,14 @@ td_thr_getfpregs (const td_thrhandle_t *th, prfpregset_t *regset) regset) != PS_OK ? TD_ERR : TD_OK; /* We have to get the state and the PID for this thread. */ - err = DB_GET_FIELD (cancelhandling, th->th_ta_p, th->th_unique, pthread, - cancelhandling, 0); + err = DB_GET_FIELD (joinstate, th->th_ta_p, th->th_unique, pthread, + joinstate, 0); if (err != TD_OK) return err; /* If the thread already terminated we return all zeroes. */ - if (((int) (uintptr_t) cancelhandling) & TERMINATED_BITMASK) + int js = (int) (uintptr_t) joinstate; + if (js == THREAD_STATE_EXITING || js == THREAD_STATE_EXITED) memset (regset, '\0', sizeof (*regset)); /* Otherwise get the register content through the callback. */ else diff --git a/nptl_db/td_thr_getgregs.c b/nptl_db/td_thr_getgregs.c index 8f9fab096f..b92402670f 100644 --- a/nptl_db/td_thr_getgregs.c +++ b/nptl_db/td_thr_getgregs.c @@ -23,7 +23,7 @@ td_err_e td_thr_getgregs (const td_thrhandle_t *th, prgregset_t regset) { - psaddr_t cancelhandling, tid; + psaddr_t joinstate, tid; td_err_e err; LOG ("td_thr_getgregs"); @@ -34,13 +34,14 @@ td_thr_getgregs (const td_thrhandle_t *th, prgregset_t regset) regset) != PS_OK ? TD_ERR : TD_OK; /* We have to get the state and the PID for this thread. */ - err = DB_GET_FIELD (cancelhandling, th->th_ta_p, th->th_unique, pthread, - cancelhandling, 0); + err = DB_GET_FIELD (joinstate, th->th_ta_p, th->th_unique, pthread, + joinstate, 0); if (err != TD_OK) return err; /* If the thread already terminated we return all zeroes. */ - if (((int) (uintptr_t) cancelhandling) & TERMINATED_BITMASK) + int js = (int) (uintptr_t) joinstate; + if (js == THREAD_STATE_EXITING || js == THREAD_STATE_EXITED) memset (regset, '\0', sizeof (*regset)); /* Otherwise get the register content through the callback. */ else diff --git a/nptl_db/td_thr_setfpregs.c b/nptl_db/td_thr_setfpregs.c index bddb0359a8..73ab675ce6 100644 --- a/nptl_db/td_thr_setfpregs.c +++ b/nptl_db/td_thr_setfpregs.c @@ -23,7 +23,7 @@ td_err_e td_thr_setfpregs (const td_thrhandle_t *th, const prfpregset_t *fpregs) { - psaddr_t cancelhandling, tid; + psaddr_t joinstate, tid; td_err_e err; LOG ("td_thr_setfpregs"); @@ -34,13 +34,14 @@ td_thr_setfpregs (const td_thrhandle_t *th, const prfpregset_t *fpregs) fpregs) != PS_OK ? TD_ERR : TD_OK; /* We have to get the state and the PID for this thread. */ - err = DB_GET_FIELD (cancelhandling, th->th_ta_p, th->th_unique, pthread, - cancelhandling, 0); + err = DB_GET_FIELD (joinstate, th->th_ta_p, th->th_unique, pthread, + joinstate, 0); if (err != TD_OK) return err; /* Only set the registers if the thread hasn't yet terminated. */ - if ((((int) (uintptr_t) cancelhandling) & TERMINATED_BITMASK) == 0) + int js = (int) (uintptr_t) joinstate; + if (js != THREAD_STATE_EXITING || js != THREAD_STATE_EXITED) { err = DB_GET_FIELD (tid, th->th_ta_p, th->th_unique, pthread, tid, 0); if (err != TD_OK) diff --git a/nptl_db/td_thr_setgregs.c b/nptl_db/td_thr_setgregs.c index 2a76a10754..186df94cbc 100644 --- a/nptl_db/td_thr_setgregs.c +++ b/nptl_db/td_thr_setgregs.c @@ -23,7 +23,7 @@ td_err_e td_thr_setgregs (const td_thrhandle_t *th, prgregset_t gregs) { - psaddr_t cancelhandling, tid; + psaddr_t joinstate, tid; td_err_e err; LOG ("td_thr_setgregs"); @@ -34,13 +34,14 @@ td_thr_setgregs (const td_thrhandle_t *th, prgregset_t gregs) gregs) != PS_OK ? TD_ERR : TD_OK; /* We have to get the state and the PID for this thread. */ - err = DB_GET_FIELD (cancelhandling, th->th_ta_p, th->th_unique, pthread, - cancelhandling, 0); + err = DB_GET_FIELD (joinstate, th->th_ta_p, th->th_unique, pthread, + joinstate, 0); if (err != TD_OK) return err; /* Only set the registers if the thread hasn't yet terminated. */ - if ((((int) (uintptr_t) cancelhandling) & TERMINATED_BITMASK) == 0) + int js = (int) (uintptr_t) joinstate; + if (js != THREAD_STATE_EXITING || js != THREAD_STATE_EXITED) { err = DB_GET_FIELD (tid, th->th_ta_p, th->th_unique, pthread, tid, 0); if (err != TD_OK) diff --git a/sysdeps/hppa/nptl/tcb-offsets.sym b/sysdeps/hppa/nptl/tcb-offsets.sym index 6e852f35b1..8937f1ec21 100644 --- a/sysdeps/hppa/nptl/tcb-offsets.sym +++ b/sysdeps/hppa/nptl/tcb-offsets.sym @@ -3,7 +3,6 @@ RESULT offsetof (struct pthread, result) TID offsetof (struct pthread, tid) -CANCELHANDLING offsetof (struct pthread, cancelhandling) CLEANUP_JMP_BUF offsetof (struct pthread, cleanup_jmp_buf) MULTIPLE_THREADS_OFFSET offsetof (struct pthread, header.multiple_threads) TLS_PRE_TCB_SIZE sizeof (struct pthread) diff --git a/sysdeps/i386/nptl/tcb-offsets.sym b/sysdeps/i386/nptl/tcb-offsets.sym index 2ec9e787c1..85a27dc29f 100644 --- a/sysdeps/i386/nptl/tcb-offsets.sym +++ b/sysdeps/i386/nptl/tcb-offsets.sym @@ -4,7 +4,6 @@ RESULT offsetof (struct pthread, result) TID offsetof (struct pthread, tid) -CANCELHANDLING offsetof (struct pthread, cancelhandling) CLEANUP_JMP_BUF offsetof (struct pthread, cleanup_jmp_buf) MULTIPLE_THREADS_OFFSET offsetof (tcbhead_t, multiple_threads) SYSINFO_OFFSET offsetof (tcbhead_t, sysinfo) diff --git a/sysdeps/sh/nptl/tcb-offsets.sym b/sysdeps/sh/nptl/tcb-offsets.sym index 234207779d..60c9e40b72 100644 --- a/sysdeps/sh/nptl/tcb-offsets.sym +++ b/sysdeps/sh/nptl/tcb-offsets.sym @@ -4,7 +4,6 @@ RESULT offsetof (struct pthread, result) TID offsetof (struct pthread, tid) -CANCELHANDLING offsetof (struct pthread, cancelhandling) CLEANUP_JMP_BUF offsetof (struct pthread, cleanup_jmp_buf) MULTIPLE_THREADS_OFFSET offsetof (struct pthread, header.multiple_threads) TLS_PRE_TCB_SIZE sizeof (struct pthread) diff --git a/sysdeps/x86_64/nptl/tcb-offsets.sym b/sysdeps/x86_64/nptl/tcb-offsets.sym index 2bbd563a6c..6cc845f7ed 100644 --- a/sysdeps/x86_64/nptl/tcb-offsets.sym +++ b/sysdeps/x86_64/nptl/tcb-offsets.sym @@ -4,7 +4,6 @@ RESULT offsetof (struct pthread, result) TID offsetof (struct pthread, tid) -CANCELHANDLING offsetof (struct pthread, cancelhandling) CLEANUP_JMP_BUF offsetof (struct pthread, cleanup_jmp_buf) CLEANUP offsetof (struct pthread, cleanup) CLEANUP_PREV offsetof (struct _pthread_cleanup_buffer, __prev) @@ -13,6 +12,3 @@ MULTIPLE_THREADS_OFFSET offsetof (tcbhead_t, multiple_threads) POINTER_GUARD offsetof (tcbhead_t, pointer_guard) FEATURE_1_OFFSET offsetof (tcbhead_t, feature_1) SSP_BASE_OFFSET offsetof (tcbhead_t, ssp_base) - --- Not strictly offsets, but these values are also used in the TCB. -TCB_CANCELED_BITMASK CANCELED_BITMASK