/[pcsx2_0.9.7]/trunk/3rdparty/w32pthreads/pthread_join.c
ViewVC logotype

Annotation of /trunk/3rdparty/w32pthreads/pthread_join.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 31 - (hide annotations) (download)
Tue Sep 7 03:24:11 2010 UTC (10 years ago) by william
File MIME type: text/plain
File size: 4449 byte(s)
committing r3113 initial commit again...
1 william 31 /*
2     * pthread_join.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 "ptw32pch.h"
39    
40     /*
41     * Not needed yet, but defining it should indicate clashes with build target
42     * environment that should be fixed.
43     */
44     #include <signal.h>
45    
46    
47     int
48     pthread_join (pthread_t thread, void **value_ptr)
49     /*
50     * ------------------------------------------------------
51     * DOCPUBLIC
52     * This function waits for 'thread' to terminate and
53     * returns the thread's exit value if 'value_ptr' is not
54     * NULL. This also detaches the thread on successful
55     * completion.
56     *
57     * PARAMETERS
58     * thread
59     * an instance of pthread_t
60     *
61     * value_ptr
62     * pointer to an instance of pointer to void
63     *
64     *
65     * DESCRIPTION
66     * This function waits for 'thread' to terminate and
67     * returns the thread's exit value if 'value_ptr' is not
68     * NULL. This also detaches the thread on successful
69     * completion.
70     * NOTE: detached threads cannot be joined or canceled
71     *
72     * RESULTS
73     * 0 'thread' has completed
74     * EINVAL thread is not a joinable thread,
75     * ESRCH no thread could be found with ID 'thread',
76     * ENOENT thread couldn't find it's own valid handle,
77     * EDEADLK attempt to join thread with self
78     *
79     * ------------------------------------------------------
80     */
81     {
82     int result;
83     pthread_t self;
84     ptw32_thread_t * tp = (ptw32_thread_t *) thread.p;
85    
86     EnterCriticalSection (&ptw32_thread_reuse_lock);
87    
88     if (NULL == tp
89     || thread.x != tp->ptHandle.x)
90     {
91     result = ESRCH;
92     }
93     else if (PTHREAD_CREATE_DETACHED == tp->detachState)
94     {
95     result = EINVAL;
96     }
97     else
98     {
99     result = 0;
100     }
101    
102     LeaveCriticalSection (&ptw32_thread_reuse_lock);
103    
104     if (result == 0)
105     {
106     /*
107     * The target thread is joinable and can't be reused before we join it.
108     */
109     self = pthread_self();
110    
111     if (NULL == self.p)
112     {
113     result = ENOENT;
114     }
115     else if (pthread_equal (self, thread))
116     {
117     result = EDEADLK;
118     }
119     else
120     {
121     /*
122     * Pthread_join is a cancelation point.
123     * If we are canceled then our target thread must not be
124     * detached (destroyed). This is guarranteed because
125     * pthreadCancelableWait will not return if we
126     * are canceled.
127     */
128     result = pthreadCancelableWait (tp->threadH);
129    
130     if (0 == result)
131     {
132     if (value_ptr != NULL)
133     {
134     *value_ptr = tp->exitStatus;
135     }
136    
137     /*
138     * The result of making multiple simultaneous calls to
139     * pthread_join() or pthread_detach() specifying the same
140     * target is undefined.
141     */
142     result = pthread_detach (thread);
143     }
144     else
145     {
146     result = ESRCH;
147     }
148     }
149     }
150    
151     return (result);
152    
153     } /* pthread_join */

  ViewVC Help
Powered by ViewVC 1.1.22