libmetal
mutex.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015, Xilinx Inc. and Contributors. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 /*
8  * @file generic/mutex.h
9  * @brief Generic mutex primitives for libmetal.
10  */
11 
12 #ifndef __METAL_MUTEX__H__
13 #error "Include metal/mutex.h instead of metal/generic/mutex.h"
14 #endif
15 
16 #ifndef __METAL_GENERIC_MUTEX__H__
17 #define __METAL_GENERIC_MUTEX__H__
18 
19 #include <metal/atomic.h>
20 
21 #ifdef __cplusplus
22 extern "C" {
23 #endif
24 
25 typedef struct {
26  atomic_int v;
28 
29 /*
30  * METAL_MUTEX_INIT - used for initializing an mutex elmenet in a static struct
31  * or global
32  */
33 #define METAL_MUTEX_INIT(m) { ATOMIC_VAR_INIT(0) }
34 /*
35  * METAL_MUTEX_DEFINE - used for defining and initializing a global or
36  * static singleton mutex
37  */
38 #define METAL_MUTEX_DEFINE(m) metal_mutex_t m = METAL_MUTEX_INIT(m)
39 
40 static inline void __metal_mutex_init(metal_mutex_t *mutex)
41 {
42  atomic_store(&mutex->v, 0);
43 }
44 
45 static inline void __metal_mutex_deinit(metal_mutex_t *mutex)
46 {
47  (void)mutex;
48 }
49 
50 static inline int __metal_mutex_try_acquire(metal_mutex_t *mutex)
51 {
52  return 1 - atomic_flag_test_and_set(&mutex->v);
53 }
54 
55 static inline void __metal_mutex_acquire(metal_mutex_t *mutex)
56 {
57  while (atomic_flag_test_and_set(&mutex->v)) {
58  ;
59  }
60 }
61 
62 static inline void __metal_mutex_release(metal_mutex_t *mutex)
63 {
64  atomic_flag_clear(&mutex->v);
65 }
66 
67 static inline int __metal_mutex_is_acquired(metal_mutex_t *mutex)
68 {
69  return atomic_load(&mutex->v);
70 }
71 
72 #ifdef __cplusplus
73 }
74 #endif
75 
76 #endif /* __METAL_GENERIC_MUTEX__H__ */
atomic_int v
Definition: mutex.h:27
static void __metal_mutex_init(metal_mutex_t *mutex)
Definition: mutex.h:40
static void __metal_mutex_acquire(metal_mutex_t *mutex)
Definition: mutex.h:55
#define atomic_flag_test_and_set(FLAG)
Definition: atomic.h:43
static void __metal_mutex_deinit(metal_mutex_t *mutex)
Definition: mutex.h:45
static void __metal_mutex_release(metal_mutex_t *mutex)
Definition: mutex.h:62
static int __metal_mutex_is_acquired(metal_mutex_t *mutex)
Definition: mutex.h:67
#define atomic_flag_clear(FLAG)
Definition: atomic.h:47
#define atomic_store(OBJ, VAL)
Definition: atomic.h:55
#define atomic_load(OBJ)
Definition: atomic.h:59
Definition: mutex.h:26
struct k_sem metal_mutex_t
Definition: mutex.h:26
int atomic_int
Definition: atomic.h:24
static int __metal_mutex_try_acquire(metal_mutex_t *mutex)
Definition: mutex.h:50