24#ifndef COAP_THREADSAFE_INTERNAL_H_
25#define COAP_THREADSAFE_INTERNAL_H_
97#ifndef COAP_THREAD_KILL_SIG
98#define COAP_THREAD_KILL_SIG SIGINT
101# if COAP_THREAD_RECURSIVE_CHECK
109 const char *lock_file;
110 unsigned int lock_line;
111 unsigned int unlock_line;
112 const char *unlock_file;
113 const char *callback_file;
114 unsigned int callback_line;
115 unsigned int in_callback;
116 unsigned int lock_count;
131void coap_lock_unlock_func(
coap_lock_t *lock,
const char *file,
int line);
147int coap_lock_lock_func(
coap_lock_t *lock,
const char *file,
int line);
164#define coap_lock_lock(failed) do { \
165 if (!coap_lock_lock_func(&global_lock, __FILE__, __LINE__)) { \
177#define coap_lock_unlock() do { \
178 coap_lock_unlock_func(&global_lock, __FILE__, __LINE__); \
197#define coap_lock_specific_lock(lock, failed) do { \
198 if (!coap_lock_lock_func(lock, __FILE__, __LINE__)) { \
213#define coap_lock_specific_unlock(lock) do { \
214 coap_lock_unlock_func(lock, __FILE__, __LINE__); \
226#define coap_lock_callback(func) do { \
227 coap_lock_check_locked(); \
228 global_lock.in_callback++; \
229 global_lock.callback_file = __FILE__; \
230 global_lock.callback_line = __LINE__; \
232 global_lock.in_callback--; \
246#define coap_lock_callback_ret(r,func) do { \
247 coap_lock_check_locked(); \
248 global_lock.in_callback++; \
249 global_lock.callback_file = __FILE__; \
250 global_lock.callback_line = __LINE__; \
252 global_lock.in_callback--; \
265#define coap_lock_callback_release(func,failed) do { \
266 coap_lock_check_locked(); \
267 coap_lock_unlock(); \
269 coap_lock_lock(failed); \
284#define coap_lock_callback_ret_release(r,func,failed) do { \
285 coap_lock_check_locked(); \
286 coap_lock_unlock(); \
288 coap_lock_lock(failed); \
304#define coap_lock_specific_callback_release(lock,func,failed) do { \
305 coap_lock_check_locked(); \
306 coap_lock_unlock(); \
307 coap_lock_specific_lock(lock, failed); \
308 (lock)->in_callback++; \
309 (lock)->callback_file = __FILE__; \
310 (lock)->callback_line = __LINE__; \
312 (lock)->in_callback--; \
313 coap_lock_specific_unlock(lock); \
314 coap_lock_lock(failed); \
327 uint32_t in_callback;
328 volatile uint32_t lock_count;
373#define coap_lock_lock(failed) do { \
374 if (!coap_lock_lock_func(&global_lock)) { \
395#define coap_lock_specific_lock(lock, failed) do { \
396 if (!coap_lock_lock_func(lock)) { \
408#define coap_lock_unlock() do { \
409 coap_lock_unlock_func(&global_lock); \
422#define coap_lock_specific_unlock(lock) do { \
423 coap_lock_unlock_func(lock); \
435#define coap_lock_callback(func) do { \
436 coap_lock_check_locked(); \
437 global_lock.in_callback++; \
439 global_lock.in_callback--; \
453#define coap_lock_callback_ret(r,func) do { \
454 coap_lock_check_locked(); \
455 global_lock.in_callback++; \
457 global_lock.in_callback--; \
470#define coap_lock_callback_release(func,failed) do { \
471 coap_lock_check_locked(); \
472 coap_lock_unlock(); \
474 coap_lock_lock(failed); \
490#define coap_lock_specific_callback_release(lock,func,failed) do { \
491 coap_lock_check_locked(); \
492 coap_lock_unlock(); \
493 coap_lock_specific_lock(lock, failed); \
494 (lock)->in_callback++; \
496 (lock)->in_callback--; \
497 coap_lock_specific_unlock(lock); \
498 coap_lock_lock(failed); \
513#define coap_lock_callback_ret_release(r,func,failed) do { \
514 coap_lock_check_locked(); \
515 coap_lock_unlock(); \
517 coap_lock_lock(failed); \
525#define coap_lock_init(lock) do { \
526 memset(&(lock)->mutex, 0, sizeof((lock)->mutex)); \
527 coap_mutex_init(&(lock)->mutex); \
533#define coap_lock_check_locked() do { \
534 assert(coap_thread_pid == global_lock.pid); \
549#define coap_lock_invert(alt_lock,failed) do { \
550 coap_lock_check_locked(); \
551 coap_lock_unlock(); \
553 coap_lock_lock(failed); \
582#define coap_lock_lock(failed)
602#define coap_lock_specific_lock(lock,failed)
612#define coap_lock_unlock()
624#define coap_lock_specific_unlock(lock)
631#define coap_lock_init(lock)
638#define coap_lock_check_locked() {}
651#define coap_lock_callback(func) func
666#define coap_lock_callback_ret(r,func) (r) = func
680#define coap_lock_callback_release(func,failed) func
692#define coap_lock_specific_callback_release(lock,func,failed) func
709#define coap_lock_callback_ret_release(r,func,failed) (r) = func
725#define coap_lock_invert(alt_lock,failed) alt_lock
#define coap_thread_pid_t