X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/4452a7af2eac33dbad800bcc91f2399d62c18f53..HEAD:/iokit/Kernel/IOPMinformeeList.cpp diff --git a/iokit/Kernel/IOPMinformeeList.cpp b/iokit/Kernel/IOPMinformeeList.cpp index 57ac0bb7f..56b6ca76e 100644 --- a/iokit/Kernel/IOPMinformeeList.cpp +++ b/iokit/Kernel/IOPMinformeeList.cpp @@ -2,7 +2,7 @@ * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. * * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * + * * This file contains Original Code and/or Modifications of Original Code * as defined in and that are subject to the Apple Public Source License * Version 2.0 (the 'License'). You may not use this file except in @@ -11,10 +11,10 @@ * unlawful or unlicensed copies of an Apple operating system, or to * circumvent, violate, or enable the circumvention or violation of, any * terms of an Apple operating system software license agreement. - * + * * Please obtain a copy of the License at * http://www.opensource.apple.com/apsl/ and read it before using this file. - * + * * The Original Code and all software distributed under the License are * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, @@ -22,7 +22,7 @@ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. * Please see the License for the specific language governing rights and * limitations under the License. - * + * * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ */ #include @@ -30,79 +30,105 @@ #include #define super OSObject -OSDefineMetaClassAndStructors(IOPMinformeeList,OSObject) +OSDefineMetaClassAndStructors(IOPMinformeeList, OSObject) //********************************************************************************* // init // //********************************************************************************* -void IOPMinformeeList::initialize ( void ) +void +IOPMinformeeList::initialize( void ) { - firstItem = NULL; - length = 0; + firstItem = NULL; + length = 0; } //****************************************************************************** // getSharedRecursiveLock // //****************************************************************************** -IORecursiveLock *IOPMinformeeList::getSharedRecursiveLock( void ) +IORecursiveLock * +IOPMinformeeList::getSharedRecursiveLock( void ) { - static IORecursiveLock *sharedListLock = NULL; - - /* A running system could have 50-60+ instances of IOPMInformeeList. - * They'll share this lock, since list insertion and removal is relatively - * rare, and generally tied to major events like device discovery. - * - * getSharedRecursiveLock() is called from IOStartIOKit to initialize - * the sharedListLock before any IOPMinformeeLists are instantiated. - * - * The IOPMinformeeList class will be around for the lifetime of the system, - * we don't worry about freeing this lock. - */ - - if ( NULL == sharedListLock ) - { - sharedListLock = IORecursiveLockAlloc(); - } - return sharedListLock; + static IORecursiveLock *sharedListLock = NULL; + + /* A running system could have 50-60+ instances of IOPMInformeeList. + * They'll share this lock, since list insertion and removal is relatively + * rare, and generally tied to major events like device discovery. + * + * getSharedRecursiveLock() is called from IOStartIOKit to initialize + * the sharedListLock before any IOPMinformeeLists are instantiated. + * + * The IOPMinformeeList class will be around for the lifetime of the system, + * we don't worry about freeing this lock. + */ + + if (NULL == sharedListLock) { + sharedListLock = IORecursiveLockAlloc(); + } + return sharedListLock; } //********************************************************************************* -// addToList +// appendNewInformee // //********************************************************************************* +IOPMinformee * +IOPMinformeeList::appendNewInformee( IOService * newObject ) +{ + IOPMinformee * newInformee; + + if (!newObject) { + return NULL; + } + + newInformee = IOPMinformee::withObject(newObject); + + if (!newInformee) { + return NULL; + } + + if (IOPMNoErr == addToList(newInformee)) { + return newInformee; + } else { + newInformee->release(); + return NULL; + } +} + -IOReturn IOPMinformeeList::addToList ( IOPMinformee * newInformee ) +//********************************************************************************* +// addToList +// *OBSOLETE* do not call from outside of this file. +// Try appendNewInformee() instead +//********************************************************************************* +IOReturn +IOPMinformeeList::addToList( IOPMinformee * newInformee ) { - IOPMinformee * nextInformee; - IORecursiveLock *listLock = getSharedRecursiveLock(); - - if(!listLock) - return kIOReturnError; - - IORecursiveLockLock(listLock); - nextInformee = firstItem; - - // Is new object already in the list? - while ( nextInformee != NULL ) - { - if ( nextInformee->whatObject == newInformee->whatObject ) - { - // object is present; just exit - goto unlock_and_exit; - } - nextInformee = nextInList(nextInformee); - } - - // add it to the front of the list - newInformee->nextInList = firstItem; - firstItem = newInformee; - length++; + IORecursiveLock *listLock = getSharedRecursiveLock(); + IOReturn ret = kIOReturnError; + + if (!listLock) { + return ret; + } + + IORecursiveLockLock(listLock); + + // Is new object already in the list? + if (findItem(newInformee->whatObject) != NULL) { + // object is present; just exit + goto unlock_and_exit; + } + + // add it to the front of the list + newInformee->nextInList = firstItem; + firstItem = newInformee; + length++; + ret = IOPMNoErr; unlock_and_exit: - IORecursiveLockUnlock(listLock); - return IOPMNoErr; + IORecursiveLockUnlock(listLock); + return ret; } @@ -112,43 +138,43 @@ unlock_and_exit: // Find the item in the list, unlink it, and free it. //********************************************************************************* -IOReturn IOPMinformeeList::removeFromList ( IOService * theItem ) +IOReturn +IOPMinformeeList::removeFromList( IOService * theItem ) { - IOPMinformee * item = firstItem; - IOPMinformee * temp; - IORecursiveLock *listLock = getSharedRecursiveLock(); - - if ( NULL == item ) - return IOPMNoErr; - if(!listLock) - return kIOReturnError; - - IORecursiveLockLock( listLock ); - - if ( item->whatObject == theItem ) - { - firstItem = item->nextInList; - length--; - item->release(); - goto unlock_and_exit; - } - - while ( item->nextInList != NULL ) - { - if ( item->nextInList->whatObject == theItem ) - { - temp = item->nextInList; - item->nextInList = temp->nextInList; - length--; - temp->release(); - goto unlock_and_exit; - } - item = item->nextInList; - } + IOPMinformee * item = firstItem; + IOPMinformee * temp; + IORecursiveLock *listLock = getSharedRecursiveLock(); + + if (NULL == item) { + return IOPMNoErr; + } + if (!listLock) { + return kIOReturnError; + } + + IORecursiveLockLock( listLock ); + + if (item->whatObject == theItem) { + firstItem = item->nextInList; + length--; + item->release(); + goto unlock_and_exit; + } + + while (item->nextInList != NULL) { + if (item->nextInList->whatObject == theItem) { + temp = item->nextInList; + item->nextInList = temp->nextInList; + length--; + temp->release(); + goto unlock_and_exit; + } + item = item->nextInList; + } unlock_and_exit: - IORecursiveLockUnlock(listLock); - return IOPMNoErr; + IORecursiveLockUnlock(listLock); + return IOPMNoErr; } @@ -157,9 +183,10 @@ unlock_and_exit: // //********************************************************************************* -IOPMinformee * IOPMinformeeList::firstInList ( void ) +IOPMinformee * +IOPMinformeeList::firstInList( void ) { - return firstItem; + return firstItem; } //********************************************************************************* @@ -167,12 +194,13 @@ IOPMinformee * IOPMinformeeList::firstInList ( void ) // //********************************************************************************* -IOPMinformee * IOPMinformeeList::nextInList ( IOPMinformee * currentItem ) +IOPMinformee * +IOPMinformeeList::nextInList( IOPMinformee * currentItem ) { - if ( currentItem != NULL ) { - return (currentItem->nextInList); - } - return NULL; + if (currentItem != NULL) { + return currentItem->nextInList; + } + return NULL; } //********************************************************************************* @@ -180,9 +208,10 @@ IOPMinformee * IOPMinformeeList::nextInList ( IOPMinformee * currentItem ) // //********************************************************************************* -unsigned long IOPMinformeeList::numberOfItems ( void ) +unsigned long +IOPMinformeeList::numberOfItems( void ) { - return length; + return length; } //********************************************************************************* @@ -192,18 +221,19 @@ unsigned long IOPMinformeeList::numberOfItems ( void ) // by the parameter. Return a pointer to the list item or NULL. //********************************************************************************* -IOPMinformee * IOPMinformeeList::findItem ( IOService * driverOrChild ) +IOPMinformee * +IOPMinformeeList::findItem( IOService * driverOrChild ) { - IOPMinformee * nextObject; - - nextObject = firstInList(); - while ( nextObject != NULL ) { - if ( nextObject->whatObject == driverOrChild ) { - return nextObject; - } - nextObject = nextInList(nextObject); - } - return NULL; + IOPMinformee * nextObject; + + nextObject = firstInList(); + while (nextObject != NULL) { + if (nextObject->whatObject == driverOrChild) { + return nextObject; + } + nextObject = nextInList(nextObject); + } + return NULL; } @@ -214,16 +244,16 @@ IOPMinformee * IOPMinformeeList::findItem ( IOService * driverOrChild ) // Free all items in the list, and then free the list itself //********************************************************************************* -void IOPMinformeeList::free (void ) +void +IOPMinformeeList::free(void ) { - IOPMinformee * next = firstItem; - - while ( next != NULL ) { - firstItem = next->nextInList; - length--; - next->release(); - next = firstItem; - } -super::free(); + IOPMinformee * next = firstItem; + + while (next != NULL) { + firstItem = next->nextInList; + length--; + next->release(); + next = firstItem; + } + super::free(); } -