Loading...
libkern/c++/OSDictionary.cpp xnu-3248.50.21 xnu-4903.221.2
--- xnu/xnu-3248.50.21/libkern/c++/OSDictionary.cpp
+++ xnu/xnu-4903.221.2/libkern/c++/OSDictionary.cpp
@@ -269,7 +269,8 @@
 unsigned int OSDictionary::ensureCapacity(unsigned int newCapacity)
 {
     dictEntry *newDict;
-    unsigned int finalCapacity, oldSize, newSize;
+    unsigned int finalCapacity;
+    vm_size_t oldSize, newSize;
 
     if (newCapacity <= capacity)
         return capacity;
@@ -284,8 +285,11 @@
     
     newSize = sizeof(dictEntry) * finalCapacity;
 
-    newDict = (dictEntry *) kalloc_container(newSize);
+    newDict = (dictEntry *) kallocp_container(&newSize);
     if (newDict) {
+        // use all of the actual allocation size
+        finalCapacity = newSize / sizeof(dictEntry);
+
         oldSize = sizeof(dictEntry) * capacity;
 
         bcopy(dictionary, newDict, oldSize);
@@ -701,3 +705,49 @@
     return ret;
 }
 
+OSArray * OSDictionary::copyKeys(void)
+{
+    OSArray * array;
+
+	array = OSArray::withCapacity(count);
+	if (!array) return (0);
+
+	for (unsigned int i = 0; i < count; i++)
+	{
+	    if (!array->setObject(i, dictionary[i].key))
+	    {
+            array->release();
+            array = 0;
+            break;
+        }
+	}
+    return (array);
+}
+
+bool OSDictionary::iterateObjects(void * refcon, bool (*callback)(void * refcon, const OSSymbol * key, OSObject * object))
+{
+    unsigned int initialUpdateStamp;
+    bool         done;
+
+    initialUpdateStamp = updateStamp;
+    done = false;
+	for (unsigned int i = 0; i < count; i++)
+    {
+        done = callback(refcon, dictionary[i].key, EXT_CAST(dictionary[i].value));
+        if (done)                              break;
+        if (initialUpdateStamp != updateStamp) break;
+    }
+
+    return initialUpdateStamp == updateStamp;
+}
+
+static bool OSDictionaryIterateObjectsBlock(void * refcon, const OSSymbol * key, OSObject * object)
+{
+    bool (^block)(const OSSymbol * key, OSObject * object) = (typeof(block)) refcon;
+    return (block(key, object));
+}
+
+bool OSDictionary::iterateObjects(bool (^block)(const OSSymbol * key, OSObject * object))
+{
+	return (iterateObjects((void *)block, &OSDictionaryIterateObjectsBlock));
+}