VirtualBox

Ignore:
Timestamp:
Jun 25, 2013 12:37:57 PM (12 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
86706
Message:

Main/Host(HostPower)+Session+Console: convert HostPower code to signal pause/resume/savestate through internal methods, conveying information why the method was called, preparing for VM/PDM passing this information to devices and drivers

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/src-server/darwin/HostPowerDarwin.cpp

    r44529 r46775  
    55
    66/*
    7  * Copyright (C) 2008-2010 Oracle Corporation
     7 * Copyright (C) 2008-2013 Oracle Corporation
    88 *
    99 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    2626#define POWER_SOURCE_BATTERY 2
    2727
    28 HostPowerServiceDarwin::HostPowerServiceDarwin (VirtualBox *aVirtualBox)
    29   : HostPowerService (aVirtualBox)
    30   , mThread (NULL)
    31   , mRootPort (MACH_PORT_NULL)
    32   , mNotifyPort (nil)
    33   , mRunLoop (nil)
    34   , mCritical (false)
     28HostPowerServiceDarwin::HostPowerServiceDarwin(VirtualBox *aVirtualBox)
     29  : HostPowerService(aVirtualBox)
     30  , mThread(NULL)
     31  , mRootPort(MACH_PORT_NULL)
     32  , mNotifyPort(nil)
     33  , mRunLoop(nil)
     34  , mCritical(false)
    3535{
    3636    /* Create the new worker thread. */
    37     int rc = RTThreadCreate (&mThread, HostPowerServiceDarwin::powerChangeNotificationThread, this, 65536,
    38                              RTTHREADTYPE_IO, RTTHREADFLAGS_WAITABLE, "MainPower");
     37    int rc = RTThreadCreate(&mThread, HostPowerServiceDarwin::powerChangeNotificationThread, this, 65536,
     38                            RTTHREADTYPE_IO, RTTHREADFLAGS_WAITABLE, "MainPower");
    3939
    4040    if (RT_FAILURE(rc))
    41         LogFlow (("RTThreadCreate failed with %Rrc\n", rc));
     41        LogFlow(("RTThreadCreate failed with %Rrc\n", rc));
    4242}
    4343
     
    4545{
    4646    /* Jump out of the run loop. */
    47     CFRunLoopStop (mRunLoop);
     47    CFRunLoopStop(mRunLoop);
    4848    /* Remove the sleep notification port from the application runloop. */
    49     CFRunLoopRemoveSource (CFRunLoopGetCurrent(),
    50                            IONotificationPortGetRunLoopSource (mNotifyPort),
    51                            kCFRunLoopCommonModes);
     49    CFRunLoopRemoveSource(CFRunLoopGetCurrent(),
     50                          IONotificationPortGetRunLoopSource(mNotifyPort),
     51                          kCFRunLoopCommonModes);
    5252    /* Deregister for system sleep notifications. */
    53     IODeregisterForSystemPower (&mNotifierObject);
     53    IODeregisterForSystemPower(&mNotifierObject);
    5454    /* IORegisterForSystemPower implicitly opens the Root Power Domain
    5555     * IOService so we close it here. */
    56     IOServiceClose (mRootPort);
     56    IOServiceClose(mRootPort);
    5757    /* Destroy the notification port allocated by IORegisterForSystemPower */
    58     IONotificationPortDestroy (mNotifyPort);
    59 }
    60 
    61 
    62 DECLCALLBACK(int) HostPowerServiceDarwin::powerChangeNotificationThread (RTTHREAD /* ThreadSelf */, void *pInstance)
    63 {
    64     HostPowerServiceDarwin *pPowerObj = static_cast<HostPowerServiceDarwin *> (pInstance);
     58    IONotificationPortDestroy(mNotifyPort);
     59}
     60
     61
     62DECLCALLBACK(int) HostPowerServiceDarwin::powerChangeNotificationThread(RTTHREAD /* ThreadSelf */, void *pInstance)
     63{
     64    HostPowerServiceDarwin *pPowerObj = static_cast<HostPowerServiceDarwin *>(pInstance);
    6565
    6666    /* We have to initial set the critical state of the battery, cause we want
     
    7070
    7171    /* Register to receive system sleep notifications */
    72     pPowerObj->mRootPort = IORegisterForSystemPower (pPowerObj, &pPowerObj->mNotifyPort,
    73                                                      HostPowerServiceDarwin::powerChangeNotificationHandler,
    74                                                      &pPowerObj->mNotifierObject);
     72    pPowerObj->mRootPort = IORegisterForSystemPower(pPowerObj, &pPowerObj->mNotifyPort,
     73                                                    HostPowerServiceDarwin::powerChangeNotificationHandler,
     74                                                    &pPowerObj->mNotifierObject);
    7575    if (pPowerObj->mRootPort == MACH_PORT_NULL)
    7676    {
    77         LogFlow (("IORegisterForSystemPower failed\n"));
     77        LogFlow(("IORegisterForSystemPower failed\n"));
    7878        return VERR_NOT_SUPPORTED;
    7979    }
    8080    pPowerObj->mRunLoop = CFRunLoopGetCurrent();
    8181    /* Add the notification port to the application runloop */
    82     CFRunLoopAddSource (pPowerObj->mRunLoop,
    83                         IONotificationPortGetRunLoopSource (pPowerObj->mNotifyPort),
    84                         kCFRunLoopCommonModes);
     82    CFRunLoopAddSource(pPowerObj->mRunLoop,
     83                       IONotificationPortGetRunLoopSource(pPowerObj->mNotifyPort),
     84                       kCFRunLoopCommonModes);
    8585
    8686    /* Register for all battery change events. The handler will check for low
     
    9797}
    9898
    99 void HostPowerServiceDarwin::powerChangeNotificationHandler (void *pvData, io_service_t /* service */, natural_t messageType, void *pMessageArgument)
    100 {
    101     HostPowerServiceDarwin *pPowerObj = static_cast<HostPowerServiceDarwin *> (pvData);
    102     Log (( "powerChangeNotificationHandler: messageType %08lx, arg %08lx\n", (long unsigned int)messageType, (long unsigned int)pMessageArgument));
     99void HostPowerServiceDarwin::powerChangeNotificationHandler(void *pvData, io_service_t /* service */, natural_t messageType, void *pMessageArgument)
     100{
     101    HostPowerServiceDarwin *pPowerObj = static_cast<HostPowerServiceDarwin *>(pvData);
     102    Log(( "powerChangeNotificationHandler: messageType %08lx, arg %08lx\n", (long unsigned int)messageType, (long unsigned int)pMessageArgument));
    103103
    104104    switch (messageType)
     
    114114                 * IOAllowPowerChange or IOCancelPowerChange, the system will
    115115                 * wait 30 seconds then go to sleep. */
    116                 IOAllowPowerChange (pPowerObj->mRootPort, reinterpret_cast<long> (pMessageArgument));
     116                IOAllowPowerChange(pPowerObj->mRootPort, reinterpret_cast<long>(pMessageArgument));
    117117                break;
    118118            }
     
    120120            {
    121121                /* The system will go for sleep. */
    122                 pPowerObj->notify (HostPowerEvent_Suspend);
     122                pPowerObj->notify(Reason_HostSuspend);
    123123                /* If you do not call IOAllowPowerChange or IOCancelPowerChange to
    124124                 * acknowledge this message, sleep will be delayed by 30 seconds.
    125125                 * NOTE: If you call IOCancelPowerChange to deny sleep it returns
    126126                 * kIOReturnSuccess, however the system WILL still go to sleep. */
    127                 IOAllowPowerChange (pPowerObj->mRootPort, reinterpret_cast<long> (pMessageArgument));
     127                IOAllowPowerChange(pPowerObj->mRootPort, reinterpret_cast<long>(pMessageArgument));
    128128                break;
    129129            }
     
    136136            {
    137137                /* System has finished the wake up process. */
    138                 pPowerObj->notify (HostPowerEvent_Resume);
     138                pPowerObj->notify(Reason_HostResume);
    139139                break;
    140140            }
     
    144144}
    145145
    146 void HostPowerServiceDarwin::lowPowerHandler (void *pvData)
    147 {
    148     HostPowerServiceDarwin *pPowerObj = static_cast<HostPowerServiceDarwin *> (pvData);
    149 
    150     /* Following role for sending the BatteryLow event (5% is critical):
     146void HostPowerServiceDarwin::lowPowerHandler(void *pvData)
     147{
     148    HostPowerServiceDarwin *pPowerObj = static_cast<HostPowerServiceDarwin *>(pvData);
     149
     150    /* Following role for sending the BatteryLow event(5% is critical):
    151151     * - Not at VM start even if the battery is in an critical state already.
    152152     * - When the power cord is removed so the power supply change from AC to
     
    157157     *   normal triggers nothing. */
    158158    bool fCriticalStateChanged = false;
    159     pPowerObj->checkBatteryCriticalLevel (&fCriticalStateChanged);
     159    pPowerObj->checkBatteryCriticalLevel(&fCriticalStateChanged);
    160160    if (fCriticalStateChanged)
    161         pPowerObj->notify (HostPowerEvent_BatteryLow);
    162 }
    163 
    164 void HostPowerServiceDarwin::checkBatteryCriticalLevel (bool *pfCriticalChanged)
     161        pPowerObj->notify(Reason_HostBatteryLow);
     162}
     163
     164void HostPowerServiceDarwin::checkBatteryCriticalLevel(bool *pfCriticalChanged)
    165165{
    166166    CFTypeRef pBlob = IOPSCopyPowerSourcesInfo();
    167     CFArrayRef pSources = IOPSCopyPowerSourcesList (pBlob);
     167    CFArrayRef pSources = IOPSCopyPowerSourcesList(pBlob);
    168168
    169169    CFDictionaryRef pSource = NULL;
     
    173173    bool critical = false;
    174174
    175     if (CFArrayGetCount (pSources) > 0)
     175    if (CFArrayGetCount(pSources) > 0)
    176176    {
    177         for (int i = 0; i < CFArrayGetCount (pSources); ++i)
     177        for (int i = 0; i < CFArrayGetCount(pSources); ++i)
    178178        {
    179             pSource = IOPSGetPowerSourceDescription (pBlob, CFArrayGetValueAtIndex (pSources, i));
     179            pSource = IOPSGetPowerSourceDescription(pBlob, CFArrayGetValueAtIndex(pSources, i));
    180180            /* If the source is empty skip over to the next one. */
    181181            if (!pSource)
     
    183183            /* Skip all power sources which are currently not present like a
    184184             * second battery. */
    185             if (CFDictionaryGetValue (pSource, CFSTR (kIOPSIsPresentKey)) == kCFBooleanFalse)
     185            if (CFDictionaryGetValue(pSource, CFSTR(kIOPSIsPresentKey)) == kCFBooleanFalse)
    186186                continue;
    187187            /* Only internal power types are of interest. */
    188             result = CFDictionaryGetValueIfPresent (pSource, CFSTR (kIOPSTransportTypeKey), &psValue);
     188            result = CFDictionaryGetValueIfPresent(pSource, CFSTR(kIOPSTransportTypeKey), &psValue);
    189189            if (result &&
    190                 CFStringCompare ((CFStringRef)psValue, CFSTR (kIOPSInternalType), 0) == kCFCompareEqualTo)
     190                CFStringCompare((CFStringRef)psValue, CFSTR(kIOPSInternalType), 0) == kCFCompareEqualTo)
    191191            {
    192192                /* First check which power source we are connect on. */
    193                 result = CFDictionaryGetValueIfPresent (pSource, CFSTR (kIOPSPowerSourceStateKey), &psValue);
     193                result = CFDictionaryGetValueIfPresent(pSource, CFSTR(kIOPSPowerSourceStateKey), &psValue);
    194194                if (result &&
    195                     CFStringCompare ((CFStringRef)psValue, CFSTR (kIOPSACPowerValue), 0) == kCFCompareEqualTo)
     195                    CFStringCompare((CFStringRef)psValue, CFSTR(kIOPSACPowerValue), 0) == kCFCompareEqualTo)
    196196                    powerSource = POWER_SOURCE_OUTLET;
    197197                else if (result &&
    198                          CFStringCompare ((CFStringRef)psValue, CFSTR (kIOPSBatteryPowerValue), 0) == kCFCompareEqualTo)
     198                         CFStringCompare((CFStringRef)psValue, CFSTR(kIOPSBatteryPowerValue), 0) == kCFCompareEqualTo)
    199199                    powerSource = POWER_SOURCE_BATTERY;
    200200
     
    204204
    205205                /* Fetch the current capacity value of the power source */
    206                 result = CFDictionaryGetValueIfPresent (pSource, CFSTR (kIOPSCurrentCapacityKey), &psValue);
     206                result = CFDictionaryGetValueIfPresent(pSource, CFSTR(kIOPSCurrentCapacityKey), &psValue);
    207207                if (result)
    208                     CFNumberGetValue ((CFNumberRef)psValue, kCFNumberSInt32Type, &curCapacity);
     208                    CFNumberGetValue((CFNumberRef)psValue, kCFNumberSInt32Type, &curCapacity);
    209209                /* Fetch the maximum capacity value of the power source */
    210                 result = CFDictionaryGetValueIfPresent (pSource, CFSTR (kIOPSMaxCapacityKey), &psValue);
     210                result = CFDictionaryGetValueIfPresent(pSource, CFSTR(kIOPSMaxCapacityKey), &psValue);
    211211                if (result)
    212                     CFNumberGetValue ((CFNumberRef)psValue, kCFNumberSInt32Type, &maxCapacity);
     212                    CFNumberGetValue((CFNumberRef)psValue, kCFNumberSInt32Type, &maxCapacity);
    213213
    214214                /* Calculate the remaining capacity in percent */
     
    217217                /* Check for critical. 5 percent is default. */
    218218                int criticalValue = 5;
    219                 result = CFDictionaryGetValueIfPresent (pSource, CFSTR (kIOPSDeadWarnLevelKey), &psValue);
     219                result = CFDictionaryGetValueIfPresent(pSource, CFSTR(kIOPSDeadWarnLevelKey), &psValue);
    220220                if (result)
    221                     CFNumberGetValue ((CFNumberRef)psValue, kCFNumberSInt32Type, &criticalValue);
     221                    CFNumberGetValue((CFNumberRef)psValue, kCFNumberSInt32Type, &criticalValue);
    222222                critical = (remCapacity < criticalValue);
    223223                /* We have to take action only if we are on battery, the
     
    229229                    pfCriticalChanged)
    230230                    *pfCriticalChanged = true;
    231                 Log (("checkBatteryCriticalLevel: Remains: %d.%d%% Critical: %d Critical State Changed: %d\n", (int)remCapacity, (int)(remCapacity * 10) % 10, critical, pfCriticalChanged?*pfCriticalChanged:-1));
     231                Log(("checkBatteryCriticalLevel: Remains: %d.%d%% Critical: %d Critical State Changed: %d\n", (int)remCapacity, (int)(remCapacity * 10) % 10, critical, pfCriticalChanged?*pfCriticalChanged:-1));
    232232            }
    233233        }
     
    236236    mCritical = critical;
    237237
    238     CFRelease (pBlob);
    239     CFRelease (pSources);
    240 }
    241 
     238    CFRelease(pBlob);
     239    CFRelease(pSources);
     240}
     241
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette