Are pthread_setcancelstate() and pthread_setcanceltype() cancellation points?
Kohji Okuno
okuno.kohji at jp.panasonic.com
Tue Jun 18 08:59:15 UTC 2013
Hi,
I have a question.
Are pthread_setcancelstate() and pthread_setcanceltype() cancellation
points?
I refered to the following URL.
http://pubs.opengroup.org/onlinepubs/7908799/xsh/threads.html
This document shows that cancellation points in the pthread library
are only pthread_cond_timedwait(), pthread_cond_wait(), pthread_join()
and pthread_testcancel().
But, current implementation in FreeBSD is the following.
(Please take notice of "(*)" marks).
Would you check this?
lib/libthr/thread/thr_cancel.c:
77 int
78 _pthread_setcancelstate(int state, int *oldstate)
79 {
80 struct pthread *curthread = _get_curthread();
81 int oldval;
82
83 oldval = curthread->cancel_enable;
84 switch (state) {
85 case PTHREAD_CANCEL_DISABLE:
86 curthread->cancel_enable = 0;
87 break;
88 case PTHREAD_CANCEL_ENABLE:
89 curthread->cancel_enable = 1;
90 (*) testcancel(curthread);
91 break;
92 default:
93 return (EINVAL);
94 }
95
96 if (oldstate) {
97 *oldstate = oldval ? PTHREAD_CANCEL_ENABLE :
98 PTHREAD_CANCEL_DISABLE;
99 }
100 return (0);
101 }
102
103 int
104 _pthread_setcanceltype(int type, int *oldtype)
105 {
106 struct pthread *curthread = _get_curthread();
107 int oldval;
108
109 oldval = curthread->cancel_async;
110 switch (type) {
111 case PTHREAD_CANCEL_ASYNCHRONOUS:
112 curthread->cancel_async = 1;
113 (*) testcancel(curthread);
114 break;
115 case PTHREAD_CANCEL_DEFERRED:
116 curthread->cancel_async = 0;
117 break;
118 default:
119 return (EINVAL);
120 }
121
122 if (oldtype) {
123 *oldtype = oldval ? PTHREAD_CANCEL_ASYNCHRONOUS :
124 PTHREAD_CANCEL_DEFERRED;
125 }
126 return (0);
127 }
Regards,
Kohji Okuno
More information about the freebsd-current
mailing list