trap_retval ReqRunThread_get_name( void ) { run_thread_get_name_req *acc; char *name; struct TDebug *obj; struct TDebugThread *t = 0; acc = GetInPtr( 0 ); name = GetOutPtr( 0 ); strcpy( name, "" ); if( acc->thread == 0 ) strcpy( name, "Name" ); else { obj = GetCurrentDebug(); if (obj) { t = LockThread( obj, acc->thread ); if( t ) sprintf( name, "%04hX %s", t->ThreadID, t->ThreadName ); UnlockThread( obj ); } } return( strlen( name ) + 1 ); }
static void SignalDebugData( struct TDebug *obj ) { int thread; char debtype; struct TCreateProcessEvent cpe; struct TCreateThreadEvent cte; struct TLoadDllEvent lde; struct TExceptionEvent ee; int ExitCode; int handle; struct TDebugThread *newt; RdosWaitMilli( 5 ); debtype = RdosGetDebugEvent( obj->FHandle, &thread ); switch (debtype) { case EVENT_EXCEPTION: RdosGetDebugEventData( obj->FHandle, &ee ); HandleException( obj, &ee, thread ); break; case EVENT_CREATE_THREAD: RdosGetDebugEventData( obj->FHandle, &cte ); HandleCreateThread( obj, &cte ); obj->FThreadChanged = TRUE; break; case EVENT_CREATE_PROCESS: RdosGetDebugEventData( obj->FHandle, &cpe ); HandleCreateProcess( obj, &cpe ); break; case EVENT_TERMINATE_THREAD: HandleTerminateThread( obj, thread ); obj->FThreadChanged = TRUE; if( !obj->CurrentThread ) { obj->CurrentThread = obj->ThreadList; while( obj->CurrentThread && !IsDebug( obj->CurrentThread ) ) obj->CurrentThread = obj->CurrentThread->Next; if (!obj->CurrentThread) obj->CurrentThread = obj->ThreadList; } break; case EVENT_TERMINATE_PROCESS: RdosGetDebugEventData( obj->FHandle, &ExitCode ); HandleTerminateProcess( obj, ExitCode); obj->FInstalled = FALSE; RdosSetSignal( obj->UserSignal ); break; case EVENT_LOAD_DLL: RdosGetDebugEventData( obj->FHandle, &lde ); HandleLoadDll( obj, &lde ); obj->FModuleChanged = TRUE; break; case EVENT_FREE_DLL: RdosGetDebugEventData( obj->FHandle, &handle ); HandleFreeDll( obj, handle ); obj->FModuleChanged = TRUE; break; } RdosClearDebugEvent( obj->FHandle ); if( debtype == EVENT_EXCEPTION ) { if( obj->CurrentThread ) { DeactivateBreaks( obj->CurrentThread, obj->BreakList); if( thread != obj->CurrentThread->ThreadID ) { newt = LockThread( obj, thread ); if( newt ) { obj->CurrentThread = newt; obj->FThreadChanged = TRUE; } UnlockThread( obj ); } } RdosSetSignal( obj->UserSignal ); } else RdosContinueDebugEvent( obj->FHandle, thread ); }