Loading...
--- xnu/xnu-12377.101.15/libkern/c++/OSOrderedSet.cpp
+++ xnu/xnu-6153.41.3/libkern/c++/OSOrderedSet.cpp
@@ -26,13 +26,9 @@
* @APPLE_OSREFERENCE_LICENSE_HEADER_END@
*/
-#define IOKIT_ENABLE_SHARED_PTR
-
#include <libkern/c++/OSDictionary.h>
+#include <libkern/c++/OSOrderedSet.h>
#include <libkern/c++/OSLib.h>
-#include <libkern/c++/OSOrderedSet.h>
-#include <libkern/c++/OSSharedPtr.h>
-#include <os/cpp_util.h>
#define super OSCollection
@@ -48,7 +44,8 @@
struct _Element {
- OSTaggedPtr<const OSMetaClassBase> obj;
+ const OSMetaClassBase * obj;
+// unsigned int pri;
};
#define EXT_CAST(obj) \
@@ -59,6 +56,8 @@
initWithCapacity(unsigned int inCapacity,
OSOrderFunction inOrdering, void *inOrderingRef)
{
+ unsigned int size;
+
if (!super::init()) {
return false;
}
@@ -67,7 +66,8 @@
return false;
}
- array = kallocp_type_container(_Element, &inCapacity, Z_WAITOK_ZERO);
+ size = sizeof(_Element) * inCapacity;
+ array = (_Element *) kalloc_container(size);
if (!array) {
return false;
}
@@ -78,43 +78,22 @@
ordering = inOrdering;
orderingRef = inOrderingRef;
- OSCONTAINER_ACCUMSIZE(sizeof(_Element) * inCapacity);
+ bzero(array, size);
+ OSCONTAINER_ACCUMSIZE(size);
return true;
}
-OSSharedPtr<OSOrderedSet>
+OSOrderedSet *
OSOrderedSet::
withCapacity(unsigned int capacity,
OSOrderFunction ordering, void * orderingRef)
{
- auto me = OSMakeShared<OSOrderedSet>();
+ OSOrderedSet *me = new OSOrderedSet;
if (me && !me->initWithCapacity(capacity, ordering, orderingRef)) {
- return nullptr;
- }
-
- return me;
-}
-
-static SInt32
-OSOrderedSetBlockToFunc(const OSMetaClassBase * obj1,
- const OSMetaClassBase * obj2,
- void * context)
-{
- OSOrderedSet::OSOrderBlock ordering = (typeof(ordering))context;
-
- return ordering(obj1, obj2);
-}
-
-
-OSSharedPtr<OSOrderedSet>
-OSOrderedSet::withCapacity(unsigned int capacity, OSOrderBlock ordering)
-{
- auto me = OSMakeShared<OSOrderedSet>();
-
- if (me && !me->initWithCapacity(capacity, &OSOrderedSetBlockToFunc, ordering)) {
- return nullptr;
+ me->release();
+ me = NULL;
}
return me;
@@ -127,7 +106,7 @@
flushCollection();
if (array) {
- kfree_type(_Element, capacity, array);
+ kfree(array, sizeof(_Element) * capacity);
OSCONTAINER_ACCUMSIZE( -(sizeof(_Element) * capacity));
}
@@ -161,6 +140,7 @@
{
_Element *newArray;
unsigned int finalCapacity;
+ vm_size_t oldSize, newSize;
if (newCapacity <= capacity) {
return capacity;
@@ -169,14 +149,24 @@
// round up
finalCapacity = (((newCapacity - 1) / capacityIncrement) + 1)
* capacityIncrement;
- if (finalCapacity < newCapacity) {
+ if ((finalCapacity < newCapacity) ||
+ (finalCapacity > (UINT_MAX / sizeof(_Element)))) {
return capacity;
}
-
- newArray = kreallocp_type_container(_Element, array,
- capacity, &finalCapacity, Z_WAITOK_ZERO);
+ newSize = sizeof(_Element) * finalCapacity;
+
+ newArray = (_Element *) kallocp_container(&newSize);
if (newArray) {
- OSCONTAINER_ACCUMSIZE(sizeof(_Element) * (finalCapacity - capacity));
+ // use all of the actual allocation size
+ finalCapacity = newSize / sizeof(_Element);
+
+ oldSize = sizeof(_Element) * capacity;
+
+ OSCONTAINER_ACCUMSIZE(((size_t)newSize) - ((size_t)oldSize));
+
+ bcopy(array, newArray, oldSize);
+ bzero(&newArray[capacity], newSize - oldSize);
+ kfree(array, oldSize);
array = newArray;
capacity = finalCapacity;
}
@@ -192,7 +182,7 @@
haveUpdated();
for (i = 0; i < count; i++) {
- array[i].obj.reset();
+ array[i].obj->taggedRelease(OSTypeID(OSCollection));
}
count = 0;
@@ -221,20 +211,17 @@
haveUpdated();
if (index != count) {
for (i = count; i > index; i--) {
- array[i] = os::move(array[i - 1]);
- }
- }
- array[index].obj.reset(anObject, OSRetain);
+ array[i] = array[i - 1];
+ }
+ }
+ array[index].obj = anObject;
+// array[index].pri = pri;
+ anObject->taggedRetain(OSTypeID(OSCollection));
count++;
return true;
}
-bool
-OSOrderedSet::setObject(unsigned int index, OSSharedPtr<const OSMetaClassBase> const& anObject)
-{
- return setObject(index, anObject.get());
-}
bool
OSOrderedSet::setFirstObject(const OSMetaClassBase *anObject)
@@ -243,21 +230,9 @@
}
bool
-OSOrderedSet::setFirstObject(OSSharedPtr<const OSMetaClassBase> const& anObject)
-{
- return setFirstObject(anObject.get());
-}
-
-bool
OSOrderedSet::setLastObject(const OSMetaClassBase *anObject)
{
return setObject( count, anObject);
-}
-
-bool
-OSOrderedSet::setLastObject(OSSharedPtr<const OSMetaClassBase> const& anObject)
-{
- return setLastObject(anObject.get());
}
@@ -271,17 +246,11 @@
// queue it behind those with same priority
for (i = 0;
- (i < count) && (ORDER(array[i].obj.get(), anObject) >= 0);
+ (i < count) && (ORDER(array[i].obj, anObject) >= 0);
i++) {
}
return setObject(i, anObject);
-}
-
-bool
-OSOrderedSet::setObject(OSSharedPtr<const OSMetaClassBase> const& anObject)
-{
- return setObject(anObject.get());
}
void
@@ -292,23 +261,17 @@
for (i = 0; i < count; i++) {
if (deleted) {
- array[i - 1] = os::move(array[i]);
+ array[i - 1] = array[i];
} else if (array[i].obj == anObject) {
deleted = true;
haveUpdated(); // Pity we can't flush the log
- array[i].obj.reset();
+ array[i].obj->taggedRelease(OSTypeID(OSCollection));
}
}
if (deleted) {
count--;
}
-}
-
-void
-OSOrderedSet::removeObject(OSSharedPtr<const OSMetaClassBase> const& anObject)
-{
- return removeObject(anObject.get());
}
bool
@@ -338,14 +301,17 @@
return NULL;
}
- return const_cast<OSObject *>((const OSObject *) array[index].obj.get());
+// if( pri)
+// *pri = array[index].pri;
+
+ return const_cast<OSObject *>((const OSObject *) array[index].obj);
}
OSObject *
OSOrderedSet::getFirstObject() const
{
if (count) {
- return const_cast<OSObject *>((const OSObject *) array[0].obj.get());
+ return const_cast<OSObject *>((const OSObject *) array[0].obj);
} else {
return NULL;
}
@@ -355,7 +321,7 @@
OSOrderedSet::getLastObject() const
{
if (count) {
- return const_cast<OSObject *>((const OSObject *) array[count - 1].obj.get());
+ return const_cast<OSObject *>((const OSObject *) array[count - 1].obj);
} else {
return NULL;
}
@@ -431,7 +397,7 @@
unsigned int index = (*iteratorP)++;
if (index < count) {
- *ret = const_cast<OSObject *>((const OSObject *) array[index].obj.get());
+ *ret = const_cast<OSObject *>((const OSObject *) array[index].obj);
} else {
*ret = NULL;
}
@@ -447,7 +413,7 @@
if ((old ^ options) & mask) {
// Value changed need to recurse over all of the child collections
for (unsigned i = 0; i < count; i++) {
- OSCollection *coll = OSDynamicCast(OSCollection, array[i].obj.get());
+ OSCollection *coll = OSDynamicCast(OSCollection, array[i].obj);
if (coll) {
coll->setOptions(options, mask);
}
@@ -457,19 +423,18 @@
return old;
}
-OSSharedPtr<OSCollection>
+OSCollection *
OSOrderedSet::copyCollection(OSDictionary *cycleDict)
{
- OSSharedPtr<OSDictionary> ourCycleDict;
- OSSharedPtr<OSCollection> ret;
- OSSharedPtr<OSOrderedSet> newSet;
-
- if (!cycleDict) {
- ourCycleDict = OSDictionary::withCapacity(16);
- if (!ourCycleDict) {
- return nullptr;
- }
- cycleDict = ourCycleDict.get();
+ bool allocDict = !cycleDict;
+ OSCollection *ret = NULL;
+ OSOrderedSet *newSet = NULL;
+
+ if (allocDict) {
+ cycleDict = OSDictionary::withCapacity(16);
+ if (!cycleDict) {
+ return NULL;
+ }
}
do {
@@ -486,28 +451,40 @@
}
// Insert object into cycle Dictionary
- cycleDict->setObject((const OSSymbol *) this, newSet.get());
+ cycleDict->setObject((const OSSymbol *) this, newSet);
newSet->capacityIncrement = capacityIncrement;
// Now copy over the contents to the new duplicate
for (unsigned int i = 0; i < count; i++) {
- OSObject *obj = EXT_CAST(array[i].obj.get());
+ OSObject *obj = EXT_CAST(array[i].obj);
OSCollection *coll = OSDynamicCast(OSCollection, obj);
if (coll) {
- OSSharedPtr<OSCollection> newColl = coll->copyCollection(cycleDict);
+ OSCollection *newColl = coll->copyCollection(cycleDict);
if (newColl) {
- obj = newColl.get(); // Rely on cycleDict ref for a bit
+ obj = newColl; // Rely on cycleDict ref for a bit
+ newColl->release();
} else {
- return ret;
+ goto abortCopy;
}
}
-
+ ;
newSet->setLastObject(obj);
}
-
- ret = os::move(newSet);
+ ;
+
+ ret = newSet;
+ newSet = NULL;
} while (false);
+abortCopy:
+ if (newSet) {
+ newSet->release();
+ }
+
+ if (allocDict) {
+ cycleDict->release();
+ }
+
return ret;
}