/* $Id: exit.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/exit.c * PURPOSE: Thread termination * PROGRAMMER: KJK::Hyperion * UPDATE HISTORY: * 19/12/2001: Created */ #include #include #include #include #include #include void pthread_exit(void *value_ptr) { NTSTATUS nErrCode; BOOLEAN fLastThread; /* terminate process if this is the last thread of the current process */ nErrCode = NtQueryInformationThread ( NtCurrentThread(), ThreadAmILastThread, &fLastThread, sizeof(BOOLEAN), NULL ); if(NT_SUCCESS(nErrCode)) { if(fLastThread) { INFO("this thread is the last in the current process - about to call exit(0)"); exit(0); } } else { WARN ( "NtQueryInformationThread(ThreadAmILastThread) failed with status %#x. \ Can't determine if the current thread is the last in the process. The process \ could hang", nErrCode ); } TODO("Notify psxss of thread termination"); LdrShutdownThread(); /* detach DLLs */ /* kill this thread */ WARNIF( sizeof(ULONG) < sizeof(typeof(value_ptr)), "\ the value returned from the current thread will be truncated (pointers shorter \ than long integers on this architecture?) - expect trouble" ); INFO("bye bye. Current thread about to die"); NtTerminateThread(NtCurrentThread(), (ULONG)value_ptr); /* "The pthread_exit() function cannot return to its caller." */ NtDelayExecution(FALSE, NULL); } /* EOF */