Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
COAP_LOCKING(3) 		 libcoap Manual 		 COAP_LOCKING(3)

NAME
     coap_locking,     coap_lock_init,	   coap_lock_lock,     coap_lock_unlock,
     coap_lock_check_locked,   coap_lock_callback,   coap_lock_callback_release,
     coap_lock_callback_ret,  coap_lock_callback_ret_release, coap_lock_invert -
     Work with CoAP thread safe locking

SYNOPSIS
     #include <coap3/coap.h>

     void coap_lock_init(void);

     void coap_lock_lock(coap_context_t *context, coap_code_t failed_statement);

     void coap_lock_unlock(coap_context_t *context);

     void coap_lock_check_locked(coap_context_t *context);

     void coap_lock_callback(coap_context_t *context, coap_func_t callback_func-
     tion);

     void coap_lock_callback_ret(void  *return_value,  coap_context_t  *context,
     coap_func_t callback_function, coap_code_t failed_statement);

     void  coap_lock_callback_release(coap_context_t *context, coap_func_t call-
     back_function_, coap_code_t failed_statement);

     void  coap_lock_callback_ret_release(void	 *return_value,   coap_context_t
     *context, coap_func_t callback_function, coap_code_t failed_statement);

     void  coap_lock_invert(coap_context_t  *context,  coap_func_t locking_func-
     tion, coap_code_t failed_statement);

     For  specific   (D)TLS   library	support,   link   with	 -lcoap-3-notls,
     -lcoap-3-gnutls,  -lcoap-3-openssl,  -lcoap-3-mbedtls,  -lcoap-3-wolfssl or
     -lcoap-3-tinydtls. Otherwise, link with -lcoap-3 to get the default  (D)TLS
     library support.

DESCRIPTION
     This  man	page  focuses on the locking support provided for making libcoap
     thread safe. Usage is internal to libcoap library.

     The functions are actually macros which create different code depending  on
     what  levels  of  locking	has  been configured. Locking uses coap_mutex_()
     functions.

     So, failed_statement is the C code to execute if the locking fails for  any
     reason.  This  should  only happen when coap_cleanup(3) has been called, or
     coap_startup(3) has not been called. This code should prevent execution  of
     the  following code that would have been under the lock protection and cer-
     tainly not  cause	the  corresponding  coap_lock_unlock()	function  to  be
     called.

     Likewise,	callback_function  is  the callback handler function with all of
     its parameters.

     Several definitions can be defined with configure or cmake. These are

     COAP_THREAD_SAFE If set, simply does locking at the appropriate places.  If
     not set, then no locking takes place, the code is faster (no locking code),
     but not multi-thread access safe.

     COAP_THREAD_RECURSIVE_CHECK  If  set,  and  COAP_THREAD_SAFE is set, checks
     that if a	lock  is  locked,  it  reports	that  the  same  lock  is  being
     (re-)locked.

     Currently, locking is only done at the global_lock level for the Public API
     functions where appropriate.

     In  principal,  libcoap code internally should only unlock global_lock when
     waiting on a select() or equivalent, or when calling a request handler, and
     then lock up again on function return. Any other unlock - app  call-back  -
     lock  needs  to be carefully analyzed as to any potential issues being cre-
     ated by the app call-back if it calls any Public  API,  updating  any  data
     that is relied on after lock takes place.

     coap_lock_callback()   (or  coap_lock_callback_ret())  wrapper  leaves  the
     global_lock locked when calling app call-back, but allows the app call-back
     to call a Public API when in the locked state.

     coap_lock_callback_release() (or coap_lock_callback_ret_release())  unlocks
     global_lock  when calling app call-back. The allows the app call-back to go
     off and do other slow/blocking activity. Any calls to  a  Public  API  then
     locks up global_lock before preceding.

     Any libcoap code that runs with global_lock locked should not call a Public
     API, but call the _lkd equivalent (if available).

FUNCTIONS
     Function: coap_lock_init()

     The  coap_lock_init()  function  is used to initialize the global_lock lock
     structure.

     Function: coap_lock_lock()

     The coap_lock_lock() function is used to  lock  global_lock  from	multiple
     thread  access.  If the locking fails for any reason, then failed_statement
     will get executed.

     Function: coap_lock_unlock()

     The coap_lock_unlock() function is used to unlock global_lock so  that  an-
     other thread can access libcoap and the underlying structures.

     Function: coap_lock_check_lock()

     The  coap_lock_check_lock()  function is used to check the internal version
     (potentially has _lkd appended in the name)  of  a  public  AP  is  getting
     called with global_lock locked.

     Function: coap_lock_callback()

     The  coap_lock_callback()	function  is used whenever a callback handler is
     getting called, instead of calling the function directly. The lock informa-
     tion in global_lock is updated so that if	a  public  API	is  called  from
     within  the  handler,  recursive  locking	is  enabled  for that particular
     thread. On return from the callback, the lock in  global_lock  is	suitably
     restored.	callback_function  is  the  callback handler to be called, along
     with all of the appropriate parameters.

     Function: coap_lock_callback_ret()

     The coap_lock_callback_ret() function is similar  to  coap_lock_callback(),
     but  in  addition,  it  updates  the return value from the callback handler
     function in return_value.

     Function: coap_lock_callback_release()

     The coap_lock_callback_release() function is used whenever a callback  han-
     dler  is getting called, instead of calling the function directly. The lock
     information in global_lock is released so that if a public  API  is  called
     from  within the handler, it can do its own lock. The intent here is to re-
     duce lock contention. On return from the callback, the lock in  global_lock
     is  re-locked, but if there is a failure in re-locking, failed_statement is
     executed. callback_function is the callback handler  to  be  called,  along
     with all of the appropriate parameters.

     Function: coap_lock_callback_ret_release()

     The coap_lock_callback_ret_release() function is similar to coap_lock_call-
     back_release(), but in addition, it updates the return value from the call-
     back handler function in return_value.

     Function: coap_lock_invert()

     The coap_lock_invert() function is used where there are other locking mech-
     anisms external to libcoap and the locking order needs to be external lock,
     then  libcoap  code  locked.  global_lock already needs to be locked before
     calling  coap_lock_invert().  If	coap_lock_invert()   is   called,   then
     global_lock  will get unlocked, locking_function with all of its parameters
     called, and then global_lock re-locked. If for any  reason  locking  fails,
     then failed_statement will get executed.

SEE ALSO
     coap_supported(3)

FURTHER INFORMATION
     See

     "RFC7252: The Constrained Application Protocol (CoAP)"

     for further information.

BUGS
     Please  raise  an issue on GitHub at https://github.com/obgm/libcoap/issues
     to report any bugs.

     Please raise a Pull Request  at  https://github.com/obgm/libcoap/pulls  for
     any fixes.

AUTHORS
     The libcoap project <libcoap-developers@lists.sourceforge.net>

coap_locking 4.3.5		   08/02/2026			 COAP_LOCKING(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=coap_locking&sektion=3&manpath=FreeBSD+Ports+15.1.quarterly>

home | help