/** * Cleans up after system_Init() and system_Configure(). */ void system_End(void) { if( tidIPCFirst == _gettid()) { HPIPE hpipe; ULONG ulAction; ULONG cbActual; ULONG rc; do { rc = DosOpen( VLC_IPC_PIPE, &hpipe, &ulAction, 0, 0, OPEN_ACTION_OPEN_IF_EXISTS, OPEN_ACCESS_READWRITE | OPEN_SHARE_DENYREADWRITE | OPEN_FLAGS_FAIL_ON_ERROR, NULL ); if( rc == ERROR_PIPE_BUSY ) DosWaitNPipe( VLC_IPC_PIPE, -1 ); else if( rc ) DosSleep( 1 ); } while( rc ); /* Ask for IPCHelper to quit */ ULONG ulCmd = IPC_CMD_QUIT; DosWrite( hpipe, &ulCmd, sizeof( ulCmd ), &cbActual ); DosClose( hpipe ); TID tid = tidIPCHelper; DosWaitThread( &tid, DCWW_WAIT ); } }
/*@ XNamedPipeClient::WaitForServer(char *name, ULONG timeOut) @group misc @remarks Wait for a server @parameters <t 'ø' c=2> øchar * øname of the requested pipe (without leading '\\PIPE\\') øULONG øhow long to wait øchar * øname of the server-maschine if the pipe is not on the local maschine<BR>(default is NULL) </t> */ LONG XNamedPipeClient::WaitForServer(char *name, ULONG timeOut, char * server) { XString n; if(server) { n += "\\"; n += server; } n += "\\PIPE\\"; n += name; return DosWaitNPipe((PSZ) (char*) n, timeOut); }
static VOID pipeOpen( HPIPE *phpipe ) { ULONG ulAction; APIRET rc; do { rc = DosOpen( m_szPipeName, phpipe, &ulAction, 0, 0, OPEN_ACTION_OPEN_IF_EXISTS, OPEN_ACCESS_READWRITE | OPEN_SHARE_DENYREADWRITE | OPEN_FLAGS_FAIL_ON_ERROR, NULL ); if( rc == ERROR_PIPE_BUSY ) while( DosWaitNPipe( m_szPipeName, -1 ) == ERROR_INTERRUPT ); else if( rc ) DosSleep( 1 ); } while( rc ); }
void system_Configure( libvlc_int_t *p_this, int i_argc, const char *const ppsz_argv[] ) { if( var_InheritBool( p_this, "high-priority" ) ) { if( !DosSetPriority( PRTYS_PROCESS, PRTYC_REGULAR, PRTYD_MAXIMUM, 0 ) ) { msg_Dbg( p_this, "raised process priority" ); } else { msg_Dbg( p_this, "could not raise process priority" ); } } if( var_InheritBool( p_this, "one-instance" ) || ( var_InheritBool( p_this, "one-instance-when-started-from-file" ) && var_InheritBool( p_this, "started-from-file" ) ) ) { HPIPE hpipe; ULONG ulAction; ULONG rc; msg_Info( p_this, "one instance mode ENABLED"); /* Use a named pipe to check if another instance is already running */ for(;;) { rc = DosOpen( VLC_IPC_PIPE, &hpipe, &ulAction, 0, 0, OPEN_ACTION_OPEN_IF_EXISTS, OPEN_ACCESS_READWRITE | OPEN_SHARE_DENYREADWRITE | OPEN_FLAGS_FAIL_ON_ERROR, NULL ); if( rc == ERROR_PIPE_BUSY ) DosWaitNPipe( VLC_IPC_PIPE, -1 ); else break; } if( rc ) { rc = DosCreateNPipe( VLC_IPC_PIPE, &hpipeIPC, NP_ACCESS_DUPLEX, NP_WAIT | NP_TYPE_MESSAGE | NP_READMODE_MESSAGE | 0x01, 32768, 32768, 0 ); if( rc ) { /* Failed to create a named pipe. Just ignore the option and * go on as normal. */ msg_Err( p_this, "one instance mode DISABLED " "(a named pipe couldn't be created)" ); return; } /* We are the 1st instance. */ /* Save the tid of the first instance */ tidIPCFirst = _gettid(); /* Run the helper thread */ tidIPCHelper = _beginthread( IPCHelperThread, NULL, 1024 * 1024, p_this ); if( tidIPCHelper == -1 ) { msg_Err( p_this, "one instance mode DISABLED " "(IPC helper thread couldn't be created)"); tidIPCFirst = -1; } } else { /* Another instance is running */ ULONG ulCmd = var_InheritBool( p_this, "playlist-enqueue") ? IPC_CMD_ENQUEUE : IPC_CMD_GO; ULONG cbActual; /* Write a command */ DosWrite( hpipe, &ulCmd, sizeof( ulCmd ), &cbActual ); /* We assume that the remaining parameters are filenames * and their input options */ /* Write a count of arguments */ DosWrite( hpipe, &i_argc, sizeof( i_argc ), &cbActual ); for( int i_opt = 0; i_opt < i_argc; i_opt++ ) { /* We need to resolve relative paths in this instance */ char *mrl; if( strstr( ppsz_argv[ i_opt ], "://" )) mrl = strdup( ppsz_argv[ i_opt ] ); else mrl = vlc_path2uri( ppsz_argv[ i_opt ], NULL ); if( !mrl ) mrl = ( char * )ppsz_argv[ i_opt ]; size_t i_len = strlen( mrl ) + 1; /* Write a length of an argument */ DosWrite( hpipe, &i_len, sizeof( i_len ), &cbActual ); /* Write an argument */ DosWrite( hpipe, mrl, i_len, &cbActual ); if( mrl != ppsz_argv[ i_opt ]) free( mrl ); } /* Close a named pipe of a client side */ DosClose( hpipe ); /* Bye bye */ system_End(); exit( 0 ); } } }