File: git-pthread_setcancel.diff

package info (click to toggle)
glibc 2.41-12
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 300,384 kB
  • sloc: ansic: 1,050,583; asm: 238,243; makefile: 20,379; python: 13,537; sh: 11,827; cpp: 5,197; awk: 1,795; perl: 317; yacc: 292; pascal: 182; sed: 19
file content (80 lines) | stat: -rw-r--r-- 2,306 bytes parent folder | download | duplicates (4)
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)