17#ifndef COAP_THREADSAFE_INTERNAL_H_
18#define COAP_THREADSAFE_INTERNAL_H_
73# if COAP_THREAD_RECURSIVE_CHECK
82 const char *lock_file;
83 unsigned int lock_line;
84 unsigned int unlock_line;
85 const char *unlock_file;
86 const char *callback_file;
87 unsigned int callback_line;
88 unsigned int being_freed;
89 unsigned int in_callback;
90 unsigned int lock_count;
102void coap_lock_unlock_func(
coap_lock_t *lock,
const char *file,
int line);
117int coap_lock_lock_func(
coap_lock_t *lock,
int force,
const char *file,
int line);
134#define coap_lock_lock(c,failed) do { \
136 if (!coap_lock_lock_func(&(c)->lock, 0, __FILE__, __LINE__)) { \
148#define coap_lock_unlock(c) do { \
150 coap_lock_unlock_func(&(c)->lock, __FILE__, __LINE__); \
162#define coap_lock_callback(c,func) do { \
163 int being_freed = (c)->lock.being_freed && coap_thread_pid == (c)->lock.freeing_pid; \
165 coap_lock_lock_func(&(c)->lock, 1, __FILE__, __LINE__); \
167 coap_lock_check_locked(c); \
169 (c)->lock.in_callback++; \
170 (c)->lock.callback_file = __FILE__; \
171 (c)->lock.callback_line = __LINE__; \
173 (c)->lock.in_callback--; \
175 coap_lock_unlock_func(&(c)->lock, __FILE__, __LINE__); \
189#define coap_lock_callback_ret(r,c,func) do { \
190 int being_freed = (c)->lock.being_freed && coap_thread_pid == (c)->lock.freeing_pid; \
192 coap_lock_lock_func(&(c)->lock, 1, __FILE__, __LINE__); \
194 coap_lock_check_locked(c); \
196 (c)->lock.in_callback++; \
197 (c)->lock.callback_file = __FILE__; \
198 (c)->lock.callback_line = __LINE__; \
200 (c)->lock.in_callback--; \
202 coap_lock_unlock_func(&(c)->lock, __FILE__, __LINE__); \
216#define coap_lock_callback_release(c,func,failed) do { \
217 int being_freed = (c)->lock.being_freed && coap_thread_pid == (c)->lock.freeing_pid; \
218 if (!being_freed) { \
219 coap_lock_check_locked(c); \
220 coap_lock_unlock(c); \
222 coap_lock_lock(c,failed); \
239#define coap_lock_callback_ret_release(r,c,func,failed) do { \
240 int being_freed = (c)->lock.being_freed && coap_thread_pid == (c)->lock.freeing_pid; \
241 if (!being_freed) { \
242 coap_lock_check_locked(c); \
243 coap_lock_unlock(c); \
245 coap_lock_lock(c,failed); \
260 uint32_t being_freed;
261 uint32_t in_callback;
262 volatile uint32_t lock_count;
285int coap_lock_lock_func(
coap_lock_t *lock,
int force);
302#define coap_lock_lock(c,failed) do { \
304 if (!coap_lock_lock_func(&(c)->lock, 0)) { \
316#define coap_lock_unlock(c) do { \
318 coap_lock_unlock_func(&(c)->lock); \
330#define coap_lock_callback(c,func) do { \
331 int being_freed = (c)->lock.being_freed && coap_thread_pid == (c)->lock.freeing_pid; \
333 coap_lock_lock_func(&(c)->lock, 1); \
335 coap_lock_check_locked(c); \
337 (c)->lock.in_callback++; \
339 (c)->lock.in_callback--; \
341 coap_lock_unlock_func(&(c)->lock); \
355#define coap_lock_callback_ret(r,c,func) do { \
356 int being_freed = (c)->lock.being_freed && coap_thread_pid == (c)->lock.freeing_pid; \
358 coap_lock_lock_func(&(c)->lock, 1); \
360 coap_lock_check_locked(c); \
362 (c)->lock.in_callback++; \
363 (c)->lock.in_callback++; \
365 (c)->lock.in_callback--; \
367 coap_lock_unlock_func(&(c)->lock); \
381#define coap_lock_callback_release(c,func,failed) do { \
382 int being_freed = (c)->lock.being_freed && coap_thread_pid == (c)->lock.freeing_pid; \
383 if (!being_freed) { \
384 coap_lock_check_locked(c); \
385 coap_lock_unlock(c); \
387 coap_lock_lock(c,failed); \
404#define coap_lock_callback_ret_release(r,c,func,failed) do { \
405 int being_freed = (c)->lock.being_freed && coap_thread_pid == (c)->lock.freeing_pid; \
406 if (!being_freed) { \
407 coap_lock_check_locked(c); \
408 coap_lock_unlock(c); \
410 coap_lock_lock(c,failed); \
418#define coap_lock_init(c) do { \
420 memset(&((c)->lock), 0, sizeof((c)->lock)); \
421 coap_mutex_init(&(c)->lock.mutex); \
424#define coap_lock_being_freed(c,failed) do { \
425 coap_lock_lock(c,failed); \
426 (c)->lock.being_freed = 1; \
427 (c)->lock.freeing_pid = coap_thread_pid; \
428 coap_lock_unlock(c); \
431#define coap_lock_check_locked(c) do { \
433 coap_thread_pid == ((c)->lock.being_freed ? (c)->lock.freeing_pid : \
437#define coap_lock_invert(c,func,f) do { \
438 coap_lock_check_locked(c); \
439 if (!(c)->lock.being_freed) { \
440 coap_lock_unlock(c); \
442 coap_lock_lock(c,f); \
455#define coap_lock_lock(c,failed)
456#define coap_lock_unlock(c)
457#define coap_lock_init(c)
458#define coap_lock_being_freed(c,failed)
459#define coap_lock_check_locked(c) {}
460#define coap_lock_callback(c,func) func
461#define coap_lock_callback_ret(r,c,func) (r) = func
462#define coap_lock_callback_release(c,func,failed) func
463#define coap_lock_callback_ret_release(r,c,func,failed) (r) = func
464#define coap_lock_invert(c,func,f) func
#define coap_thread_pid_t