On Mar 27, 2011, at 11:14 PM, Ken Thomases wrote:

> On Mar 27, 2011, at 1:27 PM, Jason Harris wrote:
> 
>> - (void) doWorkerLaunches
>> {
>>   for (int i = 1; i <50; i++)
>>   {
>>       dispatch_async(dispatch_get_global_queue(0,0), ^{
>>           NSTask* task = [[NSTask alloc] init];
>>           [task setLaunchPath: @"/bin/ls"];
>> 
>>           NSArray* arguments = [NSArray arrayWithObjects: @"-l", @"-a", 
>> @"-t", nil];
>>           [task setArguments: arguments];
>> 
>>           NSPipe* pipe = [NSPipe pipe];
>>           [task setStandardOutput: pipe];
>> 
>>           NSFileHandle* file = [pipe fileHandleForReading];
>> 
>>           [task launch];
>>           [task waitUntilExit];
>> 
>>           NSData* data = [file readDataToEndOfFile];
>>       });
>>   }    
>> }
> 
> Possibly unrelated to your issue with the dispatch threads (although possibly 
> related), the above use of NSTask is somewhat broken.  You've made a common 
> mistake.  It is not OK to block waiting for the task to exit when you haven't 
> established an ongoing asynchronous read of its output (when you're capturing 
> the output rather than letting it go to file, /dev/console, or /dev/null, 
> etc.).
> 
> The problem is that pipes have a fixed buffer in the kernel.  If a task 
> writes more than that amount to the pipe when no reader is draining the pipe, 
> the writer blocks.  You don't read from the pipe until after the task has 
> exited, but the task may be prevented from exiting because you're not reading 
> from the pipe.  Classic deadlock.
> 
> Put another way, have you confirmed that your tasks are really completing?  
> Maybe the dispatch threads are still alive because of this deadlock I'm 
> describing.  (I guess it depends on whether your "ls -l -a -t" command is 
> producing more output than the size of a pipe's buffer, which in turn depends 
> on the current working directory and its contents.)

Thanks! Just to try this out I'll rework into the notification form of NSTask 
and then retest... More soon...

Thanks,
   Jas_______________________________________________

Cocoa-dev mailing list ([email protected])

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:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to [email protected]

Reply via email to