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