24#ifndef COAP_THREADSAFE_INTERNAL_H_
25#define COAP_THREADSAFE_INTERNAL_H_
93# if COAP_THREAD_RECURSIVE_CHECK
101 const char *lock_file;
102 unsigned int lock_line;
103 unsigned int unlock_line;
104 const char *unlock_file;
105 const char *callback_file;
106 unsigned int callback_line;
107 unsigned int in_callback;
108 unsigned int lock_count;
122void coap_lock_unlock_func(
const char *file,
int line);
137int coap_lock_lock_func(
const char *file,
int line);
155#define coap_lock_lock(failed) do { \
156 if (!coap_lock_lock_func(__FILE__, __LINE__)) { \
170#define coap_lock_unlock() do { \
171 coap_lock_unlock_func(__FILE__, __LINE__); \
183#define coap_lock_callback(func) do { \
184 coap_lock_check_locked(); \
185 global_lock.in_callback++; \
186 global_lock.callback_file = __FILE__; \
187 global_lock.callback_line = __LINE__; \
189 global_lock.in_callback--; \
203#define coap_lock_callback_ret(r,func) do { \
204 coap_lock_check_locked(); \
205 global_lock.in_callback++; \
206 global_lock.callback_file = __FILE__; \
207 global_lock.callback_line = __LINE__; \
209 global_lock.in_callback--; \
222#define coap_lock_callback_release(func,failed) do { \
223 coap_lock_check_locked(); \
224 coap_lock_unlock(); \
226 coap_lock_lock(failed); \
241#define coap_lock_callback_ret_release(r,func,failed) do { \
242 coap_lock_check_locked(); \
243 coap_lock_unlock(); \
245 coap_lock_lock(failed); \
258 uint32_t in_callback;
259 volatile uint32_t lock_count;
271void coap_lock_unlock_func(
void);
283int coap_lock_lock_func(
void);
301#define coap_lock_lock(failed) do { \
302 if (!coap_lock_lock_func()) { \
316#define coap_lock_unlock() do { \
317 coap_lock_unlock_func(); \
329#define coap_lock_callback(func) do { \
330 coap_lock_check_locked(); \
331 global_lock.in_callback++; \
333 global_lock.in_callback--; \
347#define coap_lock_callback_ret(r,func) do { \
348 coap_lock_check_locked(); \
349 global_lock.in_callback++; \
350 global_lock.in_callback++; \
352 global_lock.in_callback--; \
365#define coap_lock_callback_release(func,failed) do { \
366 coap_lock_check_locked(); \
367 coap_lock_unlock(); \
369 coap_lock_lock(failed); \
384#define coap_lock_callback_ret_release(r,func,failed) do { \
385 coap_lock_check_locked(); \
386 coap_lock_unlock(); \
388 coap_lock_lock(failed); \
396#define coap_lock_init() do { \
397 memset(&global_lock.mutex, 0, sizeof(global_lock.mutex)); \
398 coap_mutex_init(&global_lock.mutex); \
404#define coap_lock_check_locked() do { \
405 assert(coap_thread_pid == global_lock.pid); \
420#define coap_lock_invert(alt_lock,failed) do { \
421 coap_lock_check_locked(); \
422 coap_lock_unlock(); \
424 coap_lock_lock(failed); \
453#define coap_lock_lock(failed)
463#define coap_lock_unlock()
470#define coap_lock_init()
477#define coap_lock_check_locked() {}
490#define coap_lock_callback(func) func
505#define coap_lock_callback_ret(r,func) (r) = func
519#define coap_lock_callback_release(func,failed) func
536#define coap_lock_callback_ret_release(r,func,failed) (r) = func
552#define coap_lock_invert(alt_lock,failed) alt_lock
#define coap_thread_pid_t