Re: RunLoop in Helper Tool
Re: RunLoop in Helper Tool
- Subject: Re: RunLoop in Helper Tool
- From: "Gerriet M. Denkmann" <email@hidden>
- Date: Sun, 15 Sep 2013 21:23:52 +0700
On 15 Sep 2013, at 16:42, Jean-Daniel Dupas <email@hidden> wrote:
> XPC is based on GCD. There is chance that your request handling occurs in a GCD thread and not on the main thread.
Correct. NSThread tells me:
mainThread <NSThread: 0x7f92b14096a0>{name = (null), num = 1}
currentThread <NSThread: 0x7f92b3502cf0>{name = (null), num = 2}
> [NSRunLoop currentRunLoop] returns the current thread run loop. If you are not on the main thread, it will not work.
NSRunLoop *currentRunLoop = [ NSRunLoop currentRunLoop ];
CFRunLoopRef rl1 = [ currentRunLoop getCFRunLoop ]; // mode = nil
CFRunLoopRef rl2 = CFRunLoopGetMain (); // mode = kCFRunLoopDefaultMode
> Try that instead: CFRunLoopStop(CFRunLoopGetMain());
Tried it. Even tried stopping both run loops, but to no avail. The helper tool just will not quit.
But maybe I will be able to make my NSTimers work now having a better understanding of what is going on.
Thanks!
Gerriet.
> Le 15 sept. 2013 à 10:32, Gerriet M. Denkmann <email@hidden> a écrit :
>
>> I have a Helper Tool, running as root, started via SMJobBless and communicating vie Xpc.
>>
>> Works fine, but:
>> 1. it cannot stop (CFRunLoopStop),
>> 2. Timers never fire
>> 3. NSRunLoop currentMode returns nil.
>>
>> Maybe all three things are related.
>>
>> To 1:
>>
>> if ( asked to quit )
>> {
>> NSRunLoop *currentRunLoop = [ NSRunLoop currentRunLoop ];
>> CFRunLoopRef rl = [ currentRunLoop getCFRunLoop ];
>> NSLog(@"%s will stop runloop %p",__FUNCTION__, rl); // rl ≠ NULL
>> CFRunLoopStop ( rl ); // runLoop will NOT stop
>> }
>>
>> Helper Tool main:
>>
>> int main(int argc, const char * argv[])
>> {
>> @autoreleasepool
>> {
>> NSString * bundleIdentifier = [[NSBundle mainBundle] bundleIdentifier];
>> NSXPCListener *listener = [[NSXPCListener alloc] initWithMachServiceName: bundleIdentifier ];
>> listener.delegate = ...;
>> [listener resume];
>> NSRunLoop *currentRunLoop = [NSRunLoop currentRunLoop];
>> [ currentRunLoop run ];
>> }
>>
>> return EXIT_SUCCESS;
>> }
_______________________________________________
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