]> git.saurik.com Git - apple/configd.git/blobdiff - SystemConfiguration.fproj/SCDNotifierInformViaCallback.c
configd-596.13.tar.gz
[apple/configd.git] / SystemConfiguration.fproj / SCDNotifierInformViaCallback.c
index cf3ec8ec4c5db1084dba5f73a0238f4a097c2285..02e7d48911fb7f11382af001d486c667a7197e71 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2005, 2008-2012 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2005, 2008-2013 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -88,16 +88,6 @@ rlsCallback(CFMachPortRef port, void *msg, CFIndex size, void *info)
 }
 
 
-static void
-portInvalidate(CFMachPortRef port, void *info) {
-       mach_port_t     mp      = CFMachPortGetPort(port);
-
-       __MACH_PORT_DEBUG(TRUE, "*** portInvalidate", mp);
-       /* remove our receive right  */
-       (void)mach_port_mod_refs(mach_task_self(), mp, MACH_PORT_RIGHT_RECEIVE, -1);
-}
-
-
 static void
 rlsSchedule(void *info, CFRunLoopRef rl, CFStringRef mode)
 {
@@ -200,10 +190,9 @@ rlsSchedule(void *info, CFRunLoopRef rl, CFStringRef mode)
 
                __MACH_PORT_DEBUG(TRUE, "*** rlsSchedule (after notifyviaport)", port);
                storePrivate->rlsNotifyPort = _SC_CFMachPortCreateWithPort("SCDynamicStore",
-                                                                    port,
-                                                                    rlsCallback,
-                                                                    &context);
-               CFMachPortSetInvalidationCallBack(storePrivate->rlsNotifyPort, portInvalidate);
+                                                                          port,
+                                                                          rlsCallback,
+                                                                          &context);
                storePrivate->rlsNotifyRLS = CFMachPortCreateRunLoopSource(NULL, storePrivate->rlsNotifyPort, 0);
 
                storePrivate->rlList = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
@@ -278,13 +267,20 @@ rlsCancel(void *info, CFRunLoopRef rl, CFStringRef mode)
                }
 
                if (storePrivate->rlsNotifyPort != NULL) {
-                       /* invalidate port */
+                       mach_port_t     mp;
+
+                       mp = CFMachPortGetPort(storePrivate->rlsNotifyPort);
                        __MACH_PORT_DEBUG((storePrivate->rlsNotifyPort != NULL),
-                                         "*** rlsCancel (before invalidating CFMachPort)",
-                                         CFMachPortGetPort(storePrivate->rlsNotifyPort));
+                                         "*** rlsCancel (before invalidating/releasing CFMachPort)",
+                                         mp);
+
+                       /* invalidate and release port */
                        CFMachPortInvalidate(storePrivate->rlsNotifyPort);
                        CFRelease(storePrivate->rlsNotifyPort);
                        storePrivate->rlsNotifyPort = NULL;
+
+                       /* and, finally, remove our receive right  */
+                       (void)mach_port_mod_refs(mach_task_self(), mp, MACH_PORT_RIGHT_RECEIVE, -1);
                }
 
                if (storePrivate->server != MACH_PORT_NULL) {
@@ -343,8 +339,10 @@ rlsPerform(void *info)
                context_info    = storePrivate->rlsContext.info;
                context_release = NULL;
        }
-       (*rlsFunction)(store, changedKeys, context_info);
-       if (context_release) {
+       if (rlsFunction != NULL) {
+               (*rlsFunction)(store, changedKeys, context_info);
+       }
+       if (context_release != NULL) {
                context_release(context_info);
        }
 
@@ -498,6 +496,7 @@ SCDynamicStoreSetDispatchQueue(SCDynamicStoreRef store, dispatch_queue_t queue)
 {
        dispatch_group_t                drainGroup      = NULL;
        dispatch_queue_t                drainQueue      = NULL;
+       dispatch_group_t                group           = NULL;
        mach_port_t                     mp;
        Boolean                         ok              = FALSE;
        dispatch_source_t               source;
@@ -562,7 +561,8 @@ SCDynamicStoreSetDispatchQueue(SCDynamicStoreRef store, dispatch_queue_t queue)
        // the group to empty and use the group's finalizer to release
        // our reference to the SCDynamicStore.
        //
-       storePrivate->dispatchGroup = dispatch_group_create();
+       group = dispatch_group_create();
+       storePrivate->dispatchGroup = group;
        CFRetain(store);
        dispatch_set_context(storePrivate->dispatchGroup, (void *)store);
        dispatch_set_finalizer_f(storePrivate->dispatchGroup, (dispatch_function_t)CFRelease);
@@ -602,7 +602,7 @@ SCDynamicStoreSetDispatchQueue(SCDynamicStoreRef store, dispatch_queue_t queue)
                msgid = notify_msg.msg.header.msgh_id;
 
                CFRetain(store);
-               dispatch_group_async(storePrivate->dispatchGroup, storePrivate->dispatchQueue, ^{
+               dispatch_group_async(group, queue, ^{
                        if (msgid == MACH_NOTIFY_NO_SENDERS) {
                                // re-establish notification and inform the client
                                (void)__SCDynamicStoreReconnectNotifications(store);