1 /* Detach a thread. 2 Copyright (C) 2000-2022 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 <errno.h> 20 #include <pthread.h> 21 #include <stddef.h> 22 23 #include <pt-internal.h> 24 25 /* Indicate that the storage for THREAD can be reclaimed when it 26 terminates. */ 27 int __pthread_detach(pthread_t thread)28__pthread_detach (pthread_t thread) 29 { 30 struct __pthread *pthread; 31 int err = 0; 32 33 /* Lookup the thread structure for THREAD. */ 34 pthread = __pthread_getid (thread); 35 if (pthread == NULL) 36 return ESRCH; 37 38 __pthread_mutex_lock (&pthread->state_lock); 39 40 switch (pthread->state) 41 { 42 case PTHREAD_JOINABLE: 43 /* THREAD still running. Mark it as detached such that its 44 resources can be reclaimed as soon as the thread exits. */ 45 pthread->state = PTHREAD_DETACHED; 46 47 /* Broadcast the condition. This will make threads that are 48 waiting to join THREAD continue with hopefully disastrous 49 consequences instead of blocking indefinitely. */ 50 __pthread_cond_broadcast (&pthread->state_cond); 51 __pthread_mutex_unlock (&pthread->state_lock); 52 53 __pthread_dealloc (pthread); 54 break; 55 56 case PTHREAD_EXITED: 57 __pthread_mutex_unlock (&pthread->state_lock); 58 59 /* THREAD has already exited. PTHREAD remained after the thread 60 exited in order to provide the exit status, but it turns out 61 it won't be needed. */ 62 __pthread_dealloc (pthread); 63 break; 64 65 default: 66 /* Thou shalt not detach non-joinable threads! */ 67 __pthread_mutex_unlock (&pthread->state_lock); 68 err = EINVAL; 69 break; 70 } 71 72 return err; 73 } 74 weak_alias (__pthread_detach, pthread_detach) 75 hidden_def (__pthread_detach) 76