mirror of
https://github.com/reactos/reactos.git
synced 2024-11-03 21:34:00 +00:00
99 lines
1.9 KiB
C
99 lines
1.9 KiB
C
|
/* $Id: join.c,v 1.4 2002/10/29 04:45:38 rex Exp $
|
||
|
*/
|
||
|
/*
|
||
|
* COPYRIGHT: See COPYING in the top level directory
|
||
|
* PROJECT: ReactOS POSIX+ Subsystem
|
||
|
* FILE: subsys/psx/lib/psxdll/pthread/join.c
|
||
|
* PURPOSE: Wait for thread termination
|
||
|
* PROGRAMMER: KJK::Hyperion <noog@libero.it>
|
||
|
* UPDATE HISTORY:
|
||
|
* 19/12/2001: Created
|
||
|
*/
|
||
|
|
||
|
#include <ddk/ntddk.h>
|
||
|
#include <ntdll/ldr.h>
|
||
|
#include <errno.h>
|
||
|
#include <sys/types.h>
|
||
|
#include <pthread.h>
|
||
|
#include <psx/debug.h>
|
||
|
#include <psx/errno.h>
|
||
|
|
||
|
int pthread_join(pthread_t thread, void **value_ptr)
|
||
|
{
|
||
|
HANDLE hThread;
|
||
|
NTSTATUS nErrCode;
|
||
|
OBJECT_ATTRIBUTES oaThreadAttrs;
|
||
|
CLIENT_ID ciId;
|
||
|
THREAD_BASIC_INFORMATION tbiThreadInfo;
|
||
|
|
||
|
/* "[EDEADLK] A deadlock was detected or the value of thread specifies
|
||
|
the calling thread" */
|
||
|
if(thread == pthread_self())
|
||
|
return (EDEADLK);
|
||
|
|
||
|
/* initialize id */
|
||
|
ciId.UniqueProcess = (HANDLE)-1;
|
||
|
ciId.UniqueThread = (HANDLE)thread;
|
||
|
|
||
|
/* initialize object attributes */
|
||
|
oaThreadAttrs.Length = sizeof(OBJECT_ATTRIBUTES);
|
||
|
oaThreadAttrs.RootDirectory = NULL;
|
||
|
oaThreadAttrs.ObjectName = NULL;
|
||
|
oaThreadAttrs.Attributes = 0;
|
||
|
oaThreadAttrs.SecurityDescriptor = NULL;
|
||
|
oaThreadAttrs.SecurityQualityOfService = NULL;
|
||
|
|
||
|
/* open the thread */
|
||
|
nErrCode = NtOpenThread
|
||
|
(
|
||
|
&hThread,
|
||
|
SYNCHRONIZE | THREAD_QUERY_INFORMATION,
|
||
|
&oaThreadAttrs,
|
||
|
&ciId
|
||
|
);
|
||
|
|
||
|
/* failure */
|
||
|
if(!NT_SUCCESS(nErrCode))
|
||
|
{
|
||
|
return (__status_to_errno(nErrCode));
|
||
|
}
|
||
|
|
||
|
/* wait for thread termination */
|
||
|
nErrCode = NtWaitForSingleObject
|
||
|
(
|
||
|
hThread,
|
||
|
FALSE,
|
||
|
NULL
|
||
|
);
|
||
|
|
||
|
/* failure */
|
||
|
if(!NT_SUCCESS(nErrCode))
|
||
|
{
|
||
|
NtClose(hThread);
|
||
|
return (__status_to_errno(nErrCode));
|
||
|
}
|
||
|
|
||
|
/* get thread basic information (includes return code) */
|
||
|
nErrCode = NtQueryInformationThread
|
||
|
(
|
||
|
hThread,
|
||
|
ThreadBasicInformation,
|
||
|
&tbiThreadInfo,
|
||
|
sizeof(THREAD_BASIC_INFORMATION),
|
||
|
NULL
|
||
|
);
|
||
|
|
||
|
NtClose(hThread);
|
||
|
|
||
|
if(!value_ptr)
|
||
|
return (EFAULT);
|
||
|
|
||
|
*value_ptr = (void *)tbiThreadInfo.ExitStatus;
|
||
|
|
||
|
return (0);
|
||
|
|
||
|
}
|
||
|
|
||
|
/* EOF */
|
||
|
|