| // Copyright 2016 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef LIB_SYNC_COMPLETION_H_ |
| #define LIB_SYNC_COMPLETION_H_ |
| |
| #include <zircon/compiler.h> |
| #include <zircon/types.h> |
| |
| __BEGIN_CDECLS |
| |
| typedef struct sync_completion { |
| zx_futex_t futex; |
| |
| #ifdef __cplusplus |
| sync_completion() : futex(0) {} |
| #endif |
| } sync_completion_t; |
| |
| #if !defined(__cplusplus) |
| #define SYNC_COMPLETION_INIT ((sync_completion_t){0}) |
| #endif |
| |
| // Returns ZX_ERR_TIMED_OUT if timeout elapses, and ZX_OK if woken by |
| // a call to sync_completion_signal or if the completion has already been |
| // signaled. |
| zx_status_t sync_completion_wait(sync_completion_t* completion, zx_duration_t timeout); |
| |
| // Returns ZX_ERR_TIMED_OUT if deadline elapses, and ZX_OK if woken by |
| // a call to sync_completion_signal or if the completion has already been |
| // signaled. |
| zx_status_t sync_completion_wait_deadline(sync_completion_t* completion, zx_time_t deadline); |
| |
| // Awakens all waiters on the completion, and marks it as |
| // signaled. Waits after this call but before a reset of the |
| // completion will also see the signal and immediately return. |
| void sync_completion_signal(sync_completion_t* completion); |
| |
| // Marks the completion as signaled, but doesn't awaken all waiters right away. |
| // Instead, all waiters are requeued to the |requeue_target|, and the owner of |
| // the |requeue_target| is set to |requeue_target_owner|, or to no one if |
| // ZX_HANDLE_INVALID is passed. |
| // |
| // Waits after this call but before a reset of the completion will also see the |
| // signal and immediately return. |
| // |
| // Intended to be used by libsync internally, e.g. the condition variable |
| // implementation. |
| void sync_completion_signal_requeue(sync_completion_t* completion, zx_futex_t* requeue_target, |
| zx_handle_t requeue_target_owner); |
| |
| // Resets the completion's signaled state to unsignaled. |
| void sync_completion_reset(sync_completion_t* completion); |
| |
| // Returns true iff a completion has been signaled. |
| bool sync_completion_signaled(sync_completion_t* completion); |
| |
| __END_CDECLS |
| |
| #endif // LIB_SYNC_COMPLETION_H_ |