]> git.saurik.com Git - apple/xnu.git/blob - iokit/Kernel/IOPMinformeeList.cpp
xnu-792.13.8.tar.gz
[apple/xnu.git] / iokit / Kernel / IOPMinformeeList.cpp
1 /*
2 * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_OSREFERENCE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. The rights granted to you under the
10 * License may not be used to create, or enable the creation or
11 * redistribution of, unlawful or unlicensed copies of an Apple operating
12 * system, or to circumvent, violate, or enable the circumvention or
13 * violation of, any terms of an Apple operating system software license
14 * agreement.
15 *
16 * Please obtain a copy of the License at
17 * http://www.opensource.apple.com/apsl/ and read it before using this
18 * file.
19 *
20 * The Original Code and all software distributed under the License are
21 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
22 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
23 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
24 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
25 * Please see the License for the specific language governing rights and
26 * limitations under the License.
27 *
28 * @APPLE_LICENSE_OSREFERENCE_HEADER_END@
29 */
30 #include <IOKit/pwr_mgt/IOPM.h>
31 #include <IOKit/pwr_mgt/IOPMinformeeList.h>
32 #include <IOKit/pwr_mgt/IOPMinformee.h>
33
34 #define super OSObject
35 OSDefineMetaClassAndStructors(IOPMinformeeList,OSObject)
36
37 //*********************************************************************************
38 // init
39 //
40 //*********************************************************************************
41 void IOPMinformeeList::initialize ( void )
42 {
43 firstItem = NULL;
44 length = 0;
45 }
46
47 //*********************************************************************************
48 // addToList
49 //
50 //*********************************************************************************
51
52 IOReturn IOPMinformeeList::addToList ( IOPMinformee * newInformee )
53 {
54 IOPMinformee * nextInformee;
55 nextInformee = firstItem; // Is new object already in the list?
56 while ( nextInformee != NULL ) {
57 if ( nextInformee->whatObject == newInformee->whatObject ) {
58 return IOPMNoErr; // yes, just return
59 }
60 nextInformee = nextInList(nextInformee);
61 }
62 newInformee->nextInList = firstItem; // add it to list
63 firstItem = newInformee;
64 length += 1;
65 return IOPMNoErr;
66 }
67
68
69 //*********************************************************************************
70 // firstInList
71 //
72 //*********************************************************************************
73
74 IOPMinformee * IOPMinformeeList::firstInList ( void )
75 {
76 return firstItem;
77 }
78
79 //*********************************************************************************
80 // nextInList
81 //
82 //*********************************************************************************
83
84 IOPMinformee * IOPMinformeeList::nextInList ( IOPMinformee * currentItem )
85 {
86 if ( currentItem != NULL ) {
87 return (currentItem->nextInList);
88 }
89 return NULL;
90 }
91
92 //*********************************************************************************
93 // numberOfItems
94 //
95 //*********************************************************************************
96
97 unsigned long IOPMinformeeList::numberOfItems ( void )
98 {
99 return length;
100 }
101
102 //*********************************************************************************
103 // findItem
104 //
105 // Look through the list for the one which points to the object identified
106 // by the parameter. Return a pointer to the list item or NULL.
107 //*********************************************************************************
108
109 IOPMinformee * IOPMinformeeList::findItem ( IOService * driverOrChild )
110 {
111 IOPMinformee * nextObject;
112
113 nextObject = firstInList();
114 while ( nextObject != NULL ) {
115 if ( nextObject->whatObject == driverOrChild ) {
116 return nextObject;
117 }
118 nextObject = nextInList(nextObject);
119 }
120 return NULL;
121 }
122
123
124 //*********************************************************************************
125 // removeFromList
126 //
127 // Find the item in the list, unlink it, and free it.
128 //*********************************************************************************
129
130 IOReturn IOPMinformeeList::removeFromList ( IOService * theItem )
131 {
132 IOPMinformee * item = firstItem;
133 IOPMinformee * temp;
134
135 if ( item != NULL ) {
136 if ( item->whatObject == theItem ) {
137 firstItem = item->nextInList;
138 length--;
139 item->release();
140 return IOPMNoErr;
141 }
142 while ( item->nextInList != NULL ) {
143 if ( item->nextInList->whatObject == theItem ) {
144 temp = item->nextInList;
145 item->nextInList = temp->nextInList;
146 length--;
147 temp->release();
148 return IOPMNoErr;
149 }
150 item = item->nextInList;
151 }
152 }
153 return IOPMNoErr;
154 }
155
156
157 //*********************************************************************************
158 // free
159 //
160 // Free all items in the list, and then free the list itself
161 //*********************************************************************************
162
163 void IOPMinformeeList::free (void )
164 {
165 IOPMinformee * next = firstItem;
166
167 while ( next != NULL ) {
168 firstItem = next->nextInList;
169 length--;
170 next->release();
171 next = firstItem;
172 }
173 super::free();
174 }
175