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;
127void coap_lock_unlock_func(
coap_lock_t *lock,
const char *file,
int line);
143int coap_lock_lock_func(
coap_lock_t *lock,
const char *file,
int line);
160#define coap_lock_lock(failed) do { \
161 if (!coap_lock_lock_func(&global_lock, __FILE__, __LINE__)) { \
173#define coap_lock_unlock() do { \
174 coap_lock_unlock_func(&global_lock, __FILE__, __LINE__); \
193#define coap_lock_specific_lock(lock, failed) do { \
194 if (!coap_lock_lock_func(lock, __FILE__, __LINE__)) { \
209#define coap_lock_specific_unlock(lock) do { \
210 coap_lock_unlock_func(lock, __FILE__, __LINE__); \
222#define coap_lock_callback(func) do { \
223 coap_lock_check_locked(); \
224 global_lock.in_callback++; \
225 global_lock.callback_file = __FILE__; \
226 global_lock.callback_line = __LINE__; \
228 global_lock.in_callback--; \
242#define coap_lock_callback_ret(r,func) do { \
243 coap_lock_check_locked(); \
244 global_lock.in_callback++; \
245 global_lock.callback_file = __FILE__; \
246 global_lock.callback_line = __LINE__; \
248 global_lock.in_callback--; \
261#define coap_lock_callback_release(func,failed) do { \
262 coap_lock_check_locked(); \
263 coap_lock_unlock(); \
265 coap_lock_lock(failed); \
280#define coap_lock_callback_ret_release(r,func,failed) do { \
281 coap_lock_check_locked(); \
282 coap_lock_unlock(); \
284 coap_lock_lock(failed); \
300#define coap_lock_specific_callback_release(lock,func,failed) do { \
301 coap_lock_check_locked(); \
302 coap_lock_unlock(); \
303 coap_lock_specific_lock(lock, failed); \
304 (lock)->in_callback++; \
305 (lock)->callback_file = __FILE__; \
306 (lock)->callback_line = __LINE__; \
308 (lock)->in_callback--; \
309 coap_lock_specific_unlock(lock); \
310 coap_lock_lock(failed); \
323 uint32_t in_callback;
324 volatile uint32_t lock_count;
369#define coap_lock_lock(failed) do { \
370 if (!coap_lock_lock_func(&global_lock)) { \
391#define coap_lock_specific_lock(lock, failed) do { \
392 if (!coap_lock_lock_func(lock)) { \
404#define coap_lock_unlock() do { \
405 coap_lock_unlock_func(&global_lock); \
418#define coap_lock_specific_unlock(lock) do { \
419 coap_lock_unlock_func(lock); \
431#define coap_lock_callback(func) do { \
432 coap_lock_check_locked(); \
433 global_lock.in_callback++; \
435 global_lock.in_callback--; \
449#define coap_lock_callback_ret(r,func) do { \
450 coap_lock_check_locked(); \
451 global_lock.in_callback++; \
453 global_lock.in_callback--; \
466#define coap_lock_callback_release(func,failed) do { \
467 coap_lock_check_locked(); \
468 coap_lock_unlock(); \
470 coap_lock_lock(failed); \
486#define coap_lock_specific_callback_release(lock,func,failed) do { \
487 coap_lock_check_locked(); \
488 coap_lock_unlock(); \
489 coap_lock_specific_lock(lock, failed); \
490 (lock)->in_callback++; \
492 (lock)->in_callback--; \
493 coap_lock_specific_unlock(lock); \
494 coap_lock_lock(failed); \
509#define coap_lock_callback_ret_release(r,func,failed) do { \
510 coap_lock_check_locked(); \
511 coap_lock_unlock(); \
513 coap_lock_lock(failed); \
521#define coap_lock_init(lock) do { \
522 memset(&(lock)->mutex, 0, sizeof((lock)->mutex)); \
523 coap_mutex_init(&(lock)->mutex); \
529#define coap_lock_check_locked() do { \
530 assert(coap_thread_pid == global_lock.pid); \
545#define coap_lock_invert(alt_lock,failed) do { \
546 coap_lock_check_locked(); \
547 coap_lock_unlock(); \
549 coap_lock_lock(failed); \
578#define coap_lock_lock(failed)
598#define coap_lock_specific_lock(lock,failed)
608#define coap_lock_unlock()
620#define coap_lock_specific_unlock(lock)
627#define coap_lock_init(lock)
634#define coap_lock_check_locked() {}
647#define coap_lock_callback(func) func
662#define coap_lock_callback_ret(r,func) (r) = func
676#define coap_lock_callback_release(func,failed) func
688#define coap_lock_specific_callback_release(lock,func,failed) func
705#define coap_lock_callback_ret_release(r,func,failed) (r) = func
721#define coap_lock_invert(alt_lock,failed) alt_lock
#define coap_thread_pid_t