Loading...
--- xnu/xnu-3248.50.21/libkern/c++/OSDictionary.cpp
+++ xnu/xnu-1504.3.12/libkern/c++/OSDictionary.cpp
@@ -49,6 +49,15 @@
OSMetaClassDefineReservedUnused(OSDictionary, 6);
OSMetaClassDefineReservedUnused(OSDictionary, 7);
+#if OSALLOCDEBUG
+extern "C" {
+ extern int debug_container_malloc_size;
+};
+#define ACCUMSIZE(s) do { debug_container_malloc_size += (s); } while(0)
+#else
+#define ACCUMSIZE(s)
+#endif
+
#define EXT_CAST(obj) \
reinterpret_cast<OSObject *>(const_cast<OSMetaClassBase *>(obj))
@@ -57,18 +66,14 @@
if (!super::init())
return false;
- if (inCapacity > (UINT_MAX / sizeof(dictEntry)))
- return false;
-
- unsigned int size = inCapacity * sizeof(dictEntry);
-//fOptions |= kSort;
-
- dictionary = (dictEntry *) kalloc_container(size);
+ int size = inCapacity * sizeof(dictEntry);
+
+ dictionary = (dictEntry *) kalloc(size);
if (!dictionary)
return false;
bzero(dictionary, size);
- OSCONTAINER_ACCUMSIZE(size);
+ ACCUMSIZE(size);
count = 0;
capacity = inCapacity;
@@ -164,15 +169,6 @@
if (!initWithCapacity(newCapacity))
return false;
-
- if ((kSort & fOptions) && !(kSort & dict->fOptions)) {
- for (unsigned int i = 0; i < dict->count; i++) {
- if (!setObject(dict->dictionary[i].key, dict->dictionary[i].value)) {
- return false;
- }
- }
- return true;
- }
count = dict->count;
bcopy(dict->dictionary, dictionary, count * sizeof(dictEntry));
@@ -245,7 +241,7 @@
flushCollection();
if (dictionary) {
kfree(dictionary, capacity * sizeof(dictEntry));
- OSCONTAINER_ACCUMSIZE( -(capacity * sizeof(dictEntry)) );
+ ACCUMSIZE( -(capacity * sizeof(dictEntry)) );
}
super::free();
@@ -269,33 +265,28 @@
unsigned int OSDictionary::ensureCapacity(unsigned int newCapacity)
{
dictEntry *newDict;
- unsigned int finalCapacity, oldSize, newSize;
+ int oldSize, newSize;
if (newCapacity <= capacity)
return capacity;
// round up
- finalCapacity = (((newCapacity - 1) / capacityIncrement) + 1)
+ newCapacity = (((newCapacity - 1) / capacityIncrement) + 1)
* capacityIncrement;
-
- // integer overflow check
- if (finalCapacity < newCapacity || (finalCapacity > (UINT_MAX / sizeof(dictEntry))))
- return capacity;
-
- newSize = sizeof(dictEntry) * finalCapacity;
-
- newDict = (dictEntry *) kalloc_container(newSize);
+ newSize = sizeof(dictEntry) * newCapacity;
+
+ newDict = (dictEntry *) kalloc(newSize);
if (newDict) {
oldSize = sizeof(dictEntry) * capacity;
bcopy(dictionary, newDict, oldSize);
bzero(&newDict[capacity], newSize - oldSize);
- OSCONTAINER_ACCUMSIZE(((size_t)newSize) - ((size_t)oldSize));
+ ACCUMSIZE(newSize - oldSize);
kfree(dictionary, oldSize);
dictionary = newDict;
- capacity = finalCapacity;
+ capacity = newCapacity;
}
return capacity;
@@ -313,90 +304,61 @@
}
bool OSDictionary::
-setObject(const OSSymbol *aKey, const OSMetaClassBase *anObject, bool onlyAdd)
-{
- unsigned int i;
- bool exists;
-
+setObject(const OSSymbol *aKey, const OSMetaClassBase *anObject)
+{
if (!anObject || !aKey)
return false;
// if the key exists, replace the object
-
- if (fOptions & kSort) {
- i = OSSymbol::bsearch(aKey, &dictionary[0], count, sizeof(dictionary[0]));
- exists = (i < count) && (aKey == dictionary[i].key);
- } else for (exists = false, i = 0; i < count; i++) {
- if ((exists = (aKey == dictionary[i].key))) break;
- }
-
- if (exists) {
-
- if (onlyAdd) return false;
-
- const OSMetaClassBase *oldObject = dictionary[i].value;
-
- haveUpdated();
-
- anObject->taggedRetain(OSTypeID(OSCollection));
- dictionary[i].value = anObject;
-
- oldObject->taggedRelease(OSTypeID(OSCollection));
- return true;
+ for (unsigned int i = 0; i < count; i++) {
+ if (aKey == dictionary[i].key) {
+ const OSMetaClassBase *oldObject = dictionary[i].value;
+
+ haveUpdated();
+
+ anObject->taggedRetain(OSTypeID(OSCollection));
+ dictionary[i].value = anObject;
+
+ oldObject->taggedRelease(OSTypeID(OSCollection));
+ return true;
+ }
}
// add new key, possibly extending our capacity
if (count >= capacity && count >= ensureCapacity(count+1))
- return false;
+ return 0;
haveUpdated();
-
- bcopy(&dictionary[i], &dictionary[i+1], (count - i) * sizeof(dictionary[0]));
aKey->taggedRetain(OSTypeID(OSCollection));
anObject->taggedRetain(OSTypeID(OSCollection));
- dictionary[i].key = aKey;
- dictionary[i].value = anObject;
+ dictionary[count].key = aKey;
+ dictionary[count].value = anObject;
count++;
return true;
}
-bool OSDictionary::
-setObject(const OSSymbol *aKey, const OSMetaClassBase *anObject)
-{
- return (setObject(aKey, anObject, false));
-}
-
void OSDictionary::removeObject(const OSSymbol *aKey)
{
- unsigned int i;
- bool exists;
-
if (!aKey)
return;
// if the key exists, remove the object
-
- if (fOptions & kSort) {
- i = OSSymbol::bsearch(aKey, &dictionary[0], count, sizeof(dictionary[0]));
- exists = (i < count) && (aKey == dictionary[i].key);
- } else for (exists = false, i = 0; i < count; i++) {
- if ((exists = (aKey == dictionary[i].key))) break;
- }
-
- if (exists) {
- dictEntry oldEntry = dictionary[i];
-
- haveUpdated();
-
- count--;
- bcopy(&dictionary[i+1], &dictionary[i], (count - i) * sizeof(dictionary[0]));
-
- oldEntry.key->taggedRelease(OSTypeID(OSCollection));
- oldEntry.value->taggedRelease(OSTypeID(OSCollection));
- return;
- }
+ for (unsigned int i = 0; i < count; i++)
+ if (aKey == dictionary[i].key) {
+ dictEntry oldEntry = dictionary[i];
+
+ haveUpdated();
+
+ count--;
+ for (; i < count; i++)
+ dictionary[i] = dictionary[i+1];
+
+ oldEntry.key->taggedRelease(OSTypeID(OSCollection));
+ oldEntry.value->taggedRelease(OSTypeID(OSCollection));
+ return;
+ }
}
@@ -429,24 +391,13 @@
OSObject *OSDictionary::getObject(const OSSymbol *aKey) const
{
- unsigned int i;
- bool exists;
-
if (!aKey)
return 0;
- // if the key exists, return the object
-
- if (fOptions & kSort) {
- i = OSSymbol::bsearch(aKey, &dictionary[0], count, sizeof(dictionary[0]));
- exists = (i < count) && (aKey == dictionary[i].key);
- } else for (exists = false, i = 0; i < count; i++) {
- if ((exists = (aKey == dictionary[i].key))) break;
- }
-
- if (exists) {
- return (const_cast<OSObject *> ((const OSObject *)dictionary[i].value));
- }
+ // if the key exists, remove the object
+ for (unsigned int i = 0; i < count; i++)
+ if (aKey == dictionary[i].key)
+ return (const_cast<OSObject *> ((const OSObject *)dictionary[i].value));
return 0;
}