// Copyright 2020 The Pigweed 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
//
//     https://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.
#pragma once

#include "FreeRTOS.h"
#include "pw_assert/light.h"
#include "pw_chrono/system_clock.h"
#include "pw_chrono_freertos/system_clock_constants.h"
#include "pw_interrupt/context.h"
#include "pw_sync/mutex.h"
#include "semphr.h"

namespace pw::sync {

inline Mutex::Mutex() : native_type_() {
  const SemaphoreHandle_t handle = xSemaphoreCreateMutexStatic(&native_type_);
  // This should never fail since the pointer provided was not null and it
  // should return a pointer to the StaticSemaphore_t.
  PW_DASSERT(handle == &native_type_);
}

inline Mutex::~Mutex() { vSemaphoreDelete(&native_type_); }

inline void Mutex::lock() {
  PW_ASSERT(!interrupt::InInterruptContext());
#if INCLUDE_vTaskSuspend == 1  // This means portMAX_DELAY is indefinite.
  const BaseType_t result = xSemaphoreTake(&native_type_, portMAX_DELAY);
  PW_DASSERT(result == pdTRUE);
#else
  // In case we need to block for longer than the FreeRTOS delay can represent
  // repeatedly hit take until success.
  while (xSemaphoreTake(&native_type_, chrono::freertos::kMaxTimeout.count()) ==
         pdFALSE) {
  }
#endif  // INCLUDE_vTaskSuspend
}

inline bool Mutex::try_lock() {
  PW_ASSERT(!interrupt::InInterruptContext());
  return xSemaphoreTake(&native_type_, 0) == pdTRUE;
}

inline bool Mutex::try_lock_until(
    chrono::SystemClock::time_point until_at_least) {
  // Note that if this deadline is in the future, it will get rounded up by
  // one whole tick due to how try_lock_for is implemented.
  return try_lock_for(until_at_least - chrono::SystemClock::now());
}

inline void Mutex::unlock() {
  PW_ASSERT(!interrupt::InInterruptContext());
  // Unlocking only fails if it was not locked first.
  PW_ASSERT(xSemaphoreGive(&native_type_) == pdTRUE);
}

inline Mutex::native_handle_type Mutex::native_handle() { return native_type_; }

}  // namespace pw::sync
