1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
|
commit bfb2f2f481147da54237ade3266f2586a51d43c9
Author: Samuel Thibault <samuel.thibault@ens-lyon.org>
Date: Sat Mar 15 15:23:42 2025 +0000
htl: Make pthread_setcanceltype / state a cancellation point
as expected by tst-cancel32.
---
htl/pt-setcancelstate.c | 8 ++++++++
htl/pt-setcanceltype.c | 5 +++++
sysdeps/htl/pthreadP.h | 8 ++++++++
3 files changed, 21 insertions(+)
--- a/htl/pt-setcancelstate.c
+++ b/htl/pt-setcancelstate.c
@@ -24,6 +24,7 @@ int
__pthread_setcancelstate (int state, int *oldstate)
{
struct __pthread *p = _pthread_self ();
+ int cancelled;
switch (state)
{
@@ -38,8 +39,15 @@ __pthread_setcancelstate (int state, int
if (oldstate != NULL)
*oldstate = p->cancel_state;
p->cancel_state = state;
+ cancelled = (p->cancel_state == PTHREAD_CANCEL_ENABLE) && p->cancel_pending == 1 && (p->cancel_type == PTHREAD_CANCEL_ASYNCHRONOUS);
+ if (cancelled)
+ /* Do not achieve cancel when called again, notably from __pthread_exit itself. */
+ p->cancel_pending = 2;
__pthread_mutex_unlock (&p->cancel_lock);
+ if (cancelled && __pthread_exit)
+ __pthread_exit (PTHREAD_CANCELED);
+
return 0;
}
--- a/htl/pt-setcanceltype.c
+++ b/htl/pt-setcanceltype.c
@@ -24,6 +24,7 @@ int
__pthread_setcanceltype (int type, int *oldtype)
{
struct __pthread *p = _pthread_self ();
+ int cancelled;
switch (type)
{
@@ -38,8 +39,12 @@ __pthread_setcanceltype (int type, int *
if (oldtype != NULL)
*oldtype = p->cancel_type;
p->cancel_type = type;
+ cancelled = (p->cancel_state == PTHREAD_CANCEL_ENABLE) && p->cancel_pending && (p->cancel_type == PTHREAD_CANCEL_ASYNCHRONOUS);
__pthread_mutex_unlock (&p->cancel_lock);
+ if (cancelled && __pthread_exit)
+ __pthread_exit (PTHREAD_CANCELED);
+
return 0;
}
--- a/sysdeps/htl/pthreadP.h
+++ b/sysdeps/htl/pthreadP.h
@@ -172,6 +172,14 @@ hidden_proto (__pthread_mutex_timedlock)
hidden_proto (__pthread_get_cleanup_stack)
#endif
+#if !defined(__NO_WEAK_PTHREAD_ALIASES) && !IS_IN (libpthread)
+# ifdef weak_extern
+weak_extern (__pthread_exit)
+# else
+# pragma weak __pthread_exit
+# endif
+#endif
+
#define ASSERT_TYPE_SIZE(type, size) \
_Static_assert (sizeof (type) == size, \
"sizeof (" #type ") != " #size)
|