1 // Copyright 2018 The Fuchsia Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include <lib/sync/condition.h>
6 
7 #include <assert.h>
8 #include <lib/sync/internal/condition-template.h>
9 #include <zircon/compiler.h>
10 
11 template <>
12 struct condition_impl_internal::MutexOps<sync_mutex_t> {
get_futexcondition_impl_internal::MutexOps13     static zx_futex_t* get_futex(sync_mutex_t* mutex) {
14         return &mutex->futex;
15     }
16 
lockcondition_impl_internal::MutexOps17     static zx_status_t lock(sync_mutex_t* mutex, int* mutex_lock_err) __TA_ACQUIRE(mutex) {
18         sync_mutex_lock(mutex);
19         return ZX_OK;
20     }
21 
lock_with_waiterscondition_impl_internal::MutexOps22     static zx_status_t lock_with_waiters(
23         sync_mutex_t* mutex, int waiters_delta, int* mutex_lock_err) __TA_ACQUIRE(mutex) {
24         sync_mutex_lock_with_waiter(mutex);
25         return ZX_OK;
26     }
27 
unlockcondition_impl_internal::MutexOps28     static void unlock(sync_mutex_t* mutex) __TA_RELEASE(mutex) {
29         sync_mutex_unlock(mutex);
30     }
31 };
32 
sync_condition_wait(sync_condition_t * condition,sync_mutex_t * mutex)33 void sync_condition_wait(sync_condition_t* condition, sync_mutex_t* mutex) {
34     __UNUSED zx_status_t status = condition_impl_internal::timedwait(
35         condition, mutex, ZX_TIME_INFINITE, nullptr);
36     assert(status == ZX_OK);
37 }
38 
sync_condition_timedwait(sync_condition_t * condition,sync_mutex_t * mutex,zx_time_t deadline)39 zx_status_t sync_condition_timedwait(sync_condition_t* condition, sync_mutex_t* mutex, zx_time_t deadline) {
40     return condition_impl_internal::timedwait(condition, mutex, deadline, nullptr);
41 }
42 
sync_condition_signal(sync_condition_t * condition)43 void sync_condition_signal(sync_condition_t* condition) {
44     return condition_impl_internal::signal(condition, 1);
45 }
46 
sync_condition_broadcast(sync_condition_t * condition)47 void sync_condition_broadcast(sync_condition_t* condition) {
48     condition_impl_internal::signal(condition, -1);
49 }
50