libmetal
condition.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2016, Xilinx Inc. and Contributors. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 /*
8  * @file linux/condition.h
9  * @brief Linux condition variable primitives for libmetal.
10  */
11 
12 #ifndef __METAL_CONDITION__H__
13 #error "Include metal/condition.h instead of metal/linux/condition.h"
14 #endif
15 
16 #ifndef __METAL_LINUX_CONDITION__H__
17 #define __METAL_LINUX_CONDITION__H__
18 
19 #include <unistd.h>
20 #include <sys/syscall.h>
21 #include <linux/futex.h>
22 #include <metal/atomic.h>
23 #include <stdint.h>
24 #include <limits.h>
25 #include <errno.h>
26 
27 #ifdef __cplusplus
28 extern "C" {
29 #endif
30 
31 struct metal_condition {
32  metal_mutex_t *m;
40 };
41 
43 #define METAL_CONDITION_INIT { NULL, ATOMIC_VAR_INIT(0), ATOMIC_VAR_INIT(0) }
44 
45 static inline void metal_condition_init(struct metal_condition *cv)
46 {
47  cv->m = NULL;
48  atomic_init(&cv->waiters, 0);
49  atomic_init(&cv->wakeups, 0);
50 }
51 
52 static inline int metal_condition_signal(struct metal_condition *cv)
53 {
54  if (!cv)
55  return -EINVAL;
56 
57  atomic_fetch_add(&cv->wakeups, 1);
58  if (atomic_load(&cv->waiters) > 0)
59  syscall(SYS_futex, &cv->wakeups, FUTEX_WAKE, 1, NULL, NULL, 0);
60  return 0;
61 }
62 
63 static inline int metal_condition_broadcast(struct metal_condition *cv)
64 {
65  if (!cv)
66  return -EINVAL;
67 
68  atomic_fetch_add(&cv->wakeups, 1);
69  if (atomic_load(&cv->waiters) > 0)
70  syscall(SYS_futex, &cv->wakeups, FUTEX_WAKE, INT_MAX, NULL, NULL, 0);
71  return 0;
72 }
73 
74 #endif /* __METAL_LINUX_CONDITION__H__ */
#define atomic_init(OBJ, VAL)
Definition: atomic.h:51
atomic_int wakeups
Definition: condition.h:39
Definition: condition.h:25
static int metal_condition_signal(struct metal_condition *cv)
Definition: condition.h:52
atomic_int waiters
Definition: condition.h:38
static void metal_condition_init(struct metal_condition *cv)
Definition: condition.h:45
#define atomic_fetch_add(OBJ, VAL)
Definition: atomic.h:94
#define atomic_load(OBJ)
Definition: atomic.h:59
static int metal_condition_broadcast(struct metal_condition *cv)
Definition: condition.h:63
Definition: mutex.h:28
metal_mutex_t * m
Definition: condition.h:26
int atomic_int
Definition: atomic.h:24