// Copyright 2021 The Bazel Authors. All rights reserved. // // 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 // Linting disabled for this line because for google code we could use // absl::Mutex but we cannot yet because Bazel doesn't depend on absl. #include // NOLINT #include "src/main/cpp/util/logging.h" #include "src/main/native/unix_jni.h" namespace blaze_jni { // Protects all of the g_sleep_state_* statics. static std::mutex g_sleep_state_mutex; // Keep track of our pushes and pops of sleep state. static int g_sleep_state_stack = 0; // Our assertion for disabling sleep. static IOPMAssertionID g_sleep_state_assertion = kIOPMNullAssertionID; int portable_push_disable_sleep() { std::lock_guard lock(g_sleep_state_mutex); BAZEL_CHECK_GE(g_sleep_state_stack, 0); if (g_sleep_state_stack == 0) { BAZEL_CHECK_EQ(g_sleep_state_assertion, kIOPMNullAssertionID); CFStringRef reasonForActivity = CFSTR("build.bazel"); IOReturn success = IOPMAssertionCreateWithName( kIOPMAssertionTypeNoIdleSleep, kIOPMAssertionLevelOn, reasonForActivity, &g_sleep_state_assertion); BAZEL_CHECK_EQ(success, kIOReturnSuccess); } g_sleep_state_stack += 1; return 0; } int portable_pop_disable_sleep() { std::lock_guard lock(g_sleep_state_mutex); BAZEL_CHECK_GT(g_sleep_state_stack, 0); g_sleep_state_stack -= 1; if (g_sleep_state_stack == 0) { BAZEL_CHECK_NE(g_sleep_state_assertion, kIOPMNullAssertionID); IOReturn success = IOPMAssertionRelease(g_sleep_state_assertion); BAZEL_CHECK_EQ(success, kIOReturnSuccess); g_sleep_state_assertion = kIOPMNullAssertionID; } return 0; } } // namespace blaze_jni