libmetal
mutex.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 freertos/mutex.h
9  * @brief FreeRTOS mutex primitives for libmetal.
10  */
11 
12 #ifndef __METAL_MUTEX__H__
13 #error "Include metal/mutex.h instead of metal/freertos/mutex.h"
14 #endif
15 
16 #ifndef __METAL_FREERTOS_MUTEX__H__
17 #define __METAL_FREERTOS_MUTEX__H__
18 
19 #include <metal/atomic.h>
20 #include <stdlib.h>
21 
22 #ifdef __cplusplus
23 extern "C" {
24 #endif
25 
26 typedef struct {
29 
30 /*
31  * METAL_MUTEX_INIT - used for initializing an mutex elmenet in a static struct
32  * or global
33  */
34 #define METAL_MUTEX_INIT(m) { ATOMIC_VAR_INIT(0) }
35 /*
36  * METAL_MUTEX_DEFINE - used for defining and initializing a global or
37  * static singleton mutex
38  */
39 #define METAL_MUTEX_DEFINE(m) metal_mutex_t m = METAL_MUTEX_INIT(m)
40 
41 static inline void __metal_mutex_init(metal_mutex_t *mutex)
42 {
43  atomic_store(&mutex->v, 0);
44 }
45 
46 static inline void __metal_mutex_deinit(metal_mutex_t *mutex)
47 {
48  (void)mutex;
49 }
50 
51 static inline int __metal_mutex_try_acquire(metal_mutex_t *mutex)
52 {
53  return 1 - atomic_flag_test_and_set(&mutex->v);
54 }
55 
56 static inline void __metal_mutex_acquire(metal_mutex_t *mutex)
57 {
58  while (atomic_flag_test_and_set(&mutex->v)) {
59  ;
60  }
61 }
62 
63 static inline void __metal_mutex_release(metal_mutex_t *mutex)
64 {
65  atomic_flag_clear(&mutex->v);
66 }
67 
68 static inline int __metal_mutex_is_acquired(metal_mutex_t *mutex)
69 {
70  return atomic_load(&mutex->v);
71 }
72 
73 #ifdef __cplusplus
74 }
75 #endif
76 
77 #endif /* __METAL_FREERTOS_MUTEX__H__ */
__metal_mutex_release
static void __metal_mutex_release(metal_mutex_t *mutex)
Definition: mutex.h:63
__metal_mutex_try_acquire
static int __metal_mutex_try_acquire(metal_mutex_t *mutex)
Definition: mutex.h:51
atomic_flag_test_and_set
#define atomic_flag_test_and_set(FLAG)
Definition: atomic.h:44
atomic_store
#define atomic_store(OBJ, VAL)
Definition: atomic.h:56
atomic_flag_clear
#define atomic_flag_clear(FLAG)
Definition: atomic.h:48
__metal_mutex_is_acquired
static int __metal_mutex_is_acquired(metal_mutex_t *mutex)
Definition: mutex.h:68
__metal_mutex_deinit
static void __metal_mutex_deinit(metal_mutex_t *mutex)
Definition: mutex.h:46
metal_mutex_t
mutex_t metal_mutex_t
Definition: mutex.h:25
__metal_mutex_init
static void __metal_mutex_init(metal_mutex_t *mutex)
Definition: mutex.h:41
atomic_int
int atomic_int
Definition: atomic.h:24
atomic_load
#define atomic_load(OBJ)
Definition: atomic.h:60
metal_mutex_t::v
atomic_int v
Definition: mutex.h:27
__metal_mutex_acquire
static void __metal_mutex_acquire(metal_mutex_t *mutex)
Definition: mutex.h:56
metal_mutex_t
Definition: mutex.h:26