1c1dac77fSApple OSS Distributions /* 2855239e5SApple OSS Distributions * Copyright (c) 1998-2000, 2009 Apple Inc. All rights reserved. 3c1dac77fSApple OSS Distributions * 4e13b1fa5SApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5c1dac77fSApple OSS Distributions * 6e13b1fa5SApple OSS Distributions * This file contains Original Code and/or Modifications of Original Code 7e13b1fa5SApple OSS Distributions * as defined in and that are subject to the Apple Public Source License 8e13b1fa5SApple OSS Distributions * Version 2.0 (the 'License'). You may not use this file except in 9e13b1fa5SApple OSS Distributions * compliance with the License. The rights granted to you under the License 10e13b1fa5SApple OSS Distributions * may not be used to create, or enable the creation or redistribution of, 11e13b1fa5SApple OSS Distributions * unlawful or unlicensed copies of an Apple operating system, or to 12e13b1fa5SApple OSS Distributions * circumvent, violate, or enable the circumvention or violation of, any 13e13b1fa5SApple OSS Distributions * terms of an Apple operating system software license agreement. 14c1dac77fSApple OSS Distributions * 15e13b1fa5SApple OSS Distributions * Please obtain a copy of the License at 16e13b1fa5SApple OSS Distributions * http://www.opensource.apple.com/apsl/ and read it before using this file. 17e13b1fa5SApple OSS Distributions * 18e13b1fa5SApple OSS Distributions * The Original Code and all software distributed under the License are 19e13b1fa5SApple OSS Distributions * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 20c1dac77fSApple OSS Distributions * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 21c1dac77fSApple OSS Distributions * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 22e13b1fa5SApple OSS Distributions * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 23e13b1fa5SApple OSS Distributions * Please see the License for the specific language governing rights and 24e13b1fa5SApple OSS Distributions * limitations under the License. 25c1dac77fSApple OSS Distributions * 26e13b1fa5SApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27c1dac77fSApple OSS Distributions */ 28c1dac77fSApple OSS Distributions /* 29a5e72196SApple OSS Distributions * Copyright (c) 1998 Apple Computer, Inc. All rights reserved. 30a5e72196SApple OSS Distributions * 31a5e72196SApple OSS Distributions * HISTORY 32a5e72196SApple OSS Distributions * 1998-7-13 Godfrey van der Linden(gvdl) 33a5e72196SApple OSS Distributions * Created. 34a5e72196SApple OSS Distributions * ]*/ 35*bb611c8fSApple OSS Distributions 36*bb611c8fSApple OSS Distributions #define IOKIT_ENABLE_SHARED_PTR 37*bb611c8fSApple OSS Distributions 38c1dac77fSApple OSS Distributions #include <IOKit/IOLib.h> 39c1dac77fSApple OSS Distributions 40c1dac77fSApple OSS Distributions #include <IOKit/IOEventSource.h> 41c1dac77fSApple OSS Distributions #include <IOKit/IOWorkLoop.h> 42cc9a6355SApple OSS Distributions #include <libkern/Block.h> 43c1dac77fSApple OSS Distributions 44c1dac77fSApple OSS Distributions #define super OSObject 45c1dac77fSApple OSS Distributions 46c1dac77fSApple OSS Distributions OSDefineMetaClassAndAbstractStructors(IOEventSource, OSObject) 47855239e5SApple OSS Distributions 48c1dac77fSApple OSS Distributions OSMetaClassDefineReservedUnused(IOEventSource, 0); 49c1dac77fSApple OSS Distributions OSMetaClassDefineReservedUnused(IOEventSource, 1); 50c1dac77fSApple OSS Distributions OSMetaClassDefineReservedUnused(IOEventSource, 2); 51c1dac77fSApple OSS Distributions OSMetaClassDefineReservedUnused(IOEventSource, 3); 52c1dac77fSApple OSS Distributions OSMetaClassDefineReservedUnused(IOEventSource, 4); 53c1dac77fSApple OSS Distributions OSMetaClassDefineReservedUnused(IOEventSource, 5); 54c1dac77fSApple OSS Distributions OSMetaClassDefineReservedUnused(IOEventSource, 6); 55c1dac77fSApple OSS Distributions OSMetaClassDefineReservedUnused(IOEventSource, 7); 56c1dac77fSApple OSS Distributions 57a5e72196SApple OSS Distributions bool 58a5e72196SApple OSS Distributions IOEventSource::checkForWork() 59a5e72196SApple OSS Distributions { 60a5e72196SApple OSS Distributions return false; 61a5e72196SApple OSS Distributions } 62855239e5SApple OSS Distributions 63fad439e7SApple OSS Distributions /* inline function implementations */ 64855239e5SApple OSS Distributions 65855239e5SApple OSS Distributions #if IOKITSTATS 66855239e5SApple OSS Distributions 67855239e5SApple OSS Distributions #define IOStatisticsRegisterCounter() \ 68855239e5SApple OSS Distributions do { \ 69855239e5SApple OSS Distributions reserved->counter = IOStatistics::registerEventSource(inOwner); \ 70855239e5SApple OSS Distributions } while (0) 71855239e5SApple OSS Distributions 72855239e5SApple OSS Distributions #define IOStatisticsUnregisterCounter() \ 73855239e5SApple OSS Distributions do { \ 74855239e5SApple OSS Distributions if (reserved) \ 75855239e5SApple OSS Distributions IOStatistics::unregisterEventSource(reserved->counter); \ 76855239e5SApple OSS Distributions } while (0) 77855239e5SApple OSS Distributions 78855239e5SApple OSS Distributions #define IOStatisticsOpenGate() \ 79855239e5SApple OSS Distributions do { \ 80855239e5SApple OSS Distributions IOStatistics::countOpenGate(reserved->counter); \ 81855239e5SApple OSS Distributions } while (0) 82855239e5SApple OSS Distributions 83855239e5SApple OSS Distributions #define IOStatisticsCloseGate() \ 84855239e5SApple OSS Distributions do { \ 85855239e5SApple OSS Distributions IOStatistics::countCloseGate(reserved->counter); \ 86855239e5SApple OSS Distributions } while (0) 87855239e5SApple OSS Distributions 88855239e5SApple OSS Distributions #else 89855239e5SApple OSS Distributions 90855239e5SApple OSS Distributions #define IOStatisticsRegisterCounter() 91855239e5SApple OSS Distributions #define IOStatisticsUnregisterCounter() 92855239e5SApple OSS Distributions #define IOStatisticsOpenGate() 93855239e5SApple OSS Distributions #define IOStatisticsCloseGate() 94855239e5SApple OSS Distributions 95855239e5SApple OSS Distributions #endif /* IOKITSTATS */ 96855239e5SApple OSS Distributions 97a5e72196SApple OSS Distributions void 98a5e72196SApple OSS Distributions IOEventSource::signalWorkAvailable() 99855239e5SApple OSS Distributions { 100855239e5SApple OSS Distributions workLoop->signalWorkAvailable(); 101855239e5SApple OSS Distributions } 102855239e5SApple OSS Distributions 103a5e72196SApple OSS Distributions void 104a5e72196SApple OSS Distributions IOEventSource::openGate() 105855239e5SApple OSS Distributions { 106855239e5SApple OSS Distributions IOStatisticsOpenGate(); 107855239e5SApple OSS Distributions workLoop->openGate(); 108855239e5SApple OSS Distributions } 109855239e5SApple OSS Distributions 110a5e72196SApple OSS Distributions void 111a5e72196SApple OSS Distributions IOEventSource::closeGate() 112855239e5SApple OSS Distributions { 113855239e5SApple OSS Distributions workLoop->closeGate(); 114855239e5SApple OSS Distributions IOStatisticsCloseGate(); 115855239e5SApple OSS Distributions } 116855239e5SApple OSS Distributions 117a5e72196SApple OSS Distributions bool 118a5e72196SApple OSS Distributions IOEventSource::tryCloseGate() 119855239e5SApple OSS Distributions { 120855239e5SApple OSS Distributions bool res; 121855239e5SApple OSS Distributions if ((res = workLoop->tryCloseGate())) { 122855239e5SApple OSS Distributions IOStatisticsCloseGate(); 123855239e5SApple OSS Distributions } 124855239e5SApple OSS Distributions return res; 125855239e5SApple OSS Distributions } 126855239e5SApple OSS Distributions 127a5e72196SApple OSS Distributions int 128a5e72196SApple OSS Distributions IOEventSource::sleepGate(void *event, UInt32 type) 129855239e5SApple OSS Distributions { 1300f3703acSApple OSS Distributions int res; 131855239e5SApple OSS Distributions IOStatisticsOpenGate(); 132855239e5SApple OSS Distributions res = workLoop->sleepGate(event, type); 133855239e5SApple OSS Distributions IOStatisticsCloseGate(); 134855239e5SApple OSS Distributions return res; 135855239e5SApple OSS Distributions } 136855239e5SApple OSS Distributions 137a5e72196SApple OSS Distributions int 138a5e72196SApple OSS Distributions IOEventSource::sleepGate(void *event, AbsoluteTime deadline, UInt32 type) 139855239e5SApple OSS Distributions { 1400f3703acSApple OSS Distributions int res; 141855239e5SApple OSS Distributions IOStatisticsOpenGate(); 142855239e5SApple OSS Distributions res = workLoop->sleepGate(event, deadline, type); 143855239e5SApple OSS Distributions IOStatisticsCloseGate(); 144855239e5SApple OSS Distributions return res; 145855239e5SApple OSS Distributions } 146855239e5SApple OSS Distributions 147a5e72196SApple OSS Distributions void 148a5e72196SApple OSS Distributions IOEventSource::wakeupGate(void *event, bool oneThread) 149a5e72196SApple OSS Distributions { 150a5e72196SApple OSS Distributions workLoop->wakeupGate(event, oneThread); 151a5e72196SApple OSS Distributions } 152855239e5SApple OSS Distributions 153fad439e7SApple OSS Distributions 154a5e72196SApple OSS Distributions bool 155a5e72196SApple OSS Distributions IOEventSource::init(OSObject *inOwner, 156368ad365SApple OSS Distributions Action inAction) 157c1dac77fSApple OSS Distributions { 158a5e72196SApple OSS Distributions if (!inOwner) { 159c1dac77fSApple OSS Distributions return false; 160a5e72196SApple OSS Distributions } 161c1dac77fSApple OSS Distributions 162c1dac77fSApple OSS Distributions owner = inOwner; 163c1dac77fSApple OSS Distributions 164a5e72196SApple OSS Distributions if (!super::init()) { 165c1dac77fSApple OSS Distributions return false; 166a5e72196SApple OSS Distributions } 167c1dac77fSApple OSS Distributions 168c1dac77fSApple OSS Distributions (void) setAction(inAction); 169c1dac77fSApple OSS Distributions enabled = true; 170c1dac77fSApple OSS Distributions 171855239e5SApple OSS Distributions if (!reserved) { 172855239e5SApple OSS Distributions reserved = IONew(ExpansionData, 1); 173855239e5SApple OSS Distributions if (!reserved) { 174855239e5SApple OSS Distributions return false; 175855239e5SApple OSS Distributions } 176855239e5SApple OSS Distributions } 177855239e5SApple OSS Distributions 178855239e5SApple OSS Distributions IOStatisticsRegisterCounter(); 179855239e5SApple OSS Distributions 180c1dac77fSApple OSS Distributions return true; 181c1dac77fSApple OSS Distributions } 182c1dac77fSApple OSS Distributions 183a5e72196SApple OSS Distributions void 184a5e72196SApple OSS Distributions IOEventSource::free( void ) 185855239e5SApple OSS Distributions { 186855239e5SApple OSS Distributions IOStatisticsUnregisterCounter(); 187855239e5SApple OSS Distributions 188a5e72196SApple OSS Distributions if ((kActionBlock & flags) && actionBlock) { 189a5e72196SApple OSS Distributions Block_release(actionBlock); 190a5e72196SApple OSS Distributions } 191cc9a6355SApple OSS Distributions 192a5e72196SApple OSS Distributions if (reserved) { 193855239e5SApple OSS Distributions IODelete(reserved, ExpansionData, 1); 194a5e72196SApple OSS Distributions } 195855239e5SApple OSS Distributions 196855239e5SApple OSS Distributions super::free(); 197855239e5SApple OSS Distributions } 198855239e5SApple OSS Distributions 199a5e72196SApple OSS Distributions void 200a5e72196SApple OSS Distributions IOEventSource::setRefcon(void *newrefcon) 201cc9a6355SApple OSS Distributions { 202cc9a6355SApple OSS Distributions refcon = newrefcon; 203cc9a6355SApple OSS Distributions } 204cc9a6355SApple OSS Distributions 205a5e72196SApple OSS Distributions void * 206a5e72196SApple OSS Distributions IOEventSource::getRefcon() const 207cc9a6355SApple OSS Distributions { 208cc9a6355SApple OSS Distributions return refcon; 209cc9a6355SApple OSS Distributions } 210cc9a6355SApple OSS Distributions 211a5e72196SApple OSS Distributions IOEventSource::Action 212a5e72196SApple OSS Distributions IOEventSource::getAction() const 213cc9a6355SApple OSS Distributions { 214a5e72196SApple OSS Distributions if (kActionBlock & flags) { 215a5e72196SApple OSS Distributions return NULL; 216a5e72196SApple OSS Distributions } 217a5e72196SApple OSS Distributions return action; 218cc9a6355SApple OSS Distributions } 219cc9a6355SApple OSS Distributions 220a5e72196SApple OSS Distributions IOEventSource::ActionBlock 221a5e72196SApple OSS Distributions IOEventSource::getActionBlock(ActionBlock) const 222cc9a6355SApple OSS Distributions { 223a5e72196SApple OSS Distributions if (kActionBlock & flags) { 224a5e72196SApple OSS Distributions return actionBlock; 225a5e72196SApple OSS Distributions } 226a5e72196SApple OSS Distributions return NULL; 227cc9a6355SApple OSS Distributions } 228c1dac77fSApple OSS Distributions 229a5e72196SApple OSS Distributions void 230a5e72196SApple OSS Distributions IOEventSource::setAction(Action inAction) 231c1dac77fSApple OSS Distributions { 232a5e72196SApple OSS Distributions if ((kActionBlock & flags) && actionBlock) { 233a5e72196SApple OSS Distributions Block_release(actionBlock); 234a5e72196SApple OSS Distributions } 235c1dac77fSApple OSS Distributions action = inAction; 236*bb611c8fSApple OSS Distributions flags &= ~kActionBlock; 237c1dac77fSApple OSS Distributions } 238c1dac77fSApple OSS Distributions 239a5e72196SApple OSS Distributions void 240a5e72196SApple OSS Distributions IOEventSource::setActionBlock(ActionBlock block) 241cc9a6355SApple OSS Distributions { 242a5e72196SApple OSS Distributions if ((kActionBlock & flags) && actionBlock) { 243a5e72196SApple OSS Distributions Block_release(actionBlock); 244a5e72196SApple OSS Distributions } 245cc9a6355SApple OSS Distributions actionBlock = Block_copy(block); 246cc9a6355SApple OSS Distributions flags |= kActionBlock; 247cc9a6355SApple OSS Distributions } 248cc9a6355SApple OSS Distributions 249a5e72196SApple OSS Distributions IOEventSource * 250a5e72196SApple OSS Distributions IOEventSource::getNext() const 251a5e72196SApple OSS Distributions { 252a5e72196SApple OSS Distributions return eventChainNext; 253a5e72196SApple OSS Distributions }; 254c1dac77fSApple OSS Distributions 255a5e72196SApple OSS Distributions void 256a5e72196SApple OSS Distributions IOEventSource::setNext(IOEventSource *inNext) 257c1dac77fSApple OSS Distributions { 258c1dac77fSApple OSS Distributions eventChainNext = inNext; 259c1dac77fSApple OSS Distributions } 260c1dac77fSApple OSS Distributions 261a5e72196SApple OSS Distributions void 262a5e72196SApple OSS Distributions IOEventSource::enable() 263c1dac77fSApple OSS Distributions { 264c1dac77fSApple OSS Distributions enabled = true; 265a5e72196SApple OSS Distributions if (workLoop) { 266c1dac77fSApple OSS Distributions return signalWorkAvailable(); 267c1dac77fSApple OSS Distributions } 268a5e72196SApple OSS Distributions } 269c1dac77fSApple OSS Distributions 270a5e72196SApple OSS Distributions void 271a5e72196SApple OSS Distributions IOEventSource::disable() 272c1dac77fSApple OSS Distributions { 273c1dac77fSApple OSS Distributions enabled = false; 274c1dac77fSApple OSS Distributions } 275c1dac77fSApple OSS Distributions 276a5e72196SApple OSS Distributions bool 277a5e72196SApple OSS Distributions IOEventSource::isEnabled() const 278c1dac77fSApple OSS Distributions { 279c1dac77fSApple OSS Distributions return enabled; 280c1dac77fSApple OSS Distributions } 281c1dac77fSApple OSS Distributions 282a5e72196SApple OSS Distributions void 283a5e72196SApple OSS Distributions IOEventSource::setWorkLoop(IOWorkLoop *inWorkLoop) 284c1dac77fSApple OSS Distributions { 285a5e72196SApple OSS Distributions if (!inWorkLoop) { 286c1dac77fSApple OSS Distributions disable(); 287a5e72196SApple OSS Distributions } 288c1dac77fSApple OSS Distributions workLoop = inWorkLoop; 289c1dac77fSApple OSS Distributions } 290c1dac77fSApple OSS Distributions 291a5e72196SApple OSS Distributions IOWorkLoop * 292a5e72196SApple OSS Distributions IOEventSource::getWorkLoop() const 293c1dac77fSApple OSS Distributions { 294c1dac77fSApple OSS Distributions return workLoop; 295c1dac77fSApple OSS Distributions } 296c1dac77fSApple OSS Distributions 297a5e72196SApple OSS Distributions bool 298a5e72196SApple OSS Distributions IOEventSource::onThread() const 299c1dac77fSApple OSS Distributions { 300a5e72196SApple OSS Distributions return (workLoop != NULL) && workLoop->onThread(); 301c1dac77fSApple OSS Distributions } 302