1 /*
2 * pthread_detach.c
3 *
4 * Description:
5 * This translation unit implements functions related to thread
6 * synchronisation.
7 *
8 * --------------------------------------------------------------------------
9 *
10 * Pthreads-win32 - POSIX Threads Library for Win32
11 * Copyright(C) 1998 John E. Bossom
12 * Copyright(C) 1999,2005 Pthreads-win32 contributors
13 *
14 * Contact Email: rpj@callisto.canberra.edu.au
15 *
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
21 *
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.
26 *
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.
31 *
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
36 */
37
38 #include "pthread.h"
39 #include "implement.h"
40
41 /*
42 * Not needed yet, but defining it should indicate clashes with build target
43 * environment that should be fixed.
44 */
45 #if !defined(WINCE)
46 # include <signal.h>
47 #endif
48
49
50 int
pthread_detach(pthread_t thread)51 pthread_detach (pthread_t thread)
52 /*
53 * ------------------------------------------------------
54 * DOCPUBLIC
55 * This function detaches the given thread.
56 *
57 * PARAMETERS
58 * thread
59 * an instance of a pthread_t
60 *
61 *
62 * DESCRIPTION
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.
67 *
68 * RESULTS
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',
73 *
74 * ------------------------------------------------------
75 */
76 {
77 int result;
78 BOOL destroyIt = PTW32_FALSE;
79 ptw32_thread_t * tp = (ptw32_thread_t *) thread.p;
80 ptw32_mcs_local_node_t node;
81
82 ptw32_mcs_lock_acquire(&ptw32_thread_reuse_lock, &node);
83
84 if (NULL == tp
85 || thread.x != tp->ptHandle.x)
86 {
87 result = ESRCH;
88 }
89 else if (PTHREAD_CREATE_DETACHED == tp->detachState)
90 {
91 result = EINVAL;
92 }
93 else
94 {
95 ptw32_mcs_local_node_t stateLock;
96 /*
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.
100 */
101 result = 0;
102
103 ptw32_mcs_lock_acquire (&tp->stateLock, &stateLock);
104 if (tp->state != PThreadStateLast)
105 {
106 tp->detachState = PTHREAD_CREATE_DETACHED;
107 }
108 else if (tp->detachState != PTHREAD_CREATE_DETACHED)
109 {
110 /*
111 * Thread is joinable and has exited or is exiting.
112 */
113 destroyIt = PTW32_TRUE;
114 }
115 ptw32_mcs_lock_release (&stateLock);
116 }
117
118 ptw32_mcs_lock_release(&node);
119
120 if (result == 0)
121 {
122 /* Thread is joinable */
123
124 if (destroyIt)
125 {
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.
128 */
129 (void) WaitForSingleObject(tp->threadH, INFINITE);
130 ptw32_threadDestroy (thread);
131 }
132 }
133
134 return (result);
135
136 } /* pthread_detach */
137