API FSEvents пропускает файловые дескрипторы (KQUEUE)

Я пытаюсь отслеживать набор путей с помощью API FSEvents (OSX 10.9, ARC включен, "песочница"). Следующий код пропускает файловые дескрипторы. Используя lsof, я получаю много:

Project 70505 aaa   22u  KQUEUE                  count=0, state=0x1

Через пару часов я достиг максимального предела открытых дескрипторов, и FSEventStreamCreate начал давать сбой.

Любая идея, почему он пропускает два файловых дескриптора каждый раз, когда я запускаю это?

FSEventStreamContext callbackInfo;

callbackInfo.version = 0;
callbackInfo.info    = NULL;
callbackInfo.retain  = NULL;
callbackInfo.release = NULL;
callbackInfo.copyDescription = NULL;

// ===== +2 descriptors ======
FSEventStreamRef ev = FSEventStreamCreate(NULL,
                                              NULL,
                                              &callbackInfo,
                                              ((__bridge CFArrayRef)[NSArray arrayWithObject:@"/Users/aaa/Downloads"]),
                                              kFSEventStreamEventIdSinceNow,
                                              0,
                                              kFSEventStreamCreateFlagUseCFTypes | kFSEventStreamCreateFlagWatchRoot);
// ===== +2 descriptors ======
FSEventStreamScheduleWithRunLoop(ev, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);

FSEventStreamStart(ev);
FSEventStreamStop(ev);

FSEventStreamUnscheduleFromRunLoop(ev, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
// ===== -1 descriptor ======
FSEventStreamInvalidate(ev);
FSEventStreamRelease(ev);

0 ответов

Другие вопросы по тегам