VirtualBox

source: vbox/trunk/src/VBox/Main/HostPower.cpp@ 23223

Last change on this file since 23223 was 23223, checked in by vboxsync, 15 years ago

API: big medium handling change and lots of assorted other cleanups and fixes

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 5.4 KB
Line 
1/** @file
2 *
3 * VirtualBox interface to host's power notification service
4 */
5
6/*
7 * Copyright (C) 2006-2007 Sun Microsystems, Inc.
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
18 * Clara, CA 95054 USA or visit http://www.sun.com if you need
19 * additional information or have any questions.
20 */
21
22
23/*******************************************************************************
24* Header Files *
25*******************************************************************************/
26
27#include "HostPower.h"
28#include "Logging.h"
29
30#include <VBox/com/ptr.h>
31
32#include "VirtualBoxImpl.h"
33
34#include <iprt/mem.h>
35
36HostPowerService::HostPowerService (VirtualBox *aVirtualBox)
37{
38 Assert (aVirtualBox != NULL);
39 mVirtualBox = aVirtualBox;
40}
41
42HostPowerService::~HostPowerService()
43{
44}
45
46void HostPowerService::notify (HostPowerEvent aEvent)
47{
48 VirtualBox::SessionMachineVector machines;
49 VirtualBox::InternalControlVector controls;
50
51 HRESULT rc = S_OK;
52
53 switch (aEvent)
54 {
55 case HostPowerEvent_Suspend:
56 {
57 LogFunc (("SUSPEND\n"));
58
59#ifdef VBOX_WITH_RESOURCE_USAGE_API
60 /* Suspend performance sampling to avoid unnecessary callbacks due to jumps in time. */
61 PerformanceCollector *perfcollector = mVirtualBox->performanceCollector();
62
63 if (perfcollector)
64 perfcollector->suspendSampling();
65#endif
66 mVirtualBox->getOpenedMachinesAndControls (machines, controls);
67
68 /* pause running VMs */
69 for (size_t i = 0; i < controls.size(); ++ i)
70 {
71 /* get the remote console */
72 ComPtr<IConsole> console;
73 rc = controls [i]->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();
81 if (FAILED (rc))
82 continue;
83
84 /* save the control to un-pause the VM later */
85 mConsoles.push_back (console);
86 }
87
88 LogFunc (("Suspended %d VMs\n", mConsoles.size()));
89
90 break;
91 }
92
93 case HostPowerEvent_Resume:
94 {
95 LogFunc (("RESUME\n"));
96
97 size_t resumed = 0;
98
99 /* go through VMs we paused on Suspend */
100 for (size_t i = 0; i < mConsoles.size(); ++ i)
101 {
102 /* note that Resume() will simply return a failure if the VM is
103 * in an inappropriate state (it will also fail if the VM has
104 * been somehow closed by this time already so that the
105 * console reference we have is dead) */
106 rc = mConsoles [i]->Resume();
107 if (FAILED (rc))
108 continue;
109
110 ++ resumed;
111 }
112
113 LogFunc (("Resumed %d VMs\n", resumed));
114
115#ifdef VBOX_WITH_RESOURCE_USAGE_API
116 /* Resume the performance sampling. */
117 PerformanceCollector *perfcollector = mVirtualBox->performanceCollector();
118
119 if (perfcollector)
120 perfcollector->resumeSampling();
121#endif
122
123 mConsoles.clear();
124
125 break;
126 }
127
128 case HostPowerEvent_BatteryLow:
129 {
130 LogFunc (("BATTERY LOW\n"));
131
132 mVirtualBox->getOpenedMachinesAndControls (machines, controls);
133
134 size_t saved = 0;
135
136 /* save running VMs */
137 for (size_t i = 0; i < controls.size(); ++ i)
138 {
139 /* get the remote console */
140 ComPtr<IConsole> console;
141 rc = controls [i]->GetRemoteConsole (console.asOutParam());
142 /* the VM could have been powered down and closed or whatever */
143 if (FAILED (rc))
144 continue;
145
146 ComPtr<IProgress> progress;
147
148 /* note that SaveState() will simply return a failure if the VM
149 * is in an inappropriate state */
150 rc = console->SaveState (progress.asOutParam());
151 if (FAILED (rc))
152 continue;
153
154 /* Wait until the operation has been completed. */
155 LONG iRc;
156 rc = progress->WaitForCompletion(-1);
157 if (SUCCEEDED(rc))
158 progress->COMGETTER(ResultCode) (&iRc);
159 rc = iRc;
160
161 AssertMsg (SUCCEEDED(rc), ("SaveState WaitForCompletion "
162 "failed with %Rhrc (%#08X)\n", rc, rc));
163
164 if (SUCCEEDED(rc))
165 ++ saved;
166 }
167
168 LogFunc (("Saved %d VMs\n", saved));
169
170 break;
171 }
172 }
173}
174/* vi: set tabstop=4 shiftwidth=4 expandtab: */
Note: See TracBrowser for help on using the repository browser.

© 2023 Oracle
ContactPrivacy policyTerms of Use