Loading...
libkern/c++/OSCollection.cpp xnu-3248.50.21 xnu-4903.231.4
--- xnu/xnu-3248.50.21/libkern/c++/OSCollection.cpp
+++ xnu/xnu-4903.231.4/libkern/c++/OSCollection.cpp
@@ -62,11 +62,7 @@
 {
     if (fOptions & kImmutable)
     {
-#if __LP64__
 	if (!(gIOKitDebug & kOSRegistryModsMode))
-#else
-	if (gIOKitDebug & kOSRegistryModsMode)
-#endif
 	{
 	    panic("Trying to change a collection in the registry");
 	}
@@ -106,3 +102,37 @@
 	return this;
     }
 }
+
+bool OSCollection::iterateObjects(void * refcon, bool (*callback)(void * refcon, OSObject * object))
+{
+    uint64_t     iteratorStore[2];
+    unsigned int initialUpdateStamp;
+    bool         done;
+
+    assert(iteratorSize() < sizeof(iteratorStore));
+
+    if (!initIterator(&iteratorStore[0])) return (false);
+
+    initialUpdateStamp = updateStamp;
+    done = false;
+    do
+    {
+        OSObject * object;
+        if (!getNextObjectForIterator(&iteratorStore[0], &object)) break;
+        done = callback(refcon, object);
+    }
+    while (!done && (initialUpdateStamp == updateStamp));
+
+    return initialUpdateStamp == updateStamp;
+}
+
+static bool OSCollectionIterateObjectsBlock(void * refcon, OSObject * object)
+{
+    bool (^block)(OSObject * object) = (typeof(block)) refcon;
+    return (block(object));
+}
+
+bool OSCollection::iterateObjects(bool (^block)(OSObject * object))
+{
+    return (iterateObjects((void *) block, OSCollectionIterateObjectsBlock));
+}