OSCollectionIterator.cpp [plain text]
#define IOKIT_ENABLE_SHARED_PTR
#include <libkern/c++/OSArray.h>
#include <libkern/c++/OSCollection.h>
#include <libkern/c++/OSCollectionIterator.h>
#include <libkern/c++/OSLib.h>
#include <libkern/c++/OSSharedPtr.h>
#define super OSIterator
OSDefineMetaClassAndStructors(OSCollectionIterator, OSIterator)
bool
OSCollectionIterator::initWithCollection(const OSCollection *inColl)
{
if (!super::init() || !inColl) {
return false;
}
collection.reset(inColl, OSRetain);
collIterator = NULL;
initialUpdateStamp = 0;
valid = false;
return true;
}
OSSharedPtr<OSCollectionIterator>
OSCollectionIterator::withCollection(const OSCollection *inColl)
{
OSSharedPtr<OSCollectionIterator> me = OSMakeShared<OSCollectionIterator>();
if (me && !me->initWithCollection(inColl)) {
return nullptr;
}
return me;
}
void
OSCollectionIterator::free()
{
if (collIterator) {
kfree(collIterator, collection->iteratorSize());
OSCONTAINER_ACCUMSIZE(-((size_t) collection->iteratorSize()));
collIterator = NULL;
}
collection.reset();
super::free();
}
void
OSCollectionIterator::reset()
{
valid = false;
if (!collIterator) {
collIterator = (void *)kalloc_container(collection->iteratorSize());
OSCONTAINER_ACCUMSIZE(collection->iteratorSize());
if (!collIterator) {
return;
}
}
if (!collection->initIterator(collIterator)) {
return;
}
initialUpdateStamp = collection->updateStamp;
valid = true;
}
bool
OSCollectionIterator::isValid()
{
if (!collIterator) {
collIterator = (void *)kalloc_container(collection->iteratorSize());
OSCONTAINER_ACCUMSIZE(collection->iteratorSize());
if (!collection->initIterator(collIterator)) {
return false;
}
initialUpdateStamp = collection->updateStamp;
valid = true;
} else if (!valid || collection->updateStamp != initialUpdateStamp) {
return false;
}
return true;
}
OSObject *
OSCollectionIterator::getNextObject()
{
OSObject *retObj;
bool retVal;
if (!isValid()) {
return NULL;
}
retVal = collection->getNextObjectForIterator(collIterator, &retObj);
return (retVal)? retObj : NULL;
}