diff --git a/samples/vboxwrapper/vbox_common.h b/samples/vboxwrapper/vbox_common.h index a591c7ce9a8d3f81082b90484be176380c14178e..373283b88c0d68a4010d8dc4d06c8ec1b675d5e7 100644 --- a/samples/vboxwrapper/vbox_common.h +++ b/samples/vboxwrapper/vbox_common.h @@ -168,7 +168,7 @@ public: virtual int register_vm() = 0; virtual int deregister_vm(bool delete_media) = 0; virtual int deregister_stale_vm() = 0; - virtual void poll(bool log_state = true) = 0; + virtual int poll(bool log_state = true) = 0; virtual int start() = 0; virtual int stop() = 0; virtual int poweroff() = 0; diff --git a/samples/vboxwrapper/vbox_mscom_impl.cpp b/samples/vboxwrapper/vbox_mscom_impl.cpp index 6fb6b136daffcac729059bd405d7efe6a2138734..a782516ee5881f2de2cf742ece6279c97470eac0 100644 --- a/samples/vboxwrapper/vbox_mscom_impl.cpp +++ b/samples/vboxwrapper/vbox_mscom_impl.cpp @@ -1155,7 +1155,8 @@ int VBOX_VM::deregister_stale_vm() { return 0; } -void VBOX_VM::poll(bool log_state) { +int VBOX_VM::poll(bool log_state) { + int retval = ERR_EXEC; APP_INIT_DATA aid; HRESULT rc; CComPtr<IMachine> pMachine; @@ -1181,7 +1182,6 @@ void VBOX_VM::poll(bool log_state) { if (SUCCEEDED(rc) && pMachine) { rc = pMachine->get_State(&vmstate); if (SUCCEEDED(rc)) { - // VirtualBox Documentation suggests that that a VM is running when its // machine state is between MachineState_FirstOnline and MachineState_LastOnline // which as of this writing is 5 and 17. @@ -1289,6 +1289,8 @@ void VBOX_VM::poll(bool log_state) { ); vmstate_old = vmstate; } + + retval = BOINC_SUCCESS; } } @@ -1304,6 +1306,8 @@ void VBOX_VM::poll(bool log_state) { // Dump any new VM Guest Log entries // dump_vmguestlog_entries(); + + return retval; } int VBOX_VM::start() { diff --git a/samples/vboxwrapper/vbox_mscom_impl.h b/samples/vboxwrapper/vbox_mscom_impl.h index c0e7a2318989823a72af04654daaed093051544a..de2d8e3130c358e9d2d6a9b8c5bc42bd8630b0e5 100644 --- a/samples/vboxwrapper/vbox_mscom_impl.h +++ b/samples/vboxwrapper/vbox_mscom_impl.h @@ -27,7 +27,7 @@ public: int register_vm(); int deregister_vm(bool delete_media); int deregister_stale_vm(); - void poll(bool log_state = true); + int poll(bool log_state = true); int start(); int stop(); int poweroff(); diff --git a/samples/vboxwrapper/vbox_vboxmanage.cpp b/samples/vboxwrapper/vbox_vboxmanage.cpp index 44805be255414e716f39fcadec6f89e38cf89a8e..4b60982a939f74bac4c12abc85e2f48c0016122c 100644 --- a/samples/vboxwrapper/vbox_vboxmanage.cpp +++ b/samples/vboxwrapper/vbox_vboxmanage.cpp @@ -824,7 +824,8 @@ int VBOX_VM::deregister_stale_vm() { return 0; } -void VBOX_VM::poll(bool log_state) { +int VBOX_VM::poll(bool log_state) { + int retval = ERR_EXEC; APP_INIT_DATA aid; string command; string output; @@ -955,6 +956,8 @@ void VBOX_VM::poll(bool log_state) { vboxlog_msg("VM state change detected. (old = '%s', new = '%s')", vmstate_old.c_str(), vmstate.c_str()); vmstate_old = vmstate; } + + retval = BOINC_SUCCESS; } } @@ -970,6 +973,8 @@ void VBOX_VM::poll(bool log_state) { // Dump any new VM Guest Log entries // dump_vmguestlog_entries(); + + return retval; } int VBOX_VM::start() { diff --git a/samples/vboxwrapper/vbox_vboxmanage.h b/samples/vboxwrapper/vbox_vboxmanage.h index 330feb5bda792de08912cff0bb9865ad67a9476e..fcd170792e67dcf1aacbb874955b15f05f063c8d 100644 --- a/samples/vboxwrapper/vbox_vboxmanage.h +++ b/samples/vboxwrapper/vbox_vboxmanage.h @@ -33,7 +33,7 @@ namespace vboxmanage { int register_vm(); int deregister_vm(bool delete_media); int deregister_stale_vm(); - void poll(bool log_state = true); + int poll(bool log_state = true); int start(); int stop(); int poweroff(); diff --git a/samples/vboxwrapper/vboxwrapper.cpp b/samples/vboxwrapper/vboxwrapper.cpp index 9dd1032f93a4934e082d64a69026f590159f7826..e937e53cdc35bf927a1c4228b3ba85d16f8b4863 100644 --- a/samples/vboxwrapper/vboxwrapper.cpp +++ b/samples/vboxwrapper/vboxwrapper.cpp @@ -867,7 +867,13 @@ int main(int argc, char** argv) { loop_iteration += 1; // Discover the VM's current state - pVM->poll(); + retval = pVM->poll(); + if (retval) { + vboxlog_msg("ERROR: Vboxwrapper lost communication with VirtualBox, rescheduling task for a later time."); + pVM->reset_vm_process_priority(); + pVM->poweroff(); + boinc_temporary_exit(86400, "VM job unmanageable, restarting later."); + } // Write updates for the graphics application's use if (pVM->enable_graphics_support) {