void __LibCRemoveThread( int close_handle ) /***************************************/ { thread_data *tdata = NULL; if( __NXSlotID != NO_INDEX ) { int ccode = NXKeyGetValue(__NXSlotID, (void **)&tdata); if(0 != ccode) return; #if defined( __RUNTIME_CHECKS__ ) && defined( _M_IX86 ) if( tdata == (thread_data *)2 ) return; #else if( tdata == NULL ) return; #endif __RemoveThreadData( tdata->thread_id ); #if defined( __RUNTIME_CHECKS__ ) && defined( _M_IX86 ) NXKeySetValue(__NXSlotID, (void *) 2); #else NXKeySetValue(__NXSlotID, NULL); #endif } }
void __NTRemoveThread( int close_handle ) /***************************************/ { thread_data *tdata; HANDLE thread_handle; if( __TlsIndex != NO_INDEX ) { tdata = TlsGetValue( __TlsIndex ); #if defined( __RUNTIME_CHECKS__ ) && defined( _M_IX86 ) if( tdata == (thread_data *)2 ) return; #else if( tdata == NULL ) return; #endif thread_handle = tdata->thread_handle; __RemoveThreadData( tdata->thread_id ); #if defined( __RUNTIME_CHECKS__ ) && defined( _M_IX86 ) TlsSetValue( __TlsIndex, (void*)2 ); #else TlsSetValue( __TlsIndex, NULL ); #endif if( thread_handle != 0 && close_handle ) { CloseHandle( thread_handle ); } } }
static void __LibCKeyValueDestructor(void * pPerThreadData) { /* what to do here with the data! */ thread_data *tdata = (thread_data *) pPerThreadData; if(NULL != tdata) { __RemoveThreadData(tdata->thread_id); } }
void __RdosRemoveThread( void ) /*****************************/ { thread_data *tdata; int thread_handle; if( __TlsIndex != NO_INDEX ) { tdata = __tls_get_value( __TlsIndex ); if( tdata == NULL ) return; __RemoveThreadData( tdata->thread_id ); __tls_set_value( __TlsIndex, NULL ); } }
void __OS2RemoveThread( void ) /****************************/ { TID tid; tid = *_threadid; if( tid <= __MaxThreads ) { if( __ThreadData[tid].allocated_entry ) { lib_free( __ThreadData[tid].data ); } __ThreadData[tid].data = NULL; } else { __RemoveThreadData( tid ); } }