]> git.saurik.com Git - apple/xnu.git/blobdiff - iokit/Kernel/IOService.cpp
xnu-2050.18.24.tar.gz
[apple/xnu.git] / iokit / Kernel / IOService.cpp
index 0c5dbc36cd5248fd0187a285f62917265be577cd..0eabf83f9d70ebd488ce9ff04b5d4ebd2964723c 100644 (file)
@@ -465,6 +465,8 @@ bool IOService::attach( IOService * provider )
        ok = attachToParent( getRegistryRoot(), gIOServicePlane);
     }
 
+    if (ok && !__provider) (void) getProvider();
+
     return( ok );
 }
 
@@ -767,10 +769,9 @@ IOService * IOService::getProvider( void ) const
     IOService *        parent;
     SInt32     generation;
 
-    parent = __provider;
     generation = getGenerationCount();
     if( __providerGeneration == generation)
-       return( parent );
+       return( __provider );
 
     parent = (IOService *) getParentEntry( gIOServicePlane);
     if( parent == IORegistryEntry::getRegistryRoot())
@@ -778,7 +779,8 @@ IOService * IOService::getProvider( void ) const
        parent = 0;
 
     self->__provider = parent;
-    // save the count before getParentEntry()
+    OSMemoryBarrier();
+    // save the count from before call to getParentEntry()
     self->__providerGeneration = generation;
 
     return( parent );