Loading...
--- 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));
+}