Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
RE: [cdt-dev] The Spawner...

FWIW, if you cancel a (potentially) recursive make process, make is able
to still clean up its temporary files, before the whole process tree is
killed. Thus, I guess the problem should be solved in your custom build
tool in a similar manner, rather than changing the CDT spawner.

Cheers,

Walter

> -----Original Message-----
> From: cdt-dev-bounces@xxxxxxxxxxx 
> [mailto:cdt-dev-bounces@xxxxxxxxxxx] On Behalf Of Robert Norton
> Sent: Dienstag, 20. November 2007 15:27
> To: CDT General developers list.
> Subject: RE: [cdt-dev] The Spawner...
> 
> Perhaps the solution would for Spawner to send SIGINT, then SIGTERM,
> then SIGKILL? This would give the process the best chance of 
> terminating
> cleanly. Another problem is that the one second timeout is totally
> arbitrary -- plenty of process will take longer than that to 
> clean up...
> 
> Robert
> 
> P.S.
> 
> On an unrelated note I shudder every time I see this sort of thing:
> 
> try {
> ...
> } catch (IOException e) {
> }
> 
> If you're not expecting an exception and don't want to handle it, at
> least log it so that it isn't completely hidden from sight! A simple:
> 
> MyPlugin.getDefault().log(e)
> 
> will do the trick if a suitable MyPlugin class is defined, 
> and it could
> be the clue which helps someone to spot / fix a bug. Of course this
> doesn't apply if an exception IS expected and doing nothing is the
> correct behaviour (in which case a comment would be nice).
> 
> > -----Original Message-----
> > From: cdt-dev-bounces@xxxxxxxxxxx 
> > [mailto:cdt-dev-bounces@xxxxxxxxxxx] On Behalf Of Christopher Mead
> > Sent: 20 November 2007 13:49
> > To: CDT General developers list.
> > Subject: [cdt-dev] The Spawner...
> > 
> > Hi folks,
> > 
> > Targetting the CDT MakeFile project at a custom build tool 
> > (invoked from
> > the command line) I noticed that when one presses "cancel" 
> > (on Windows)
> > that the process is unceremoniously killed (as in Unix 
> style kill -9),
> > the problem we jave with that is that our custom build tool gets no
> > opportunity to unroll state (mapped drives, locks etc.).  The 
> > following
> > code is that which does the process killing:
> > 
> > 
> > Spawner.java  (org.eclipse.cdt.utils.spawner):
> > 
> > 	public synchronized void destroy() 
> > 	{
> > 		// Sends the TERM
> > 		terminate();
> > 		// Close the streams on this side.
> > 		try {
> > 			if(null == err)
> > 	
> > ((SpawnerInputStream)getErrorStream()).close();
> > 			if(null == in)
> > 	
> > ((SpawnerInputStream)getInputStream()).close();
> > 			if(null == out)
> > 	
> > ((SpawnerOutputStream)getOutputStream()).close();
> > 		} catch (IOException e) {
> > 		}
> > 		// Grace before using the heavy gone.
> > 		if (!isDone) {
> > 			try {
> > 				wait(1000);
> > 			} catch (InterruptedException e) {
> > 			}
> > 		}
> > 		if (!isDone) {
> > 			kill();
> > 		}
> > 	}
> > 
> > 	public int kill() {
> > 		return raise(pid, KILL);
> > 	}
> > 
> > 	public int terminate() {
> > 		return raise(pid, TERM);
> > 	}
> > 
> > 
> > 
> > 
> > I understand the intention is to do a soft kill (equivalent 
> > to sending a
> > TERM signal in unix) and if that fails then to do a "kill -9" style
> > kill.  All very well.  Except that the Windows JNI code that 
> > implements
> > 'raise' does the following (I have excerpted the relavant code from
> > Win32ProcessEx.c and excised the debug code):
> > 
> > .
> > .
> > .
> > 	switch(signal)
> > 		{
> > 		case SIG_NOOP:
> > 			// Wait 0 msec -just check if the process has
> > been still running
> > 			ret = ((WAIT_TIMEOUT ==
> > WaitForSingleObject(hProc, 0)) ? 0 : -1);
> > 			break;
> > 		case SIG_HUP:
> > 			// Temporary do nothing
> > 			ret = 0;
> > 			break;
> > 		case SIG_KILL:
> > 		case SIG_TERM:
> > 		    SetEvent(pCurProcInfo -> eventTerminate);
> > 			ret = 0;
> > 			break;
> > 		case SIG_INT:
> > 		    ResetEvent(pCurProcInfo -> eventWait);
> > 			PulseEvent(pCurProcInfo -> eventBreak);
> > 			ret = (WaitForSingleObject(pCurProcInfo ->
> > eventWait, 100) == WAIT_OBJECT_0);
> > 			break;
> > 		default:
> > 			break;
> > 		}
> > .
> > .
> > .
> > 
> > So Windows treats the KILL and TERM signals identically!  Is 
> > this truly
> > the correct way of doing things?  This code doesn't seem to 
> be really
> > reflecting intended purpose of the Spawner (Java) code 
> above.  Ought I
> > raise this as a defect?  
> > 
> > Personally I found that replacing the TERM constant from "raise(pid,
> > TERM)" with a number corresponding to SIG_INT (2 according 
> to the enum
> > in Win32ProcessEx.c) did the job as far as my problems were 
> concerned,
> > how this impacts on other usage of the Spawner I'm not sure.
> > 
> > Regards,
> > 
> > Chris Mead.
> > 
> > ====================================
> > Chris Mead - Software Engineer - ARM
> > Cambridge - England
> > Phone: +44 1223 406 317
> > Email: christopher.mead@xxxxxxx
> > 
> > -- 
> > IMPORTANT NOTICE: The contents of this email and any 
> > attachments are confidential and may also be privileged. If 
> > you are not the intended recipient, please notify the sender 
> > immediately and do not disclose the contents to any other 
> > person, use it for any purpose, or store or copy the 
> > information in any medium.  Thank you.
> > 
> > 
> > _______________________________________________
> > cdt-dev mailing list
> > cdt-dev@xxxxxxxxxxx
> > https://dev.eclipse.org/mailman/listinfo/cdt-dev
> > 
> > 
> 
> _______________________________________________
> cdt-dev mailing list
> cdt-dev@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/cdt-dev
> 


Back to the top