| // Copyright 2015 The Cobalt 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. |
| |
| // Module Overview: Starboard Condition Variable module |
| // |
| // Defines an interface for condition variables. |
| |
| #ifndef STARBOARD_CONDITION_VARIABLE_H_ |
| #define STARBOARD_CONDITION_VARIABLE_H_ |
| |
| #if SB_API_VERSION < 16 |
| |
| #include "starboard/export.h" |
| #include "starboard/mutex.h" |
| #include "starboard/types.h" |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| // Max size of the SbConditionVariable type. |
| #define SB_CONDITION_VARIABLE_MAX_SIZE 80 |
| |
| // An opaque handle to a condition variable type with |
| // reserved memory buffer of size SB_CONDITION_VARIABLE_MAX_SIZE and |
| // aligned at void pointer type. |
| typedef union SbConditionVariable { |
| // Reserved memory in which the implementation should map its |
| // native condition variable type. |
| uint8_t condition_buffer[SB_CONDITION_VARIABLE_MAX_SIZE]; |
| |
| // Guarantees alignment of the type to a void pointer. |
| void* ptr; |
| } SbConditionVariable; |
| |
| #ifdef __cplusplus |
| #define SB_CONDITION_VARIABLE_INITIALIZER \ |
| {} |
| #else |
| #define SB_CONDITION_VARIABLE_INITIALIZER {0} |
| #endif |
| |
| // Enumeration of possible results from waiting on a condvar. |
| typedef enum SbConditionVariableResult { |
| // The wait completed because the condition variable was signaled. |
| kSbConditionVariableSignaled, |
| |
| // The wait completed because it timed out, and was not signaled. |
| kSbConditionVariableTimedOut, |
| |
| // The wait failed, either because a parameter wasn't valid, or the condition |
| // variable has already been destroyed, or something similar. |
| kSbConditionVariableFailed, |
| } SbConditionVariableResult; |
| |
| // Returns whether the given result is a success. |
| static inline bool SbConditionVariableIsSignaled( |
| SbConditionVariableResult result) { |
| return result == kSbConditionVariableSignaled; |
| } |
| |
| // Creates a new condition variable to work with |opt_mutex|, which may be null, |
| // placing the newly created condition variable in |out_condition|. |
| // |
| // The return value indicates whether the condition variable could be created. |
| SB_EXPORT bool SbConditionVariableCreate(SbConditionVariable* out_condition, |
| SbMutex* opt_mutex); |
| |
| // Destroys the specified SbConditionVariable. The return value indicates |
| // whether the destruction was successful. The behavior is undefined if other |
| // threads are currently waiting on this condition variable. |
| // |
| // |condition|: The SbConditionVariable to be destroyed. This invalidates the |
| // condition variable. |
| SB_EXPORT bool SbConditionVariableDestroy(SbConditionVariable* condition); |
| |
| // Waits for |condition|, releasing the held lock |mutex|, blocking |
| // indefinitely, and returning the result. Behavior is undefined if |mutex| is |
| // not held. |
| SB_EXPORT SbConditionVariableResult |
| SbConditionVariableWait(SbConditionVariable* condition, SbMutex* mutex); |
| |
| // Waits for |condition|, releasing the held lock |mutex|, blocking up to |
| // |timeout_duration|, and returning the acquisition result. Behavior is |
| // undefined if |mutex| is not held. |
| // |
| // |timeout_duration|: The maximum amount of time that function should wait |
| // for |condition|, in microseconds. If the |timeout_duration| value is less |
| // than or equal to zero, the function returns as quickly as possible with a |
| // kSbConditionVariableTimedOut result. |
| SB_EXPORT SbConditionVariableResult |
| SbConditionVariableWaitTimed(SbConditionVariable* condition, |
| SbMutex* mutex, |
| int64_t timeout_duration); |
| |
| // Broadcasts to all current waiters of |condition| to stop waiting. This |
| // function wakes all of the threads waiting on |condition| while |
| // SbConditionVariableSignal wakes a single thread. |
| // |
| // |condition|: The condition that should no longer be waited for. |
| SB_EXPORT bool SbConditionVariableBroadcast(SbConditionVariable* condition); |
| |
| // Signals the next waiter of |condition| to stop waiting. This function wakes |
| // a single thread waiting on |condition| while SbConditionVariableBroadcast |
| // wakes all threads waiting on it. |
| // |
| // |condition|: The condition that the waiter should stop waiting for. |
| SB_EXPORT bool SbConditionVariableSignal(SbConditionVariable* condition); |
| |
| #ifdef __cplusplus |
| } // extern "C" |
| #endif |
| |
| #endif // SB_API_VERSION < 16 |
| #endif // STARBOARD_CONDITION_VARIABLE_H_ |