diff --git a/ChangeLog b/ChangeLog index 6ffc323..b387275 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2014-04-06 German Arias + + * Headers/ProjectCenter/PCProjectLauncher.h: Add new variable + _isErrorRunning. + * Framework/PCProjectLauncher.m: Remove observer in -logStdOut: and + -logErrOut:. And wait until receive all data in -runDidTerminate:. + 2014-04-02 German Arias * Framework/PCFileCreator.m (-replaceTagsInFileAtPath:withProject:): diff --git a/Framework/PCProjectLauncher.m b/Framework/PCProjectLauncher.m index 0cc3710..db3ca46 100644 --- a/Framework/PCProjectLauncher.m +++ b/Framework/PCProjectLauncher.m @@ -399,6 +399,7 @@ enum { [debugButton setEnabled:NO]; _isRunning = YES; + _isErrorRunning = YES; RELEASE(args); } @@ -409,7 +410,16 @@ enum { return; } - [NOTIFICATION_CENTER removeObserver:self]; + [NOTIFICATION_CENTER removeObserver: self + name: NSTaskDidTerminateNotification + object: launchTask]; + + // Wait if there are data available. + if (_isRunning || _isErrorRunning) + { + [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode + beforeDate: [NSDate distantFuture]]; + } [runButton setState:NSOffState]; [debugButton setState:NSOffState]; @@ -419,7 +429,6 @@ enum { RELEASE(launchTask); launchTask = nil; - _isRunning = NO; _isDebugging = NO; } @@ -428,24 +437,38 @@ enum { { NSData *data; - if ((data = [readHandle availableData])) + if ((data = [readHandle availableData]) && [data length] > 0) { [self logData:data error:NO]; + [readHandle waitForDataInBackgroundAndNotifyForModes:nil]; } + else + { + [NOTIFICATION_CENTER removeObserver: self + name: NSFileHandleDataAvailableNotification + object: readHandle]; - [readHandle waitForDataInBackgroundAndNotifyForModes:nil]; + _isRunning = NO; + } } - (void)logErrOut:(NSNotification *)aNotif { NSData *data; - if ((data = [errorReadHandle availableData])) + if ((data = [errorReadHandle availableData]) && [data length] > 0) { [self logData:data error:YES]; + [errorReadHandle waitForDataInBackgroundAndNotifyForModes:nil]; + } + else + { + [NOTIFICATION_CENTER removeObserver: self + name: NSFileHandleDataAvailableNotification + object: errorReadHandle]; + + _isErrorRunning = NO; } - - [errorReadHandle waitForDataInBackgroundAndNotifyForModes:nil]; } @end diff --git a/Headers/ProjectCenter/PCProjectLauncher.h b/Headers/ProjectCenter/PCProjectLauncher.h index 69b1416..3beb598 100644 --- a/Headers/ProjectCenter/PCProjectLauncher.h +++ b/Headers/ProjectCenter/PCProjectLauncher.h @@ -50,6 +50,7 @@ id debugger; BOOL _isRunning; + BOOL _isErrorRunning; BOOL _isDebugging; }