]> git.saurik.com Git - apple/xnu.git/blob - iokit/Kernel/IOPMPowerStateQueue.cpp
ec63b0f16544b2cb491b97e74d12b53e695819fb
[apple/xnu.git] / iokit / Kernel / IOPMPowerStateQueue.cpp
1 /*
2 * Copyright (c) 2001-2002 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
31 #include "IOPMPowerStateQueue.h"
32 #undef super
33 #define super IOEventSource
34 OSDefineMetaClassAndStructors(IOPMPowerStateQueue, IOEventSource);
35
36 IOPMPowerStateQueue *IOPMPowerStateQueue::PMPowerStateQueue(OSObject *inOwner)
37 {
38 IOPMPowerStateQueue *me = new IOPMPowerStateQueue;
39
40 if(me && !me->init(inOwner, 0) )
41 {
42 me->release();
43 return NULL;
44 }
45
46 return me;
47 }
48
49 bool IOPMPowerStateQueue::init(OSObject *owner, Action action)
50 {
51 if(!(super::init(owner, (IOEventSource::Action) action))) return false;
52
53 // Queue of powerstate changes
54 changes = NULL;
55
56 return true;
57 }
58
59
60 bool IOPMPowerStateQueue::unIdleOccurred(IOService *inTarget, unsigned long inState)
61 {
62 PowerChangeEntry *new_one = NULL;
63
64 new_one = (PowerChangeEntry *)IOMalloc(sizeof(PowerChangeEntry));
65 if(!new_one) return false;
66
67 new_one->actionType = IOPMPowerStateQueue::kUnIdle;
68 new_one->state = inState;
69 new_one->target = inTarget;
70
71 // Change to queue
72 OSEnqueueAtomic((void **)&changes, (void *)new_one, 0);
73
74 signalWorkAvailable();
75
76 return true;
77 }
78
79 // checkForWork() is called in a gated context
80 bool IOPMPowerStateQueue::checkForWork()
81 {
82 PowerChangeEntry *theNode;
83 int theState;
84 IOService *theTarget;
85 UInt16 theAction;
86
87 // Dequeue and process the state change request
88 if((theNode = (PowerChangeEntry *)OSDequeueAtomic((void **)&changes, 0)))
89 {
90 theState = theNode->state;
91 theTarget = theNode->target;
92 theAction = theNode->actionType;
93 IOFree((void *)theNode, sizeof(PowerChangeEntry));
94
95 switch (theAction)
96 {
97 case kUnIdle:
98 theTarget->command_received(theState, 0, 0, 0);
99 break;
100 }
101 }
102
103 // Return true if there's more work to be done
104 if(changes) return true;
105 else return false;
106 }