1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20: #include <setjmp.h>
21: #include <stdlib.h>
22: #include "pthreadP.h"
23:
24:
25:
26:
27:
28: int
29: attribute_hidden
30: __pthread_enable_asynccancel (void)
31: {
32: struct pthread *self = THREAD_SELF;
33: int oldval = THREAD_GETMEM (self, cancelhandling);
34:
35: while (1)
36: {
37: int newval = oldval | CANCELTYPE_BITMASK;
38:
39: if (newval == oldval)
40: break;
41:
42: int curval = THREAD_ATOMIC_CMPXCHG_VAL (self, cancelhandling, newval,
43: oldval);
44: if (__builtin_expect (curval == oldval, 1))
45: {
46: if (CANCEL_ENABLED_AND_CANCELED_AND_ASYNCHRONOUS (newval))
47: {
48: THREAD_SETMEM (self, result, PTHREAD_CANCELED);
49: __do_cancel ();
50: }
51:
52: break;
53: }
54:
55:
56: oldval = curval;
57: }
58:
59: return oldval;
60: }
61:
62:
63: void
64: internal_function attribute_hidden
65: __pthread_disable_asynccancel (int oldtype)
66: {
67:
68:
69: if (oldtype & CANCELTYPE_BITMASK)
70: return;
71:
72: struct pthread *self = THREAD_SELF;
73: int oldval = THREAD_GETMEM (self, cancelhandling);
74:
75: while (1)
76: {
77: int newval = oldval & ~CANCELTYPE_BITMASK;
78:
79: if (newval == oldval)
80: break;
81:
82: int curval = THREAD_ATOMIC_CMPXCHG_VAL (self, cancelhandling, newval,
83: oldval);
84: if (__builtin_expect (curval == oldval, 1))
85: break;
86:
87:
88: oldval = curval;
89: }
90: }