From 04285a19df56cc0456ea52fa21f47565ee6bb29d Mon Sep 17 00:00:00 2001
From: Rom Walton <rwalton@ssl.berkeley.edu>
Date: Wed, 25 Mar 2015 16:09:07 -0400
Subject: [PATCH] VBOX: Add a configuration option to turn-off automatic
 check-pointing.

Projects may want to handle check-pointing within their own application and skip the disk intensive requirements of a VM snapshot.
---
 samples/vboxwrapper/vbox_mscom_impl.cpp | 4 ++++
 samples/vboxwrapper/vbox_vboxmanage.cpp | 6 +++++-
 samples/vboxwrapper/vboxjob.cpp         | 6 ++++--
 samples/vboxwrapper/vboxjob.h           | 3 +++
 samples/vboxwrapper/vboxwrapper.cpp     | 2 +-
 5 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/samples/vboxwrapper/vbox_mscom_impl.cpp b/samples/vboxwrapper/vbox_mscom_impl.cpp
index 6d5d878385..4a8c099aa5 100644
--- a/samples/vboxwrapper/vbox_mscom_impl.cpp
+++ b/samples/vboxwrapper/vbox_mscom_impl.cpp
@@ -1544,6 +1544,8 @@ int VBOX_VM::create_snapshot(double elapsed_time) {
     CComPtr<IConsole> pConsole;
     CComPtr<IProgress> pProgress;
 
+    if (disable_automatic_checkpoints) return BOINC_SUCCESS;
+
     vboxlog_msg("Creating new snapshot for VM.");
 
     // Pause VM - Try and avoid the live snapshot and trigger an online
@@ -1646,6 +1648,8 @@ int VBOX_VM::restore_snapshot() {
     CComPtr<ISnapshot> pSnapshot;
     CComPtr<IProgress> pProgress;
 
+    if (disable_automatic_checkpoints) return BOINC_SUCCESS;
+
     rc = m_pPrivate->m_pVirtualBox->FindMachine(CComBSTR(vm_name.c_str()), &pMachineRO);
     if (SUCCEEDED(rc)) {
         rc = pSession.CoCreateInstance(CLSID_Session);
diff --git a/samples/vboxwrapper/vbox_vboxmanage.cpp b/samples/vboxwrapper/vbox_vboxmanage.cpp
index 37b0e4e093..44805be255 100644
--- a/samples/vboxwrapper/vbox_vboxmanage.cpp
+++ b/samples/vboxwrapper/vbox_vboxmanage.cpp
@@ -1140,7 +1140,9 @@ int VBOX_VM::create_snapshot(double elapsed_time) {
     string command;
     string output;
     char buf[256];
-    int retval;
+    int retval = BOINC_SUCCESS;
+
+    if (disable_automatic_checkpoints) return BOINC_SUCCESS;
 
     vboxlog_msg("Creating new snapshot for VM.");
 
@@ -1253,6 +1255,8 @@ int VBOX_VM::restore_snapshot() {
     string output;
     int retval = BOINC_SUCCESS;
 
+    if (disable_automatic_checkpoints) return BOINC_SUCCESS;
+
     vboxlog_msg("Restore from previously saved snapshot.");
 
     command = "snapshot \"" + vm_name + "\" ";
diff --git a/samples/vboxwrapper/vboxjob.cpp b/samples/vboxwrapper/vboxjob.cpp
index 6d86dc9bae..79b4e95ee5 100644
--- a/samples/vboxwrapper/vboxjob.cpp
+++ b/samples/vboxwrapper/vboxjob.cpp
@@ -112,11 +112,12 @@ void VBOX_JOB::clear() {
     enable_floppyio = false;
     enable_cache_disk = false;
     enable_isocontextualization = false;
+    enable_network = false;
+    network_bridged_mode = false;
     enable_remotedesktop = false;
     enable_gbac = false;
     enable_graphics_support = false;
-    enable_network = false;
-    network_bridged_mode = false;
+    disable_automatic_checkpoints = false;
     pf_guest_port = 0;
     pf_host_port = 0;
     port_forwards.clear();
@@ -168,6 +169,7 @@ int VBOX_JOB::parse() {
         else if (xp.parse_bool("enable_remotedesktop", enable_remotedesktop)) continue;
         else if (xp.parse_bool("enable_gbac", enable_gbac)) continue;
         else if (xp.parse_bool("enable_graphics_support", enable_graphics_support)) continue;
+        else if (xp.parse_bool("disable_automatic_checkpoints", disable_automatic_checkpoints)) continue;
         else if (xp.parse_int("pf_guest_port", pf_guest_port)) continue;
         else if (xp.parse_int("pf_host_port", pf_host_port)) continue;
         else if (xp.parse_string("copy_to_shared", str)) {
diff --git a/samples/vboxwrapper/vboxjob.h b/samples/vboxwrapper/vboxjob.h
index a8bdd7f129..c60fdfd9e6 100644
--- a/samples/vboxwrapper/vboxjob.h
+++ b/samples/vboxwrapper/vboxjob.h
@@ -102,6 +102,9 @@ public:
     // http://boinc.berkeley.edu/trac/wiki/GraphicsApi#File
     bool enable_graphics_support;
 
+    // whether to disable automatic checkpoint support
+    bool disable_automatic_checkpoints;
+
     // maximum amount of wall-clock time this VM is allowed to run before
     // considering itself done.
     double job_duration;
diff --git a/samples/vboxwrapper/vboxwrapper.cpp b/samples/vboxwrapper/vboxwrapper.cpp
index 69c16adec0..5d3b7f701d 100644
--- a/samples/vboxwrapper/vboxwrapper.cpp
+++ b/samples/vboxwrapper/vboxwrapper.cpp
@@ -689,7 +689,7 @@ int main(int argc, char** argv) {
         return EXIT_TIME_LIMIT_EXCEEDED;
     }
 
-    retval = pVM->run((current_cpu_time > 0));
+    retval = pVM->run(current_cpu_time > 0);
     if (retval) {
         // All 'failure to start' errors are unrecoverable by default
         bool   unrecoverable_error = true;
-- 
GitLab