1 /* Cancel a thread. 2 Copyright (C) 2002-2021 Free Software Foundation, Inc. 3 This file is part of the GNU C Library. 4 5 The GNU C Library is free software; you can redistribute it and/or 6 modify it under the terms of the GNU Lesser General Public 7 License as published by the Free Software Foundation; either 8 version 2.1 of the License, or (at your option) any later version. 9 10 The GNU C Library is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser General Public 16 License along with the GNU C Library; if not, see 17 <https://www.gnu.org/licenses/>. */ 18 19 #include <pthread.h> 20 21 #include <pt-internal.h> 22 23 int pthread_cancel(pthread_t t)24pthread_cancel (pthread_t t) 25 { 26 int err = 0; 27 struct __pthread *p; 28 29 p = __pthread_getid (t); 30 if (p == NULL) 31 return ESRCH; 32 33 __pthread_mutex_lock (&p->cancel_lock); 34 if (p->cancel_pending) 35 { 36 __pthread_mutex_unlock (&p->cancel_lock); 37 return 0; 38 } 39 40 p->cancel_pending = 1; 41 42 if (p->cancel_state != PTHREAD_CANCEL_ENABLE) 43 { 44 __pthread_mutex_unlock (&p->cancel_lock); 45 return 0; 46 } 47 48 if (p->cancel_type == PTHREAD_CANCEL_ASYNCHRONOUS) 49 /* CANCEL_LOCK is unlocked by this call. */ 50 err = __pthread_do_cancel (p); 51 else 52 { 53 if (p->cancel_hook != NULL) 54 /* Thread blocking on a cancellation point. Invoke hook to unblock. 55 See __pthread_cond_timedwait_internal. */ 56 p->cancel_hook (p->cancel_hook_arg); 57 58 __pthread_mutex_unlock (&p->cancel_lock); 59 } 60 61 return err; 62 } 63