| // 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 |futex|. |
| // 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* futex); |
| |
| // 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_ |