Selaa lähdekoodia

Fixes for Terminate called on already exited process.

Mark Sibly 7 vuotta sitten
vanhempi
commit
ac6d2a5c85
2 muutettua tiedostoa jossa 33 lisäystä ja 27 poistoa
  1. 24 23
      modules/std/process/native/process.cpp
  2. 9 4
      modules/std/process/native/procutil.cpp

+ 24 - 23
modules/std/process/native/process.cpp

@@ -34,8 +34,8 @@ struct bbProcess::Rep{
 	char stdoutBuf[4096];
 	char *stdoutGet;
 	int stdoutAvail=0;
-	bool terminated=false;
-	int exit;
+	bool exited=false;
+	int exit=-1;
 	
 	FinishedEvent finishedEvent;
 	StdoutEvent stdoutEvent;
@@ -52,9 +52,11 @@ struct bbProcess::Rep{
 	}
 	
 	void close(){
+		CloseHandle( proc );
 		CloseHandle( in );
 		CloseHandle( out );
 		CloseHandle( err );
+		CloseHandle( breakEvent );
 	}
 
 #else
@@ -209,9 +211,9 @@ bbBool bbProcess::start( bbString cmd ){
 	    	
 	    	GetExitCodeProcess( rep->proc,(DWORD*)&rep->exit );
 	    	
-	    	CloseHandle( rep->breakEvent );
+//	    	CloseHandle( rep->breakEvent );
 	    		
-	    	CloseHandle( rep->proc );
+//	    	CloseHandle( rep->proc );
 	    	
 		#else
 		
@@ -226,6 +228,8 @@ bbBool bbProcess::start( bbString cmd ){
 			
 		#endif
 		
+			rep->exited=true;
+		
 			rep->finishedEvent.post();
 
 	} ).detach();
@@ -272,13 +276,6 @@ bbBool bbProcess::start( bbString cmd ){
     return true;
 }
 
-int bbProcess::exitCode(){
-
-	if( !_rep ) return -1;
-
-	return _rep->exit;
-}
-
 bbInt bbProcess::stdoutAvail(){
 
 	if( !_rep ) return 0;
@@ -342,9 +339,21 @@ int bbProcess::writeStdin( void *buf,int count ){
 	return n>=0 ? n : 0;
 }
 
+void bbProcess::terminate(){
+
+	if( !_rep || _rep->exited ) return;
+
+#if _WIN32
+	bbProcUtil::TerminateProcessGroup( _rep->proc,-1 );
+	CancelIoEx( _rep->out,0 );
+#else
+	killpg( _rep->proc,SIGTERM );
+#endif
+}
+
 void bbProcess::sendBreak(){
 
-	if( !_rep ) return;
+	if( !_rep || _rep->exited ) return;
 	
 #if _WIN32
 	SetEvent( _rep->breakEvent );
@@ -353,19 +362,11 @@ void bbProcess::sendBreak(){
 #endif
 }
 
-void bbProcess::terminate(){
-
-	if( !_rep ) return;
-
-#if _WIN32
+int bbProcess::exitCode(){
 
-	bbProcUtil::TerminateProcessGroup( _rep->proc,-1 );
-	
-	CancelIoEx( _rep->out,0 );
+	if( !_rep || !_rep->exited ) return -1;
 
-#else
-	killpg( _rep->proc,SIGTERM );
-#endif
+	return _rep->exit;
 }
 
 void bbProcess::gcMark(){

+ 9 - 4
modules/std/process/native/procutil.cpp

@@ -1,6 +1,8 @@
 
 #include "procutil.h"
 
+#include <stdio.h>
+
 namespace bbProcUtil{
 
 #if _WIN32
@@ -12,19 +14,18 @@ namespace bbProcUtil{
 		procinfo.dwSize=sizeof( procinfo );
 		
 		int gotinfo=Process32First( snapshot,&procinfo );
-			
+
 		while( gotinfo ){
 		
 			if( procinfo.th32ParentProcessID==procid ){
 			
-//				printf("process=%i parent=%i module=%x path=%s\n",procinfo.th32ProcessID,procinfo.th32ParentProcessID,procinfo.th32ModuleID,procinfo.szExeFile);
-
 				terminateChildren( procinfo.th32ProcessID,snapshot,exitCode );
 				 
 				HANDLE child=OpenProcess( PROCESS_ALL_ACCESS,0,procinfo.th32ProcessID );
 				
 				if( child ){
 					int res=TerminateProcess( child,exitCode );
+					
 					CloseHandle( child );
 				}
 			}
@@ -38,17 +39,21 @@ namespace bbProcUtil{
 		HANDLE snapshot;
 		
 		int procid=GetProcessId( prochandle );
+
+		//undocumented at msdn! GetProcessId returns 0 if process finished?
+		if( !procid ) return 1;
 		
 		snapshot=CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS,0 );
 		
 		if( snapshot!=INVALID_HANDLE_VALUE ){
-		
+			
 			terminateChildren( GetProcessId( prochandle ),snapshot,exitCode );
 
 			CloseHandle( snapshot );
 		}
 			
 		int res=TerminateProcess( prochandle,exitCode );
+		
 		return res;
 	}