Cast: Stop logging kVideoFrameSentToEncoder and rename a couple events.
[chromium-blink-merge.git] / native_client_sdk / src / libraries / third_party / pthreads-win32 / pthread_detach.c
blob9ff6587f3cfcaf63944e491a1b75ea474bc1a21f
1 /*
2 * pthread_detach.c
4 * Description:
5 * This translation unit implements functions related to thread
6 * synchronisation.
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
38 #include "pthread.h"
39 #include "implement.h"
42 * Not needed yet, but defining it should indicate clashes with build target
43 * environment that should be fixed.
45 #if !defined(WINCE)
46 # include <signal.h>
47 #endif
50 int
51 pthread_detach (pthread_t thread)
53 * ------------------------------------------------------
54 * DOCPUBLIC
55 * This function detaches the given thread.
57 * PARAMETERS
58 * thread
59 * an instance of a pthread_t
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.
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',
74 * ------------------------------------------------------
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;
82 ptw32_mcs_lock_acquire(&ptw32_thread_reuse_lock, &node);
84 if (NULL == tp
85 || thread.x != tp->ptHandle.x)
87 result = ESRCH;
89 else if (PTHREAD_CREATE_DETACHED == tp->detachState)
91 result = EINVAL;
93 else
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.
101 result = 0;
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);
120 if (result == 0)
122 /* Thread is joinable */
124 if (destroyIt)
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);
134 return (result);
136 } /* pthread_detach */