/* * Copyright (c) 1998-2019 Apple Inc. All rights reserved. * * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ * * This file contains Original Code and/or Modifications of Original Code * as defined in and that are subject to the Apple Public Source License * Version 2.0 (the 'License'). You may not use this file except in * compliance with the License. The rights granted to you under the License * may not be used to create, or enable the creation or redistribution of, * unlawful or unlicensed copies of an Apple operating system, or to * circumvent, violate, or enable the circumvention or violation of, any * terms of an Apple operating system software license agreement. * * Please obtain a copy of the License at * http://www.opensource.apple.com/apsl/ and read it before using this file. * * The Original Code and all software distributed under the License are * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. * Please see the License for the specific language governing rights and * limitations under the License. * * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ */ #ifndef _IOKIT_IOSERVICESTATENOTIFICATIONEVENTSOURCE_H #define _IOKIT_IOSERVICESTATENOTIFICATIONEVENTSOURCE_H #include #include class IOService; /*! @class IOServiceStateNotificationEventSource : public IOEventSource * @abstract Event source for IOService state notification delivery to work-loop based drivers. * @discussion For use with the IOService.iig IOService::StateNotification* APIs. */ class IOServiceStateNotificationEventSource : public IOEventSource { OSDeclareDefaultStructors(IOServiceStateNotificationEventSource); public: typedef void (^ActionBlock)(); protected: IOService * fStateNotification; IOStateNotificationListenerRef fListener; bool fEnable; bool fArmed; /*! @struct ExpansionData * @discussion This structure will be used to expand the capablilties of the IOWorkLoop in the future. */ /*! @var reserved * Reserved for future use. (Internal use only) */ APPLE_KEXT_WSHADOW_PUSH; ExpansionData *reserved; APPLE_KEXT_WSHADOW_POP; /*! @function free * @abstract Sub-class implementation of free method, disconnects from the interrupt source. */ virtual void free() APPLE_KEXT_OVERRIDE; /*! @function checkForWork * @abstract Pure Virtual member function used by IOWorkLoop for issueing a client calls. * @discussion This function called when the work-loop is ready to check for any work to do and then to call out the owner/action. * @result Return true if this function needs to be called again before all its outstanding events have been processed. */ virtual bool checkForWork() APPLE_KEXT_OVERRIDE; /*! @function setWorkLoop * @abstract Sub-class implementation of setWorkLoop method. */ virtual void setWorkLoop(IOWorkLoop *inWorkLoop) APPLE_KEXT_OVERRIDE; public: /*! * @brief Create an IOServiceStateNotificationEventSource for notification of IOService state events sent by the StateNotificationSet() api. * @param service The object hosting state, typically returned by IOService::CopySystemStateNotificationService(). * @param items Array of state item names to be notified about. * @param action Handler block to be invoked on the event source workloop when the notification fires. * @return IOServiceStateNotificationEventSource with +1 retain, or NULL on failure. */ static OSPtr serviceStateNotificationEventSource(IOService *service, OSArray * items, ActionBlock action); /*! @function enable * @abstract Enable event source. * @discussion A subclass implementation is expected to respect the enabled * state when checkForWork is called. Calling this function will cause the * work-loop to be signalled so that a checkForWork is performed. */ virtual void enable() APPLE_KEXT_OVERRIDE; /*! @function disable * @abstract Disable event source. * @discussion A subclass implementation is expected to respect the enabled * state when checkForWork is called. */ virtual void disable() APPLE_KEXT_OVERRIDE; private: OSMetaClassDeclareReservedUnused(IOServiceStateNotificationEventSource, 0); OSMetaClassDeclareReservedUnused(IOServiceStateNotificationEventSource, 1); OSMetaClassDeclareReservedUnused(IOServiceStateNotificationEventSource, 2); OSMetaClassDeclareReservedUnused(IOServiceStateNotificationEventSource, 3); OSMetaClassDeclareReservedUnused(IOServiceStateNotificationEventSource, 4); OSMetaClassDeclareReservedUnused(IOServiceStateNotificationEventSource, 5); OSMetaClassDeclareReservedUnused(IOServiceStateNotificationEventSource, 6); OSMetaClassDeclareReservedUnused(IOServiceStateNotificationEventSource, 7); }; #endif /* !_IOKIT_IOSERVICESTATENOTIFICATIONEVENTSOURCE_H */