• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * coap_mutex.h -- mutex utilities
3  *
4  * Copyright (C) 2019-2023 Jon Shallow <supjps-libcoap@jpshallow.com>
5  *               2019      Olaf Bergmann <bergmann@tzi.org>
6  *
7  * SPDX-License-Identifier: BSD-2-Clause
8  *
9  * This file is part of the CoAP library libcoap. Please see README for terms
10  * of use.
11  */
12 
13 /**
14  * @file coap_mutex_internal.h
15  * @brief CoAP mutex mechanism wrapper
16  */
17 
18 #ifndef COAP_MUTEX_INTERNAL_H_
19 #define COAP_MUTEX_INTERNAL_H_
20 
21 /*
22  * Mutexes are currently only used if there is a constrained stack,
23  * and large static variables (instead of the large variable being on
24  * the stack) need to be protected.
25  */
26 #if COAP_CONSTRAINED_STACK
27 
28 #if defined(HAVE_PTHREAD_H) && defined(HAVE_PTHREAD_MUTEX_LOCK)
29 #include <pthread.h>
30 
31 typedef pthread_mutex_t coap_mutex_t;
32 
33 #define coap_mutex_init(a)    pthread_mutex_init(a, NULL)
34 #define coap_mutex_destroy(a) pthread_mutex_destroy(a)
35 #define coap_mutex_lock(a)    pthread_mutex_lock(a)
36 #define coap_mutex_trylock(a) pthread_mutex_trylock(a)
37 #define coap_mutex_unlock(a)  pthread_mutex_unlock(a)
38 
39 #elif defined(RIOT_VERSION)
40 /* use RIOT's mutex API */
41 #include <mutex.h>
42 
43 typedef mutex_t coap_mutex_t;
44 
45 #define coap_mutex_init(a)    mutex_init(a)
46 #define coap_mutex_destroy(a)
47 #define coap_mutex_lock(a)    mutex_lock(a)
48 #define coap_mutex_trylock(a) mutex_trylock(a)
49 #define coap_mutex_unlock(a)  mutex_unlock(a)
50 
51 #elif defined(WITH_LWIP)
52 /* Use LwIP's mutex API */
53 
54 #if NO_SYS
55 /* Single threaded, no-op'd in lwip/sys.h */
56 typedef int coap_mutex_t;
57 
58 #define coap_mutex_init(a)    *(a) = 0
59 #define coap_mutex_destroy(a) *(a) = 0
60 #define coap_mutex_lock(a)    *(a) = 1
61 #define coap_mutex_trylock(a) *(a) = 1
62 #define coap_mutex_unlock(a)  *(a) = 0
63 
64 #else /* !NO SYS */
65 #include <lwip/sys.h>
66 typedef sys_mutex_t coap_mutex_t;
67 
68 #define coap_mutex_init(a)    sys_mutex_new(a)
69 #define coap_mutex_destroy(a) sys_mutex_set_invalid(a)
70 #define coap_mutex_lock(a)    sys_mutex_lock(a)
71 #define coap_mutex_trylock(a) sys_mutex_lock(a)
72 #define coap_mutex_unlock(a)  sys_mutex_unlock(a)
73 #endif /* !NO SYS */
74 
75 #elif defined(WITH_CONTIKI)
76 /* Contiki does not have a mutex API, used as single thread */
77 typedef int coap_mutex_t;
78 
79 #define coap_mutex_init(a)    *(a) = 0
80 #define coap_mutex_destroy(a) *(a) = 0
81 #define coap_mutex_lock(a)    *(a) = 1
82 #define coap_mutex_trylock(a) *(a) = 1
83 #define coap_mutex_unlock(a)  *(a) = 0
84 
85 #elif defined(__ZEPHYR__)
86 #include <zephyr/sys/mutex.h>
87 
88 typedef struct sys_mutex coap_mutex_t;
89 
90 #define coap_mutex_init(a)    sys_mutex_init(a)
91 #define coap_mutex_destroy(a)
92 #define coap_mutex_lock(a)    sys_mutex_lock(a, K_FOREVER)
93 #define coap_mutex_trylock(a) sys_mutex_lock(a, K_NO_WAIT)
94 #define coap_mutex_unlock(a)  sys_mutex_unlock(a)
95 
96 #else /* !__ZEPYR__ && !WITH_CONTIKI && !WITH_LWIP && !RIOT_VERSION && !HAVE_PTHREAD_H && !HAVE_PTHREAD_MUTEX_LOCK */
97 /* define stub mutex functions */
98 #warning "stub mutex functions"
99 typedef int coap_mutex_t;
100 
101 #define coap_mutex_init(a)    *(a) = 0
102 #define coap_mutex_destroy(a) *(a) = 0
103 #define coap_mutex_lock(a)    *(a) = 1
104 #define coap_mutex_trylock(a) *(a) = 1
105 #define coap_mutex_unlock(a)  *(a) = 0
106 
107 #endif /* !WITH_CONTIKI && !WITH_LWIP && !RIOT_VERSION && !HAVE_PTHREAD_H && !HAVE_PTHREAD_MUTEX_LOCK */
108 
109 extern coap_mutex_t m_show_pdu;
110 extern coap_mutex_t m_log_impl;
111 extern coap_mutex_t m_dtls_recv;
112 extern coap_mutex_t m_read_session;
113 extern coap_mutex_t m_read_endpoint;
114 extern coap_mutex_t m_persist_add;
115 
116 #endif /* COAP_CONSTRAINED_STACK */
117 
118 #endif /* COAP_MUTEX_INTERNAL_H_ */
119