// Copyright 2018 The gVisor Authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "test/util/save_util.h" #include #include #include #include #include #include "absl/types/optional.h" namespace gvisor { namespace testing { namespace { std::atomic> cooperative_save_present; std::atomic> random_save_present; bool CooperativeSavePresent() { auto present = cooperative_save_present.load(); if (!present.has_value()) { present = getenv("GVISOR_COOPERATIVE_SAVE_TEST") != nullptr; cooperative_save_present.store(present); } return present.value(); } bool RandomSavePresent() { auto present = random_save_present.load(); if (!present.has_value()) { present = getenv("GVISOR_RANDOM_SAVE_TEST") != nullptr; random_save_present.store(present); } return present.value(); } std::atomic save_disable; } // namespace bool IsRunningWithSaveRestore() { return CooperativeSavePresent() || RandomSavePresent(); } void MaybeSave() { if (CooperativeSavePresent() && save_disable.load() == 0) { internal::DoCooperativeSave(); } } DisableSave::DisableSave() { save_disable++; } DisableSave::~DisableSave() { reset(); } void DisableSave::reset() { if (!reset_) { reset_ = true; save_disable--; } } } // namespace testing } // namespace gvisor