// Copyright 2021 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 "pw_chrono/system_clock.h"
#include "pw_sync/thread_notification.h"

namespace pw::sync {

/// The `TimedThreadNotification` is a synchronization primitive that can be
/// used to permit a SINGLE thread to block and consume a latching, saturating
/// notification from  multiple notifiers.
///
/// @b IMPORTANT: This is a single consumer/waiter, multiple producer/notifier
/// API!  The acquire APIs must only be invoked by a single consuming thread. As
/// a result, having multiple threads receiving notifications via the acquire
/// API is unsupported.
///
/// This is effectively a subset of a binary semaphore API, except that only a
/// single thread can be notified and block at a time.
///
/// The single consumer aspect of the API permits the use of a smaller and/or
/// faster native APIs such as direct thread signaling.
///
/// The `TimedThreadNotification` is initialized to being empty (latch is not
/// set).
class TimedThreadNotification : public ThreadNotification {
 public:
  TimedThreadNotification() = default;
  ~TimedThreadNotification() = default;
  TimedThreadNotification(const TimedThreadNotification&) = delete;
  TimedThreadNotification(TimedThreadNotification&&) = delete;
  TimedThreadNotification& operator=(const TimedThreadNotification&) = delete;
  TimedThreadNotification& operator=(TimedThreadNotification&&) = delete;

  /// Blocks until the specified timeout duration has elapsed or the thread
  /// has been notified (i.e. notification latch can be cleared because it was
  /// set), whichever comes first.
  ///
  /// Clears the notification latch.
  ///
  /// Returns true if the thread was notified, meaning the the internal latch
  /// was reset successfully.
  ///
  /// @b IMPORTANT: This should only be used by a single consumer thread.
  bool try_acquire_for(chrono::SystemClock::duration timeout);

  /// Blocks until the specified deadline time has been reached the thread has
  /// been notified (i.e. notification latch can be cleared because it was set),
  /// whichever comes first.
  ///
  /// Clears the notification latch.
  ///
  /// Returns true if the thread was notified, meaning the the internal latch
  /// was reset successfully.
  ///
  /// @b IMPORTANT: This should only be used by a single consumer thread.
  bool try_acquire_until(chrono::SystemClock::time_point deadline);
};

}  // namespace pw::sync

#include "pw_sync_backend/timed_thread_notification_inline.h"
