// 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/native/darwin/util.h"
#include "src/main/native/unix_jni.h"
#include "src/main/native/macros.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);
  CHECK_GE(g_sleep_state_stack, 0);
  if (g_sleep_state_stack == 0) {
    CHECK_EQ(g_sleep_state_assertion, kIOPMNullAssertionID);
    CFStringRef reasonForActivity = CFSTR("build.bazel");
    IOReturn success = IOPMAssertionCreateWithName(
        kIOPMAssertionTypeNoIdleSleep, kIOPMAssertionLevelOn, reasonForActivity,
        &g_sleep_state_assertion);
    CHECK_EQ(success, kIOReturnSuccess);
    log_if_possible("sleep assertion created");
  }
  g_sleep_state_stack += 1;
  return 0;
}

int portable_pop_disable_sleep() {
  std::lock_guard<std::mutex> lock(g_sleep_state_mutex);
  CHECK_GT(g_sleep_state_stack, 0);
  g_sleep_state_stack -= 1;
  if (g_sleep_state_stack == 0) {
    CHECK_NEQ(g_sleep_state_assertion, kIOPMNullAssertionID);
    IOReturn success = IOPMAssertionRelease(g_sleep_state_assertion);
    CHECK_EQ(success, kIOReturnSuccess);
    g_sleep_state_assertion = kIOPMNullAssertionID;
    log_if_possible("sleep assertion released");
  }
  return 0;
}

}  // namespace blaze_jni
