Re: NSTask interrupt exception
Re: NSTask interrupt exception
- Subject: Re: NSTask interrupt exception
- From: Scott Ribe <email@hidden>
- Date: Thu, 25 Jul 2013 09:40:58 -0600
On Jul 25, 2013, at 8:24 AM, Martin Hewitson <email@hidden> wrote:
> Dear list,
>
> I have a couple of users reporting exceptions (and crashes) which I think are associated with my interrupting an NSTask when they close a document. I get exceptions like this:
>
> *** -[NSConcreteTask interrupt]: task not launched
>
> In the code I do the following to cancel the NSTask when the document is closed:
>
> if (self.typesetTask != nil) {
> if ([self.typesetTask isRunning] == YES) {
> [self.typesetTask terminate];
> }
> self.typesetTask = nil;
> }
First two things I'd do:
- search the code to confirm you're never calling interrupt directly
- put some debugging around your calls to launch, log just before & after the call, or catch exceptions and log them, or whatever fits with your style & debugging support functions, to make sure you're not having some problems at launch, or log them if they occur
Then:
By the time terminate does its thing, the task might not be still running. But a good API design would not throw an exception for that, and in fact, the docs say that terminate has no effect if the task has already launched and finished. Also "not launched" is certainly not a good message for "launched, ran, completed, therefore no longer launched at this time". So I really doubt that's your problem.
In fact, I really do suspect that exception might actually be thrown when you try to launch the task. I seem to recall having seen this kind of exception when a task had failed to launch, with the "task not launched" being accurate, but the [… interrupt] being misleading to me.
But, that said, ***IF*** the docs are wrong and/or there is a bug, and the exception gets thrown because the process ends between the time you check isRunning and the time that terminate gets called, then typesetTask does not get set to nil. It seems that you're either using properties to handle retain/release, or ARC here, so it's not like it would be a pointer to a deallocated object. But ***MAYBE*** you're then using it in a way that is inappropriate for a task that has completed, and crashing there.
That's all very tenuous, but it's (barely) worth a try, as a debugging measure, catching exceptions from that terminate call in order to make sure the property gets set to nil, because it can't hurt, and there's some tiny chance it will help.
And of course you should make sure that you don't have some dumb bug that overwrites typesetTask between the time you launch it and try to terminate it ;-)
--
Scott Ribe
email@hidden
http://www.elevated-dev.com/
(303) 722-0567 voice
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden