]> git.saurik.com Git - apple/xnu.git/blame - iokit/Kernel/IOPMPowerStateQueue.cpp
xnu-792.12.6.tar.gz
[apple/xnu.git] / iokit / Kernel / IOPMPowerStateQueue.cpp
CommitLineData
55e303ae
A
1/*
2 * Copyright (c) 2001-2002 Apple Computer, Inc. All rights reserved.
3 *
8ad349bb
A
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.
37839358 15 *
8ad349bb
A
16 * Please obtain a copy of the License at
17 * http://www.opensource.apple.com/apsl/ and read it before using this
18 * file.
37839358 19 *
8ad349bb
A
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.
37839358 27 *
8ad349bb 28 * @APPLE_LICENSE_OSREFERENCE_HEADER_END@
55e303ae
A
29 */
30
31#include "IOPMPowerStateQueue.h"
32#undef super
33#define super IOEventSource
34OSDefineMetaClassAndStructors(IOPMPowerStateQueue, IOEventSource);
35
36IOPMPowerStateQueue *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
49bool 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;
8ad349bb 55
55e303ae
A
56 return true;
57}
58
59
60bool 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);
8ad349bb 73
55e303ae
A
74 signalWorkAvailable();
75
76 return true;
77}
78
79// checkForWork() is called in a gated context
80bool 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:
8ad349bb 98 theTarget->command_received(theState, 0, 0, 0);
55e303ae
A
99 break;
100 }
101 }
8ad349bb 102
55e303ae
A
103 // Return true if there's more work to be done
104 if(changes) return true;
105 else return false;
106}