1 /*
2  * Copyright (c) 2001-2002 Apple Computer, Inc. All rights reserved.
3  *
4  * @APPLE_OSREFERENCE_LICENSE_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 License
10  * may not be used to create, or enable the creation or redistribution of,
11  * unlawful or unlicensed copies of an Apple operating system, or to
12  * circumvent, violate, or enable the circumvention or violation of, any
13  * terms of an Apple operating system software license agreement.
14  *
15  * Please obtain a copy of the License at
16  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17  *
18  * The Original Code and all software distributed under the License are
19  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23  * Please see the License for the specific language governing rights and
24  * limitations under the License.
25  *
26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27  */
28 
29 #include "IOPMPowerStateQueue.h"
30 
31 #define super IOEventSource
32 OSDefineMetaClassAndStructors( IOPMPowerStateQueue, IOEventSource )
33 
34 IOPMPowerStateQueue * IOPMPowerStateQueue::PMPowerStateQueue(
35     OSObject * inOwner, Action inAction )
36 {
37     IOPMPowerStateQueue * me = new IOPMPowerStateQueue;
38 
39     if (me && !me->init(inOwner, inAction))
40     {
41         me->release();
42         return NULL;
43     }
44 
45     return me;
46 }
47 
48 bool IOPMPowerStateQueue::init( OSObject * inOwner, Action inAction )
49 {
50     if (!inAction || !(super::init(inOwner, inAction)))
51         return false;
52 
53     queue_init( &queueHead );
54 
55     queueLock = IOLockAlloc();
56     if (!queueLock)
57         return false;
58 
59     return true;
60 }
61 
62 bool IOPMPowerStateQueue::submitPowerEvent(
63      uint32_t eventType,
64      void *   arg0,
65      uint64_t arg1 )
66 {
67     PowerEventEntry * entry;
68 
69     entry = IONew(PowerEventEntry, 1);
70     if (!entry)
71         return false;
72 
73     entry->eventType = eventType;
74     entry->arg0 = arg0;
75     entry->arg1 = arg1;
76 
77     IOLockLock(queueLock);
78     queue_enter(&queueHead, entry, PowerEventEntry *, chain);
79     IOLockUnlock(queueLock);
80     signalWorkAvailable();
81 
82     return true;
83 }
84 
85 bool IOPMPowerStateQueue::checkForWork( void )
86 {
87     IOPMPowerStateQueueAction queueAction = (IOPMPowerStateQueueAction) action;
88     PowerEventEntry * entry;
89 
90 	IOLockLock(queueLock);
91 	while (!queue_empty(&queueHead))
92 	{
93 		queue_remove_first(&queueHead, entry, PowerEventEntry *, chain);
94 		IOLockUnlock(queueLock);
95 
96         (*queueAction)(owner, entry->eventType, entry->arg0, entry->arg1);
97         IODelete(entry, PowerEventEntry, 1);
98 
99         IOLockLock(queueLock);
100 	}
101 	IOLockUnlock(queueLock);
102 
103     return false;
104 }
105