5 * This translation unit implements functions related to thread
8 * --------------------------------------------------------------------------
10 * Pthreads-win32 - POSIX Threads Library for Win32
11 * Copyright(C) 1998 John E. Bossom
12 * Copyright(C) 1999,2005 Pthreads-win32 contributors
14 * Contact Email: rpj@callisto.canberra.edu.au
16 * The current list of contributors is contained
17 * in the file CONTRIBUTORS included with the source
18 * code distribution. The list can also be seen at the
19 * following World Wide Web location:
20 * http://sources.redhat.com/pthreads-win32/contributors.html
22 * This library is free software; you can redistribute it and/or
23 * modify it under the terms of the GNU Lesser General Public
24 * License as published by the Free Software Foundation; either
25 * version 2 of the License, or (at your option) any later version.
27 * This library is distributed in the hope that it will be useful,
28 * but WITHOUT ANY WARRANTY; without even the implied warranty of
29 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
30 * Lesser General Public License for more details.
32 * You should have received a copy of the GNU Lesser General Public
33 * License along with this library in the file COPYING.LIB;
34 * if not, write to the Free Software Foundation, Inc.,
35 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
39 #include "implement.h"
42 * Not needed yet, but defining it should indicate clashes with build target
43 * environment that should be fixed.
51 pthread_detach (pthread_t thread
)
53 * ------------------------------------------------------
55 * This function detaches the given thread.
59 * an instance of a pthread_t
63 * This function detaches the given thread. You may use it to
64 * detach the main thread or to detach a joinable thread.
65 * NOTE: detached threads cannot be joined;
66 * storage is freed immediately on termination.
69 * 0 successfully detached the thread,
70 * EINVAL thread is not a joinable thread,
71 * ENOSPC a required resource has been exhausted,
72 * ESRCH no thread could be found for 'thread',
74 * ------------------------------------------------------
78 BOOL destroyIt
= PTW32_FALSE
;
79 ptw32_thread_t
* tp
= (ptw32_thread_t
*) thread
.p
;
80 ptw32_mcs_local_node_t node
;
82 ptw32_mcs_lock_acquire(&ptw32_thread_reuse_lock
, &node
);
85 || thread
.x
!= tp
->ptHandle
.x
)
89 else if (PTHREAD_CREATE_DETACHED
== tp
->detachState
)
95 ptw32_mcs_local_node_t stateLock
;
97 * Joinable ptw32_thread_t structs are not scavenged until
98 * a join or detach is done. The thread may have exited already,
99 * but all of the state and locks etc are still there.
103 ptw32_mcs_lock_acquire (&tp
->stateLock
, &stateLock
);
104 if (tp
->state
!= PThreadStateLast
)
106 tp
->detachState
= PTHREAD_CREATE_DETACHED
;
108 else if (tp
->detachState
!= PTHREAD_CREATE_DETACHED
)
111 * Thread is joinable and has exited or is exiting.
113 destroyIt
= PTW32_TRUE
;
115 ptw32_mcs_lock_release (&stateLock
);
118 ptw32_mcs_lock_release(&node
);
122 /* Thread is joinable */
126 /* The thread has exited or is exiting but has not been joined or
127 * detached. Need to wait in case it's still exiting.
129 (void) WaitForSingleObject(tp
->threadH
, INFINITE
);
130 ptw32_threadDestroy (thread
);
136 } /* pthread_detach */