Loading...
libkern/c++/OSOrderedSet.cpp xnu-12377.101.15 xnu-6153.41.3
--- 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;
 }