Re: File descriptors not freed up without a -closeFile call
Re: File descriptors not freed up without a -closeFile call
- Subject: Re: File descriptors not freed up without a -closeFile call
- From: Jean-Daniel Dupas <email@hidden>
- Date: Wed, 23 Jun 2010 12:57:56 +0200
Le 23 juin 2010 à 12:47, Ben Haller a écrit :
> On 23-Jun-10, at 6:22 AM, Uli Kusterer wrote:
>
>> Am Jun 23, 2010 um 12:14 PM schrieb Ben Haller:
>>> So I have a workaround for the problem, but I want to understand *why* it works. Shouldn't NSPipe close its associated files when it deallocs? Why should it be necessary to call -closeFile? This behavior seems to be specifically contradicted by the documentation on NSPipe, which says (in -fileHandleForReading) "The descriptor represented by this object is deleted, and the object itself is automatically deallocated when the receiver is deallocated." Well, when my NSPipes are deallocated, the file handles are indeed automatically deallocated (a funny way to put it), but the descriptor is *not* deleted. Is this a bug? More likely I'm misunderstanding something; can anybody clarify this for me?
>>
>> AFAIR, NSPipe autoreleases its NSFileHandles), which means even if you give up all your references to the pipe, it won't automatically close everything until the current autorelease pool gets popped. While closeFile doesn't get rid of the objects, it forces the file handle to be closed, which is why it solves your immediate problem.
>>
>> If you're running your own loop where you create and tear down lots of pipes, it might help to just create your own autorelease pool inside the loop on each iteration.
>
> Yes; this is not an autorelease pool problem, however, as I described in my original post. The run loop is running freely, and the pipes and file handles are in fact getting dealloced; I have confirmed this explicitly in Instruments. And yet, the file descriptors don't get deleted unless I explicitly call -closeFile. That's the mystery (or is it a bug?).
>
I just ran the following simple program in Instrument with "File Activity" probe, and I get exactly the expected result:
Opened file descriptors raise up to ~1000 (2 by pipes), and fall to ~0 in each drain call.
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
for (NSUInteger idx = 0; idx < 10000; idx++) {
NSPipe *pipe = [NSPipe pipe];
[pipe fileHandleForReading];
if (0 == (idx % 500)) {
[pool drain];
pool = [[NSAutoreleasePool alloc] init];
}
}
[pool drain];
return 0;
}
-- Jean-Daniel
_______________________________________________
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