171b3fa15SDavid Xu /* 2*d3b15642Szrj * Copyright (c) 2005 David Xu <davidxu@freebsd.org> 3*d3b15642Szrj * Copyright (C) 2003 Daniel M. Eischen <deischen@freebsd.org> 471b3fa15SDavid Xu * All rights reserved. 571b3fa15SDavid Xu * 671b3fa15SDavid Xu * Redistribution and use in source and binary forms, with or without 771b3fa15SDavid Xu * modification, are permitted provided that the following conditions 871b3fa15SDavid Xu * are met: 971b3fa15SDavid Xu * 1. Redistributions of source code must retain the above copyright 1071b3fa15SDavid Xu * notice, this list of conditions and the following disclaimer. 1171b3fa15SDavid Xu * 2. Redistributions in binary form must reproduce the above copyright 1271b3fa15SDavid Xu * notice, this list of conditions and the following disclaimer in the 1371b3fa15SDavid Xu * documentation and/or other materials provided with the distribution. 1471b3fa15SDavid Xu * 15*d3b15642Szrj * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16*d3b15642Szrj * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17*d3b15642Szrj * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18*d3b15642Szrj * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19*d3b15642Szrj * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20*d3b15642Szrj * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21*d3b15642Szrj * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22*d3b15642Szrj * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23*d3b15642Szrj * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24*d3b15642Szrj * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2571b3fa15SDavid Xu * 2671b3fa15SDavid Xu */ 27fc71f871SDavid Xu 28fc71f871SDavid Xu #include "namespace.h" 299e2ee207SJoerg Sonnenberger #include <machine/tls.h> 309e2ee207SJoerg Sonnenberger 3171b3fa15SDavid Xu #include <errno.h> 3271b3fa15SDavid Xu #include <pthread.h> 33fc71f871SDavid Xu #include "un-namespace.h" 34fc71f871SDavid Xu 3571b3fa15SDavid Xu #include "thr_private.h" 3671b3fa15SDavid Xu 3771b3fa15SDavid Xu int 3871b3fa15SDavid Xu _pthread_detach(pthread_t pthread) 3971b3fa15SDavid Xu { 409e2ee207SJoerg Sonnenberger struct pthread *curthread = tls_get_curthread(); 4171b3fa15SDavid Xu int rval; 4271b3fa15SDavid Xu 4371b3fa15SDavid Xu if (pthread == NULL) 4471b3fa15SDavid Xu return (EINVAL); 4571b3fa15SDavid Xu 4671b3fa15SDavid Xu THREAD_LIST_LOCK(curthread); 4771b3fa15SDavid Xu if ((rval = _thr_find_thread(curthread, pthread, 4871b3fa15SDavid Xu /*include dead*/1)) != 0) { 4971b3fa15SDavid Xu THREAD_LIST_UNLOCK(curthread); 5071b3fa15SDavid Xu return (rval); 5171b3fa15SDavid Xu } 5271b3fa15SDavid Xu 5371b3fa15SDavid Xu /* Check if the thread is already detached or has a joiner. */ 5471b3fa15SDavid Xu if ((pthread->tlflags & TLFLAGS_DETACHED) != 0 || 5571b3fa15SDavid Xu (pthread->joiner != NULL)) { 5671b3fa15SDavid Xu THREAD_LIST_UNLOCK(curthread); 5771b3fa15SDavid Xu return (EINVAL); 5871b3fa15SDavid Xu } 5971b3fa15SDavid Xu 6071b3fa15SDavid Xu /* Flag the thread as detached. */ 6171b3fa15SDavid Xu pthread->tlflags |= TLFLAGS_DETACHED; 6271b3fa15SDavid Xu if (pthread->state == PS_DEAD) 6371b3fa15SDavid Xu THR_GCLIST_ADD(pthread); 6471b3fa15SDavid Xu THREAD_LIST_UNLOCK(curthread); 6571b3fa15SDavid Xu 6671b3fa15SDavid Xu return (0); 6771b3fa15SDavid Xu } 685a1048c8SDavid Xu 695a1048c8SDavid Xu __strong_reference(_pthread_detach, pthread_detach); 70