blob: 67c35b201eebdd1023a1f850b2e224b57bf8ee30 [file] [log] [blame]
// 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 <IOKit/pwr_mgt/IOPMLib.h>
// 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 <mutex> // 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<std::mutex> 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<std::mutex> 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