Changeset 46775 in vbox for trunk/src/VBox/Main/src-server
- Timestamp:
- Jun 25, 2013 12:37:57 PM (12 years ago)
- svn:sync-xref-src-repo-rev:
- 86706
- Location:
- trunk/src/VBox/Main/src-server
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Main/src-server/HostPower.cpp
r44528 r46775 5 5 6 6 /* 7 * Copyright (C) 2006-201 1Oracle Corporation7 * Copyright (C) 2006-2013 Oracle Corporation 8 8 * 9 9 * This file is part of VirtualBox Open Source Edition (OSE), as … … 27 27 28 28 #include "VirtualBoxImpl.h" 29 #include "MachineImpl.h" 29 30 30 31 #include <iprt/mem.h> 31 32 32 HostPowerService::HostPowerService 33 HostPowerService::HostPowerService(VirtualBox *aVirtualBox) 33 34 { 34 35 Assert(aVirtualBox != NULL); … … 40 41 } 41 42 42 void HostPowerService::notify( HostPowerEvent aEvent)43 void HostPowerService::notify(Reason_T aReason) 43 44 { 44 45 SessionMachinesList machines; … … 47 48 HRESULT rc = S_OK; 48 49 49 switch (a Event)50 switch (aReason) 50 51 { 51 case HostPowerEvent_Suspend:52 case Reason_HostSuspend: 52 53 { 53 LogFunc 54 LogFunc(("SUSPEND\n")); 54 55 55 56 #ifdef VBOX_WITH_RESOURCE_USAGE_API … … 69 70 ComPtr<IInternalSessionControl> pControl = *it; 70 71 71 /* get the remote console */ 72 ComPtr<IConsole> console; 73 rc = pControl->GetRemoteConsole(console.asOutParam()); 74 /* the VM could have been powered down and closed or whatever */ 75 if (FAILED(rc)) 76 continue; 77 78 /* note that Pause() will simply return a failure if the VM is 79 * in an inappropriate state */ 80 rc = console->Pause(); 72 /* PauseWithReason() will simply return a failure if 73 * the VM is in an inappropriate state */ 74 rc = pControl->PauseWithReason(Reason_HostSuspend); 81 75 if (FAILED(rc)) 82 76 continue; 83 77 84 78 /* save the control to un-pause the VM later */ 85 m Consoles.push_back(console);79 mSessionControls.push_back(pControl); 86 80 } 87 81 88 LogFunc (("Suspended %d VMs\n", mConsoles.size()));82 LogFunc(("Suspended %d VMs\n", mSessionControls.size())); 89 83 90 84 break; 91 85 } 92 86 93 case HostPowerEvent_Resume:87 case Reason_HostResume: 94 88 { 95 LogFunc 89 LogFunc(("RESUME\n")); 96 90 97 91 size_t resumed = 0; 98 92 99 93 /* go through VMs we paused on Suspend */ 100 for (size_t i = 0; i < m Consoles.size(); ++i)94 for (size_t i = 0; i < mSessionControls.size(); ++i) 101 95 { 102 96 /* note that Resume() will simply return a failure if the VM is … … 104 98 * been somehow closed by this time already so that the 105 99 * console reference we have is dead) */ 106 rc = m Consoles[i]->Resume();100 rc = mSessionControls[i]->ResumeWithReason(Reason_HostResume); 107 101 if (FAILED(rc)) 108 102 continue; 109 103 110 ++ 104 ++resumed; 111 105 } 112 106 113 LogFunc 107 LogFunc(("Resumed %d VMs\n", resumed)); 114 108 115 109 #ifdef VBOX_WITH_RESOURCE_USAGE_API … … 121 115 #endif 122 116 123 m Consoles.clear();117 mSessionControls.clear(); 124 118 125 119 break; 126 120 } 127 121 128 case HostPowerEvent_BatteryLow:122 case Reason_HostBatteryLow: 129 123 { 130 LogFunc 124 LogFunc(("BATTERY LOW\n")); 131 125 132 126 mVirtualBox->getOpenedMachines(machines, &controls); … … 140 134 { 141 135 ComPtr<IInternalSessionControl> pControl = *it; 142 /* get the remote console */143 ComPtr<IConsole> console;144 rc = pControl->GetRemoteConsole (console.asOutParam());145 /* the VM could have been powered down and closed or whatever */146 if (FAILED(rc))147 continue;148 136 149 137 ComPtr<IProgress> progress; 150 138 151 /* note that SaveState () will simply return a failure if the VM152 * i s in an inappropriate state */153 rc = console->SaveState (progress.asOutParam());139 /* note that SaveStateWithReason() will simply return a failure 140 * if the VM is in an inappropriate state */ 141 rc = pControl->SaveStateWithReason(Reason_HostBatteryLow, progress.asOutParam()); 154 142 if (FAILED(rc)) 155 143 continue; … … 164 152 } 165 153 166 AssertMsg (SUCCEEDED(rc), ("SaveState WaitForCompletion " 167 "failed with %Rhrc (%#08X)\n", rc, rc)); 154 AssertMsg(SUCCEEDED(rc), ("SaveState WaitForCompletion failed with %Rhrc (%#08X)\n", rc, rc)); 168 155 169 156 if (SUCCEEDED(rc)) 170 ++ 157 ++saved; 171 158 } 172 159 173 LogFunc 160 LogFunc(("Saved %d VMs\n", saved)); 174 161 175 162 break; 176 163 } 164 165 default: 166 /* nothing */; 177 167 } 178 168 } -
trunk/src/VBox/Main/src-server/darwin/HostPowerDarwin.cpp
r44529 r46775 5 5 6 6 /* 7 * Copyright (C) 2008-201 0Oracle Corporation7 * Copyright (C) 2008-2013 Oracle Corporation 8 8 * 9 9 * This file is part of VirtualBox Open Source Edition (OSE), as … … 26 26 #define POWER_SOURCE_BATTERY 2 27 27 28 HostPowerServiceDarwin::HostPowerServiceDarwin 29 : HostPowerService 30 , mThread 31 , mRootPort 32 , mNotifyPort 33 , mRunLoop 34 , mCritical 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) 35 35 { 36 36 /* Create the new worker thread. */ 37 int rc = RTThreadCreate 38 37 int rc = RTThreadCreate(&mThread, HostPowerServiceDarwin::powerChangeNotificationThread, this, 65536, 38 RTTHREADTYPE_IO, RTTHREADFLAGS_WAITABLE, "MainPower"); 39 39 40 40 if (RT_FAILURE(rc)) 41 LogFlow 41 LogFlow(("RTThreadCreate failed with %Rrc\n", rc)); 42 42 } 43 43 … … 45 45 { 46 46 /* Jump out of the run loop. */ 47 CFRunLoopStop 47 CFRunLoopStop(mRunLoop); 48 48 /* Remove the sleep notification port from the application runloop. */ 49 CFRunLoopRemoveSource 50 IONotificationPortGetRunLoopSource(mNotifyPort),51 49 CFRunLoopRemoveSource(CFRunLoopGetCurrent(), 50 IONotificationPortGetRunLoopSource(mNotifyPort), 51 kCFRunLoopCommonModes); 52 52 /* Deregister for system sleep notifications. */ 53 IODeregisterForSystemPower 53 IODeregisterForSystemPower(&mNotifierObject); 54 54 /* IORegisterForSystemPower implicitly opens the Root Power Domain 55 55 * IOService so we close it here. */ 56 IOServiceClose 56 IOServiceClose(mRootPort); 57 57 /* Destroy the notification port allocated by IORegisterForSystemPower */ 58 IONotificationPortDestroy 59 } 60 61 62 DECLCALLBACK(int) HostPowerServiceDarwin::powerChangeNotificationThread 63 { 64 HostPowerServiceDarwin *pPowerObj = static_cast<HostPowerServiceDarwin *> 58 IONotificationPortDestroy(mNotifyPort); 59 } 60 61 62 DECLCALLBACK(int) HostPowerServiceDarwin::powerChangeNotificationThread(RTTHREAD /* ThreadSelf */, void *pInstance) 63 { 64 HostPowerServiceDarwin *pPowerObj = static_cast<HostPowerServiceDarwin *>(pInstance); 65 65 66 66 /* We have to initial set the critical state of the battery, cause we want … … 70 70 71 71 /* Register to receive system sleep notifications */ 72 pPowerObj->mRootPort = IORegisterForSystemPower 73 74 72 pPowerObj->mRootPort = IORegisterForSystemPower(pPowerObj, &pPowerObj->mNotifyPort, 73 HostPowerServiceDarwin::powerChangeNotificationHandler, 74 &pPowerObj->mNotifierObject); 75 75 if (pPowerObj->mRootPort == MACH_PORT_NULL) 76 76 { 77 LogFlow 77 LogFlow(("IORegisterForSystemPower failed\n")); 78 78 return VERR_NOT_SUPPORTED; 79 79 } 80 80 pPowerObj->mRunLoop = CFRunLoopGetCurrent(); 81 81 /* Add the notification port to the application runloop */ 82 CFRunLoopAddSource 83 IONotificationPortGetRunLoopSource(pPowerObj->mNotifyPort),84 82 CFRunLoopAddSource(pPowerObj->mRunLoop, 83 IONotificationPortGetRunLoopSource(pPowerObj->mNotifyPort), 84 kCFRunLoopCommonModes); 85 85 86 86 /* Register for all battery change events. The handler will check for low … … 97 97 } 98 98 99 void HostPowerServiceDarwin::powerChangeNotificationHandler 100 { 101 HostPowerServiceDarwin *pPowerObj = static_cast<HostPowerServiceDarwin *> 102 Log 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)); 103 103 104 104 switch (messageType) … … 114 114 * IOAllowPowerChange or IOCancelPowerChange, the system will 115 115 * wait 30 seconds then go to sleep. */ 116 IOAllowPowerChange (pPowerObj->mRootPort, reinterpret_cast<long>(pMessageArgument));116 IOAllowPowerChange(pPowerObj->mRootPort, reinterpret_cast<long>(pMessageArgument)); 117 117 break; 118 118 } … … 120 120 { 121 121 /* The system will go for sleep. */ 122 pPowerObj->notify (HostPowerEvent_Suspend);122 pPowerObj->notify(Reason_HostSuspend); 123 123 /* If you do not call IOAllowPowerChange or IOCancelPowerChange to 124 124 * acknowledge this message, sleep will be delayed by 30 seconds. 125 125 * NOTE: If you call IOCancelPowerChange to deny sleep it returns 126 126 * 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)); 128 128 break; 129 129 } … … 136 136 { 137 137 /* System has finished the wake up process. */ 138 pPowerObj->notify (HostPowerEvent_Resume);138 pPowerObj->notify(Reason_HostResume); 139 139 break; 140 140 } … … 144 144 } 145 145 146 void HostPowerServiceDarwin::lowPowerHandler 147 { 148 HostPowerServiceDarwin *pPowerObj = static_cast<HostPowerServiceDarwin *> 149 150 /* Following role for sending the BatteryLow event 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): 151 151 * - Not at VM start even if the battery is in an critical state already. 152 152 * - When the power cord is removed so the power supply change from AC to … … 157 157 * normal triggers nothing. */ 158 158 bool fCriticalStateChanged = false; 159 pPowerObj->checkBatteryCriticalLevel 159 pPowerObj->checkBatteryCriticalLevel(&fCriticalStateChanged); 160 160 if (fCriticalStateChanged) 161 pPowerObj->notify (HostPowerEvent_BatteryLow);162 } 163 164 void HostPowerServiceDarwin::checkBatteryCriticalLevel 161 pPowerObj->notify(Reason_HostBatteryLow); 162 } 163 164 void HostPowerServiceDarwin::checkBatteryCriticalLevel(bool *pfCriticalChanged) 165 165 { 166 166 CFTypeRef pBlob = IOPSCopyPowerSourcesInfo(); 167 CFArrayRef pSources = IOPSCopyPowerSourcesList 167 CFArrayRef pSources = IOPSCopyPowerSourcesList(pBlob); 168 168 169 169 CFDictionaryRef pSource = NULL; … … 173 173 bool critical = false; 174 174 175 if (CFArrayGetCount 175 if (CFArrayGetCount(pSources) > 0) 176 176 { 177 for (int i = 0; i < CFArrayGetCount 177 for (int i = 0; i < CFArrayGetCount(pSources); ++i) 178 178 { 179 pSource = IOPSGetPowerSourceDescription (pBlob, CFArrayGetValueAtIndex(pSources, i));179 pSource = IOPSGetPowerSourceDescription(pBlob, CFArrayGetValueAtIndex(pSources, i)); 180 180 /* If the source is empty skip over to the next one. */ 181 181 if (!pSource) … … 183 183 /* Skip all power sources which are currently not present like a 184 184 * second battery. */ 185 if (CFDictionaryGetValue (pSource, CFSTR(kIOPSIsPresentKey)) == kCFBooleanFalse)185 if (CFDictionaryGetValue(pSource, CFSTR(kIOPSIsPresentKey)) == kCFBooleanFalse) 186 186 continue; 187 187 /* Only internal power types are of interest. */ 188 result = CFDictionaryGetValueIfPresent (pSource, CFSTR(kIOPSTransportTypeKey), &psValue);188 result = CFDictionaryGetValueIfPresent(pSource, CFSTR(kIOPSTransportTypeKey), &psValue); 189 189 if (result && 190 CFStringCompare ((CFStringRef)psValue, CFSTR(kIOPSInternalType), 0) == kCFCompareEqualTo)190 CFStringCompare((CFStringRef)psValue, CFSTR(kIOPSInternalType), 0) == kCFCompareEqualTo) 191 191 { 192 192 /* First check which power source we are connect on. */ 193 result = CFDictionaryGetValueIfPresent (pSource, CFSTR(kIOPSPowerSourceStateKey), &psValue);193 result = CFDictionaryGetValueIfPresent(pSource, CFSTR(kIOPSPowerSourceStateKey), &psValue); 194 194 if (result && 195 CFStringCompare ((CFStringRef)psValue, CFSTR(kIOPSACPowerValue), 0) == kCFCompareEqualTo)195 CFStringCompare((CFStringRef)psValue, CFSTR(kIOPSACPowerValue), 0) == kCFCompareEqualTo) 196 196 powerSource = POWER_SOURCE_OUTLET; 197 197 else if (result && 198 CFStringCompare ((CFStringRef)psValue, CFSTR(kIOPSBatteryPowerValue), 0) == kCFCompareEqualTo)198 CFStringCompare((CFStringRef)psValue, CFSTR(kIOPSBatteryPowerValue), 0) == kCFCompareEqualTo) 199 199 powerSource = POWER_SOURCE_BATTERY; 200 200 … … 204 204 205 205 /* Fetch the current capacity value of the power source */ 206 result = CFDictionaryGetValueIfPresent (pSource, CFSTR(kIOPSCurrentCapacityKey), &psValue);206 result = CFDictionaryGetValueIfPresent(pSource, CFSTR(kIOPSCurrentCapacityKey), &psValue); 207 207 if (result) 208 CFNumberGetValue 208 CFNumberGetValue((CFNumberRef)psValue, kCFNumberSInt32Type, &curCapacity); 209 209 /* Fetch the maximum capacity value of the power source */ 210 result = CFDictionaryGetValueIfPresent (pSource, CFSTR(kIOPSMaxCapacityKey), &psValue);210 result = CFDictionaryGetValueIfPresent(pSource, CFSTR(kIOPSMaxCapacityKey), &psValue); 211 211 if (result) 212 CFNumberGetValue 212 CFNumberGetValue((CFNumberRef)psValue, kCFNumberSInt32Type, &maxCapacity); 213 213 214 214 /* Calculate the remaining capacity in percent */ … … 217 217 /* Check for critical. 5 percent is default. */ 218 218 int criticalValue = 5; 219 result = CFDictionaryGetValueIfPresent (pSource, CFSTR(kIOPSDeadWarnLevelKey), &psValue);219 result = CFDictionaryGetValueIfPresent(pSource, CFSTR(kIOPSDeadWarnLevelKey), &psValue); 220 220 if (result) 221 CFNumberGetValue 221 CFNumberGetValue((CFNumberRef)psValue, kCFNumberSInt32Type, &criticalValue); 222 222 critical = (remCapacity < criticalValue); 223 223 /* We have to take action only if we are on battery, the … … 229 229 pfCriticalChanged) 230 230 *pfCriticalChanged = true; 231 Log 231 Log(("checkBatteryCriticalLevel: Remains: %d.%d%% Critical: %d Critical State Changed: %d\n", (int)remCapacity, (int)(remCapacity * 10) % 10, critical, pfCriticalChanged?*pfCriticalChanged:-1)); 232 232 } 233 233 } … … 236 236 mCritical = critical; 237 237 238 CFRelease 239 CFRelease 240 } 241 238 CFRelease(pBlob); 239 CFRelease(pSources); 240 } 241 -
trunk/src/VBox/Main/src-server/win/HostPowerWin.cpp
r46722 r46775 5 5 6 6 /* 7 * Copyright (C) 2006-201 0Oracle Corporation7 * Copyright (C) 2006-2013 Oracle Corporation 8 8 * 9 9 * This file is part of VirtualBox Open Source Edition (OSE), as … … 36 36 mHwnd = 0; 37 37 38 int rc = RTThreadCreate 39 38 int rc = RTThreadCreate(&mThread, HostPowerServiceWin::NotificationThread, this, 65536, 39 RTTHREADTYPE_GUI, RTTHREADFLAGS_WAITABLE, "MainPower"); 40 40 41 41 if (RT_FAILURE(rc)) … … 63 63 64 64 65 DECLCALLBACK(int) HostPowerServiceWin::NotificationThread 65 DECLCALLBACK(int) HostPowerServiceWin::NotificationThread(RTTHREAD ThreadSelf, void *pInstance) 66 66 { 67 67 HostPowerServiceWin *pPowerObj = (HostPowerServiceWin *)pInstance; … … 71 71 int rc = VINF_SUCCESS; 72 72 73 HINSTANCE hInstance = (HINSTANCE)GetModuleHandle 73 HINSTANCE hInstance = (HINSTANCE)GetModuleHandle(NULL); 74 74 75 75 /* Register the Window Class. */ … … 97 97 { 98 98 /* Create the window. */ 99 hwnd = pPowerObj->mHwnd = CreateWindowEx 100 101 102 99 hwnd = pPowerObj->mHwnd = CreateWindowEx(WS_EX_TOOLWINDOW | WS_EX_TRANSPARENT | WS_EX_TOPMOST, 100 gachWindowClassName, gachWindowClassName, 101 WS_POPUPWINDOW, 102 -200, -200, 100, 100, NULL, NULL, hInstance, NULL); 103 103 104 104 if (hwnd == NULL) … … 124 124 Log(("HostPowerServiceWin::NotificationThread: exit thread\n")); 125 125 if (hwnd) 126 DestroyWindow 126 DestroyWindow(hwnd); 127 127 128 128 if (atomWindowClass != 0) 129 129 { 130 UnregisterClass 130 UnregisterClass(gachWindowClassName, hInstance); 131 131 atomWindowClass = 0; 132 132 } … … 149 149 { 150 150 case PBT_APMSUSPEND: 151 pPowerObj->notify( HostPowerEvent_Suspend);151 pPowerObj->notify(Reason_HostSuspend); 152 152 break; 153 153 154 154 case PBT_APMRESUMEAUTOMATIC: 155 pPowerObj->notify( HostPowerEvent_Resume);155 pPowerObj->notify(Reason_HostResume); 156 156 break; 157 157 … … 180 180 && BatteryState.EstimatedTime < 60*5) 181 181 { 182 pPowerObj->notify( HostPowerEvent_BatteryLow);182 pPowerObj->notify(Reason_HostBatteryLow); 183 183 } 184 184 } … … 187 187 if (SystemPowerStatus.BatteryFlag == 4 /* critical battery status; less than 5% */) 188 188 { 189 pPowerObj->notify( HostPowerEvent_BatteryLow);189 pPowerObj->notify(Reason_HostBatteryLow); 190 190 } 191 191 } … … 194 194 } 195 195 default: 196 return DefWindowProc 196 return DefWindowProc(hwnd, msg, wParam, lParam); 197 197 } 198 198 } … … 201 201 202 202 default: 203 return DefWindowProc 204 } 205 } 203 return DefWindowProc(hwnd, msg, wParam, lParam); 204 } 205 }
Note:
See TracChangeset
for help on using the changeset viewer.