Hi,

This is newer document.

http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_09_05_02

> 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
> _______________________________________________
> freebsd-current@freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-current
> To unsubscribe, send any mail to "freebsd-current-unsubscr...@freebsd.org"
_______________________________________________
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "freebsd-current-unsubscr...@freebsd.org"

Reply via email to