24#ifndef COAP_THREADSAFE_INTERNAL_H_
25#define COAP_THREADSAFE_INTERNAL_H_
97# if COAP_THREAD_RECURSIVE_CHECK
105 const char *lock_file;
106 unsigned int lock_line;
107 unsigned int unlock_line;
108 const char *unlock_file;
109 const char *callback_file;
110 unsigned int callback_line;
111 unsigned int in_callback;
112 unsigned int lock_count;
126void coap_lock_unlock_func(
const char *file,
int line);
141int coap_lock_lock_func(
const char *file,
int line);
158#define coap_lock_lock(failed) do { \
159 if (!coap_lock_lock_func(__FILE__, __LINE__)) { \
171#define coap_lock_unlock() do { \
172 coap_lock_unlock_func(__FILE__, __LINE__); \
184#define coap_lock_callback(func) do { \
185 coap_lock_check_locked(); \
186 global_lock.in_callback++; \
187 global_lock.callback_file = __FILE__; \
188 global_lock.callback_line = __LINE__; \
190 global_lock.in_callback--; \
204#define coap_lock_callback_ret(r,func) do { \
205 coap_lock_check_locked(); \
206 global_lock.in_callback++; \
207 global_lock.callback_file = __FILE__; \
208 global_lock.callback_line = __LINE__; \
210 global_lock.in_callback--; \
223#define coap_lock_callback_release(func,failed) do { \
224 coap_lock_check_locked(); \
225 coap_lock_unlock(); \
227 coap_lock_lock(failed); \
242#define coap_lock_callback_ret_release(r,func,failed) do { \
243 coap_lock_check_locked(); \
244 coap_lock_unlock(); \
246 coap_lock_lock(failed); \
259 uint32_t in_callback;
260 volatile uint32_t lock_count;
272void coap_lock_unlock_func(
void);
284int coap_lock_lock_func(
void);
301#define coap_lock_lock(failed) do { \
302 if (!coap_lock_lock_func()) { \
314#define coap_lock_unlock() do { \
315 coap_lock_unlock_func(); \
327#define coap_lock_callback(func) do { \
328 coap_lock_check_locked(); \
329 global_lock.in_callback++; \
331 global_lock.in_callback--; \
345#define coap_lock_callback_ret(r,func) do { \
346 coap_lock_check_locked(); \
347 global_lock.in_callback++; \
349 global_lock.in_callback--; \
362#define coap_lock_callback_release(func,failed) do { \
363 coap_lock_check_locked(); \
364 coap_lock_unlock(); \
366 coap_lock_lock(failed); \
381#define coap_lock_callback_ret_release(r,func,failed) do { \
382 coap_lock_check_locked(); \
383 coap_lock_unlock(); \
385 coap_lock_lock(failed); \
393#define coap_lock_init() do { \
394 memset(&global_lock.mutex, 0, sizeof(global_lock.mutex)); \
395 coap_mutex_init(&global_lock.mutex); \
401#define coap_lock_check_locked() do { \
402 assert(coap_thread_pid == global_lock.pid); \
417#define coap_lock_invert(alt_lock,failed) do { \
418 coap_lock_check_locked(); \
419 coap_lock_unlock(); \
421 coap_lock_lock(failed); \
450#define coap_lock_lock(failed)
460#define coap_lock_unlock()
467#define coap_lock_init()
474#define coap_lock_check_locked() {}
487#define coap_lock_callback(func) func
502#define coap_lock_callback_ret(r,func) (r) = func
516#define coap_lock_callback_release(func,failed) func
533#define coap_lock_callback_ret_release(r,func,failed) (r) = func
549#define coap_lock_invert(alt_lock,failed) alt_lock
#define coap_thread_pid_t