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);
159#define coap_lock_lock(failed) do { \
160 if (!coap_lock_lock_func(__FILE__, __LINE__)) { \
174#define coap_lock_unlock() do { \
175 coap_lock_unlock_func(__FILE__, __LINE__); \
187#define coap_lock_callback(func) do { \
188 coap_lock_check_locked(); \
189 global_lock.in_callback++; \
190 global_lock.callback_file = __FILE__; \
191 global_lock.callback_line = __LINE__; \
193 global_lock.in_callback--; \
207#define coap_lock_callback_ret(r,func) do { \
208 coap_lock_check_locked(); \
209 global_lock.in_callback++; \
210 global_lock.callback_file = __FILE__; \
211 global_lock.callback_line = __LINE__; \
213 global_lock.in_callback--; \
226#define coap_lock_callback_release(func,failed) do { \
227 coap_lock_check_locked(); \
228 coap_lock_unlock(); \
230 coap_lock_lock(failed); \
245#define coap_lock_callback_ret_release(r,func,failed) do { \
246 coap_lock_check_locked(); \
247 coap_lock_unlock(); \
249 coap_lock_lock(failed); \
262 uint32_t in_callback;
263 volatile uint32_t lock_count;
275void coap_lock_unlock_func(
void);
287int coap_lock_lock_func(
void);
305#define coap_lock_lock(failed) do { \
306 if (!coap_lock_lock_func()) { \
320#define coap_lock_unlock() do { \
321 coap_lock_unlock_func(); \
333#define coap_lock_callback(func) do { \
334 coap_lock_check_locked(); \
335 global_lock.in_callback++; \
337 global_lock.in_callback--; \
351#define coap_lock_callback_ret(r,func) do { \
352 coap_lock_check_locked(); \
353 global_lock.in_callback++; \
354 global_lock.in_callback++; \
356 global_lock.in_callback--; \
369#define coap_lock_callback_release(func,failed) do { \
370 coap_lock_check_locked(); \
371 coap_lock_unlock(); \
373 coap_lock_lock(failed); \
388#define coap_lock_callback_ret_release(r,func,failed) do { \
389 coap_lock_check_locked(); \
390 coap_lock_unlock(); \
392 coap_lock_lock(failed); \
400#define coap_lock_init() do { \
401 memset(&global_lock.mutex, 0, sizeof(global_lock.mutex)); \
402 coap_mutex_init(&global_lock.mutex); \
408#define coap_lock_check_locked() do { \
409 assert(coap_thread_pid == global_lock.pid); \
424#define coap_lock_invert(alt_lock,failed) do { \
425 coap_lock_check_locked(); \
426 coap_lock_unlock(); \
428 coap_lock_lock(failed); \
457#define coap_lock_lock(failed)
467#define coap_lock_unlock()
474#define coap_lock_init()
481#define coap_lock_check_locked() {}
494#define coap_lock_callback(func) func
509#define coap_lock_callback_ret(r,func) (r) = func
523#define coap_lock_callback_release(func,failed) func
540#define coap_lock_callback_ret_release(r,func,failed) (r) = func
556#define coap_lock_invert(alt_lock,failed) alt_lock
#define coap_thread_pid_t