24#ifndef COAP_THREADSAFE_INTERNAL_H_
25#define COAP_THREADSAFE_INTERNAL_H_
94# if COAP_THREAD_RECURSIVE_CHECK
102 const char *lock_file;
103 unsigned int lock_line;
104 unsigned int unlock_line;
105 const char *unlock_file;
106 const char *callback_file;
107 unsigned int callback_line;
108 unsigned int in_callback;
109 unsigned int lock_count;
124void coap_lock_unlock_func(
coap_lock_t *lock,
const char *file,
int line);
140int coap_lock_lock_func(
coap_lock_t *lock,
const char *file,
int line);
158#define coap_lock_lock(c,failed) do { \
159 if (!coap_lock_lock_func(&global_lock, __FILE__, __LINE__)) { \
173#define coap_lock_unlock(c) 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__); \
223#define coap_lock_callback(c,func) do { \
224 coap_lock_check_locked(c); \
225 global_lock.in_callback++; \
226 global_lock.callback_file = __FILE__; \
227 global_lock.callback_line = __LINE__; \
229 global_lock.in_callback--; \
244#define coap_lock_callback_ret(r,c,func) do { \
245 coap_lock_check_locked(c); \
246 global_lock.in_callback++; \
247 global_lock.callback_file = __FILE__; \
248 global_lock.callback_line = __LINE__; \
250 global_lock.in_callback--; \
264#define coap_lock_callback_release(c,func,failed) do { \
265 coap_lock_check_locked(c); \
266 coap_lock_unlock(c); \
268 coap_lock_lock(c,failed); \
284#define coap_lock_callback_ret_release(r,c,func,failed) do { \
285 coap_lock_check_locked(c); \
286 coap_lock_unlock(c); \
288 coap_lock_lock(c,failed); \
304#define coap_lock_specific_callback_release(lock,func,failed) do { \
305 coap_lock_check_locked(NULL); \
306 coap_lock_unlock(NULL); \
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(NULL, failed); \
327 uint32_t in_callback;
328 volatile uint32_t lock_count;
374#define coap_lock_lock(c,failed) do { \
375 if (!coap_lock_lock_func(&global_lock)) { \
396#define coap_lock_specific_lock(lock, failed) do { \
397 if (!coap_lock_lock_func(lock)) { \
411#define coap_lock_unlock(c) do { \
412 coap_lock_unlock_func(&global_lock); \
425#define coap_lock_specific_unlock(lock) do { \
426 coap_lock_unlock_func(lock); \
439#define coap_lock_callback(c,func) do { \
440 coap_lock_check_locked(c); \
441 global_lock.in_callback++; \
443 global_lock.in_callback--; \
458#define coap_lock_callback_ret(r,c,func) do { \
459 coap_lock_check_locked(c); \
460 global_lock.in_callback++; \
462 global_lock.in_callback--; \
476#define coap_lock_callback_release(c,func,failed) do { \
477 coap_lock_check_locked(c); \
478 coap_lock_unlock(c); \
480 coap_lock_lock(c,failed); \
496#define coap_lock_specific_callback_release(lock,func,failed) do { \
497 coap_lock_check_locked(NULL); \
498 coap_lock_unlock(NULL); \
499 coap_lock_specific_lock(lock, failed); \
500 (lock)->in_callback++; \
502 (lock)->in_callback--; \
503 coap_lock_specific_unlock(lock); \
504 coap_lock_lock(NULL,failed); \
520#define coap_lock_callback_ret_release(r,c,func,failed) do { \
521 coap_lock_check_locked(c); \
522 coap_lock_unlock(c); \
524 coap_lock_lock(c,failed); \
532#define coap_lock_init(lock) do { \
533 memset(&(lock)->mutex, 0, sizeof((lock)->mutex)); \
534 coap_mutex_init(&(lock)->mutex); \
540#define coap_lock_check_locked(c) do { \
541 assert(coap_thread_pid == global_lock.pid); \
557#define coap_lock_invert(c,alt_lock,failed) do { \
558 coap_lock_check_locked(c); \
559 coap_lock_unlock(c); \
561 coap_lock_lock(c,failed); \
591#define coap_lock_lock(c,failed)
611#define coap_lock_specific_lock(lock,failed)
623#define coap_lock_unlock(c)
635#define coap_lock_specific_unlock(lock)
642#define coap_lock_init(lock)
649#define coap_lock_check_locked(c) {}
663#define coap_lock_callback(c,func) func
679#define coap_lock_callback_ret(r,c,func) (r) = func
694#define coap_lock_callback_release(c,func,failed) func
706#define coap_lock_specific_callback_release(lock,func,failed) func
724#define coap_lock_callback_ret_release(r,c,func,failed) (r) = func
741#define coap_lock_invert(c,alt_lock,failed) func
#define coap_thread_pid_t