static void DebugThread( void *Param ) { int CurrModuleHandle; int WaitHandle; int thread; struct TDebug *obj = (struct TDebug *)Param; obj->FInstalled = TRUE; CurrModuleHandle = RdosGetModuleHandle(); SelfKey = RdosGetModuleFocusKey( CurrModuleHandle ); if ( SelfKey != RdosGetFocus() ) SelfKey = 0; RdosWaitMilli( 250 ); obj->FHandle = RdosSpawnDebug( obj->FProgram, obj->FParam, obj->FStartDir, 0, 0, &thread); RdosWaitMilli( 250 ); if( obj->FHandle ) { WaitHandle = RdosCreateWait(); RdosAddWaitForDebugEvent( WaitHandle, obj->FHandle, obj ); while( obj->FInstalled ) if( RdosWaitForever( WaitHandle ) ) SignalDebugData( obj ); RdosCloseWait( WaitHandle ); } else obj->FInstalled = FALSE; }
void RemoteUnLink( void ) { #ifdef SERVER #ifdef __RDOS__ if( wait_handle ) { RdosCloseWait( wait_handle ); wait_handle = 0; } if( listen_handle ) { RdosCloseTcpListen( listen_handle ); listen_handle = 0; } #else soclose( control_socket ); #endif #else Terminate(); #endif #if defined(__NT__) || defined(__WINDOWS__) WSACleanup(); #elif defined(__DOS__) sock_exit(); #endif }
void intern finikeyboard( void ) { if( KeyInstalled ) { if( !MouseInstalled ) { RdosCloseWait( WaitHandle ); WaitHandle = 0; } } KeyInstalled = FALSE; }
void FreeDebug( struct TDebug *obj ) { free( obj->FProgram ); free( obj->FParam ); free( obj->FStartDir ); RdosCloseWait( obj->UserWait ); RdosFreeSignal( obj->UserSignal ); RdosDeleteSection( obj->FSection ); }
void UIAPI finimouse( void ) { if( MouseInstalled ) { uioffmouse(); if( !KeyInstalled ) { RdosCloseWait( WaitHandle ); WaitHandle = 0; } MouseInstalled = false; } }
void intern finimouse( void ) { if( MouseInstalled ) { uioffmouse(); if( !KeyInstalled ) { RdosCloseWait( WaitHandle ); WaitHandle = 0; } MouseInstalled = FALSE; } }
int __CBeginThread( thread_fn *start_addr, int prio, const char *thread_name, unsigned stack_size, void *arglist ) /************************************************************/ { thread_args *td; int th; int wait_handle; if( __TlsIndex == NO_INDEX ) { if( !__RdosThreadInit() ) return( -1L ); __InitMultipleThread(); } td = malloc( sizeof( *td ) ); if( td == NULL ) { _RWD_errno = ENOMEM; return( -1L ); } stack_size = __ROUND_UP_SIZE_4K( stack_size ); wait_handle = RdosCreateWait(); td->rtn = start_addr; td->argument = arglist; td->signal = RdosCreateSignal(); RdosResetSignal( td->signal ); RdosAddWaitForSignal( wait_handle, td->signal, 0 ); __create_thread(begin_thread_helper, prio, thread_name, td, stack_size); RdosWaitForever( wait_handle ); RdosFreeSignal( td->signal ); RdosCloseWait( wait_handle ); th = td->tid; free( td ); return( th ); }
int _dospawn( int mode, CHAR_TYPE *pgmname, CHAR_TYPE *cmdline, CHAR_TYPE *envpar, const CHAR_TYPE * const argv[] ) { int tid; int handle; int wait; int rc = -1; int fh; int len; char *p; char *drive; char *dir; char *fname; char *ext; char *envdata; char *envp; char *ep; char *options; int ok; options = __CreateInheritString(); __F_NAME(__ccmdline,__wccmdline)( pgmname, argv, cmdline, 0 ); ok = 0; len = strlen( pgmname ) + 7 + _MAX_PATH2; p = lib_malloc( len ); _splitpath2( pgmname, p + (len-_MAX_PATH2), &drive, &dir, &fname, &ext ); _makepath( p, drive, dir, fname, ext ); fh = RdosOpenFile( p, 0 ); if( fh == 0 ) { if( strlen( drive ) == 0 && strlen( dir ) == 0 ) { envdata = getenv( "PATH" ); if( envdata ) { envp = envdata; while( envp && !ok) { ep = strchr( envp, ';' ); if( ep ) { *ep = 0; ep++; } _makepath( p, "", envp, fname, ext ); fh = RdosOpenFile( pgmname, 0 ); if( fh ) { ok = 1; RdosCloseFile( fh ); } envp = ep; } } } } else { RdosCloseFile( fh ); ok = 1; } if( ok ) { handle = RdosSpawn( pgmname, cmdline, 0, envpar, options, &tid ); if( !handle ) ok = 0; } if( ok ) { if( mode == P_WAIT ) { wait = RdosCreateWait(); RdosAddWaitForProcessEnd( wait, handle, 0 ); RdosWaitForever( wait ); rc = RdosGetProcessExitCode( handle ); RdosCloseWait( wait ); } else rc = tid; RdosFreeProcessHandle( handle ); } lib_free( options ); lib_free( p ); return( rc ); }