xref: /aosp_15_r20/external/OpenCL-CTS/test_conformance/conversions/Sleep.cpp (revision 6467f958c7de8070b317fc65bcb0f6472e388d82)
1*6467f958SSadaf Ebrahimi //
2*6467f958SSadaf Ebrahimi // Copyright (c) 2017 The Khronos Group Inc.
3*6467f958SSadaf Ebrahimi //
4*6467f958SSadaf Ebrahimi // Licensed under the Apache License, Version 2.0 (the "License");
5*6467f958SSadaf Ebrahimi // you may not use this file except in compliance with the License.
6*6467f958SSadaf Ebrahimi // You may obtain a copy of the License at
7*6467f958SSadaf Ebrahimi //
8*6467f958SSadaf Ebrahimi //    http://www.apache.org/licenses/LICENSE-2.0
9*6467f958SSadaf Ebrahimi //
10*6467f958SSadaf Ebrahimi // Unless required by applicable law or agreed to in writing, software
11*6467f958SSadaf Ebrahimi // distributed under the License is distributed on an "AS IS" BASIS,
12*6467f958SSadaf Ebrahimi // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*6467f958SSadaf Ebrahimi // See the License for the specific language governing permissions and
14*6467f958SSadaf Ebrahimi // limitations under the License.
15*6467f958SSadaf Ebrahimi //
16*6467f958SSadaf Ebrahimi #if defined( __APPLE__ )
17*6467f958SSadaf Ebrahimi 
18*6467f958SSadaf Ebrahimi     #include "Sleep.h"
19*6467f958SSadaf Ebrahimi     #include <IOKit/pwr_mgt/IOPMLib.h>
20*6467f958SSadaf Ebrahimi     #include <IOKit/IOMessage.h>
21*6467f958SSadaf Ebrahimi     #include "basic_test_conversions.h"
22*6467f958SSadaf Ebrahimi 
23*6467f958SSadaf Ebrahimi     #define UNUSED  __attribute__((unused))
24*6467f958SSadaf Ebrahimi 
25*6467f958SSadaf Ebrahimi     struct
26*6467f958SSadaf Ebrahimi     {
27*6467f958SSadaf Ebrahimi         io_connect_t            connection;
28*6467f958SSadaf Ebrahimi         IONotificationPortRef    port;
29*6467f958SSadaf Ebrahimi         io_object_t                iterator;
30*6467f958SSadaf Ebrahimi     }sleepInfo;
31*6467f958SSadaf Ebrahimi 
32*6467f958SSadaf Ebrahimi     void sleepCallback(    void *            refcon,
33*6467f958SSadaf Ebrahimi                         io_service_t        service,
34*6467f958SSadaf Ebrahimi                         natural_t        messageType,
35*6467f958SSadaf Ebrahimi                         void *            messageArgument );
36*6467f958SSadaf Ebrahimi 
sleepCallback(void * refcon UNUSED,io_service_t service UNUSED,natural_t messageType,void * messageArgument)37*6467f958SSadaf Ebrahimi     void sleepCallback(    void *            refcon UNUSED,
38*6467f958SSadaf Ebrahimi                         io_service_t        service UNUSED,
39*6467f958SSadaf Ebrahimi                         natural_t        messageType,
40*6467f958SSadaf Ebrahimi                         void *            messageArgument )
41*6467f958SSadaf Ebrahimi     {
42*6467f958SSadaf Ebrahimi 
43*6467f958SSadaf Ebrahimi         IOReturn result;
44*6467f958SSadaf Ebrahimi     /*
45*6467f958SSadaf Ebrahimi     service -- The IOService whose state has changed.
46*6467f958SSadaf Ebrahimi     messageType -- A messageType enum, defined by IOKit/IOMessage.h or by the IOService's family.
47*6467f958SSadaf Ebrahimi     messageArgument -- An argument for the message, dependent on the messageType.
48*6467f958SSadaf Ebrahimi     */
49*6467f958SSadaf Ebrahimi         switch ( messageType )
50*6467f958SSadaf Ebrahimi         {
51*6467f958SSadaf Ebrahimi             case kIOMessageSystemWillSleep:
52*6467f958SSadaf Ebrahimi                 // Handle demand sleep (such as sleep caused by running out of
53*6467f958SSadaf Ebrahimi                 // batteries, closing the lid of a laptop, or selecting
54*6467f958SSadaf Ebrahimi                 // sleep from the Apple menu.
55*6467f958SSadaf Ebrahimi                 IOAllowPowerChange(sleepInfo.connection,(long)messageArgument);
56*6467f958SSadaf Ebrahimi                 vlog( "Hard sleep occurred.\n" );
57*6467f958SSadaf Ebrahimi                 break;
58*6467f958SSadaf Ebrahimi             case kIOMessageCanSystemSleep:
59*6467f958SSadaf Ebrahimi                 // In this case, the computer has been idle for several minutes
60*6467f958SSadaf Ebrahimi                 // and will sleep soon so you must either allow or cancel
61*6467f958SSadaf Ebrahimi                 // this notification. Important: if you don’t respond, there will
62*6467f958SSadaf Ebrahimi                 // be a 30-second timeout before the computer sleeps.
63*6467f958SSadaf Ebrahimi                 // IOCancelPowerChange(root_port,(long)messageArgument);
64*6467f958SSadaf Ebrahimi                 result = IOCancelPowerChange(sleepInfo.connection,(long)messageArgument);
65*6467f958SSadaf Ebrahimi                 if( kIOReturnSuccess != result )
66*6467f958SSadaf Ebrahimi                     vlog( "sleep prevention failed. (%d)\n", result);
67*6467f958SSadaf Ebrahimi             break;
68*6467f958SSadaf Ebrahimi             case kIOMessageSystemHasPoweredOn:
69*6467f958SSadaf Ebrahimi                 // Handle wakeup.
70*6467f958SSadaf Ebrahimi                 break;
71*6467f958SSadaf Ebrahimi         }
72*6467f958SSadaf Ebrahimi     }
73*6467f958SSadaf Ebrahimi 
PreventSleep(void)74*6467f958SSadaf Ebrahimi     void PreventSleep( void )
75*6467f958SSadaf Ebrahimi     {
76*6467f958SSadaf Ebrahimi         vlog( "Disabling sleep... " );
77*6467f958SSadaf Ebrahimi         sleepInfo.iterator = (io_object_t) 0;
78*6467f958SSadaf Ebrahimi         sleepInfo.port = NULL;
79*6467f958SSadaf Ebrahimi         sleepInfo.connection = IORegisterForSystemPower
80*6467f958SSadaf Ebrahimi                                 (
81*6467f958SSadaf Ebrahimi                                     &sleepInfo,                    //void * refcon,
82*6467f958SSadaf Ebrahimi                                     &sleepInfo.port,            //IONotificationPortRef * thePortRef,
83*6467f958SSadaf Ebrahimi                                     sleepCallback,                //IOServiceInterestCallback callback,
84*6467f958SSadaf Ebrahimi                                     &sleepInfo.iterator            //io_object_t * notifier
85*6467f958SSadaf Ebrahimi                                 );
86*6467f958SSadaf Ebrahimi 
87*6467f958SSadaf Ebrahimi         if( (io_connect_t) 0 == sleepInfo.connection )
88*6467f958SSadaf Ebrahimi             vlog( "failed.\n" );
89*6467f958SSadaf Ebrahimi         else
90*6467f958SSadaf Ebrahimi             vlog( "done.\n" );
91*6467f958SSadaf Ebrahimi 
92*6467f958SSadaf Ebrahimi         CFRunLoopAddSource(CFRunLoopGetCurrent(),
93*6467f958SSadaf Ebrahimi                             IONotificationPortGetRunLoopSource(sleepInfo.port),
94*6467f958SSadaf Ebrahimi                             kCFRunLoopDefaultMode);
95*6467f958SSadaf Ebrahimi     }
96*6467f958SSadaf Ebrahimi 
ResumeSleep(void)97*6467f958SSadaf Ebrahimi     void ResumeSleep( void )
98*6467f958SSadaf Ebrahimi     {
99*6467f958SSadaf Ebrahimi         IOReturn result = IODeregisterForSystemPower ( &sleepInfo.iterator );
100*6467f958SSadaf Ebrahimi         if( 0 != result )
101*6467f958SSadaf Ebrahimi             vlog( "Got error %d restoring sleep \n", result );
102*6467f958SSadaf Ebrahimi         else
103*6467f958SSadaf Ebrahimi             vlog( "Sleep restored.\n" );
104*6467f958SSadaf Ebrahimi     }
105*6467f958SSadaf Ebrahimi 
106*6467f958SSadaf Ebrahimi #else  /* not __APPLE__ */
PreventSleep(void)107*6467f958SSadaf Ebrahimi     void PreventSleep( void )  {}
ResumeSleep(void)108*6467f958SSadaf Ebrahimi     void ResumeSleep( void )   {}
109*6467f958SSadaf Ebrahimi 
110*6467f958SSadaf Ebrahimi #endif
111*6467f958SSadaf Ebrahimi 
112*6467f958SSadaf Ebrahimi 
113