+
+/** \brief YAZ condition opaque pointer */
+typedef struct yaz_cond *YAZ_COND;
+
+/** \brief create MUTEX
+ \param mutexp is pointer to MUTEX handle (*mutexp must be NULL)
+
+ It is important that *mutexp is NULL. If not, yaz_mutex_create will
+ not modify the handle (assumes it is already created!)
+ */
+YAZ_EXPORT void yaz_mutex_create(YAZ_MUTEX *mutexp);
+
+/** \brief enter critical section / AKA lock
+ \param mutex MUTEX handle
+ */
+YAZ_EXPORT void yaz_mutex_enter(YAZ_MUTEX mutex);
+
+
+/** \brief leave critical section / AKA unlock
+ \param mutex MUTEX handle
+ */
+YAZ_EXPORT void yaz_mutex_leave(YAZ_MUTEX mutex);
+
+
+/** \brief destroy MUTEX
+ \param mutexp pointer to MUTEX handle
+
+ If *mutexp is NULL, then this function does nothing.
+ */
+YAZ_EXPORT void yaz_mutex_destroy(YAZ_MUTEX *mutexp);
+
+
+/** \brief sets name of MUTEX for debugging purposes
+ \param mutex MUTEX handle
+ \param log_level YAZ log level
+ \param name user-given name associated with MUTEX
+
+ If log_level != 0 and name != 0 this function will make yaz_mutex_enter
+ and yaz_mutex_leave print information for each invocation using yaz_log
+ with the level given. In particular when YAZ is compiled with pthreads,
+ yaz_mutex_enter will inform if a lock is not immediately acquired.
+ This function should be called after a MUTEX is created but before
+ it is used for locking.
+ */
+YAZ_EXPORT
+void yaz_mutex_set_name(YAZ_MUTEX mutex, int log_level, const char *name);
+
+/** \brief creates condition variable
+ \param p reference to condition handle
+
+ Upon successful completion *p holds the condition handle; *p = 0
+ on error.
+*/
+YAZ_EXPORT void yaz_cond_create(YAZ_COND *p);
+
+/** \brief destroys condition variable
+ \param p reference to condition handle
+
+ Upon completion *p holds 0.
+*/
+YAZ_EXPORT
+void yaz_cond_destroy(YAZ_COND *p);
+
+struct timeval;
+
+/** \brief waits for condition
+ \param p condition variable handle
+ \param m mutex
+ \param abstime wait until this time; 0 for indefinite wait
+
+ Semantics like pthread_cond_wait.
+*/
+YAZ_EXPORT
+int yaz_cond_wait(YAZ_COND p, YAZ_MUTEX m, const struct timeval *abstime);
+
+/** \brief unblock one thread waiting for block
+ \param p condition variable handle
+*/
+YAZ_EXPORT
+int yaz_cond_signal(YAZ_COND p);
+
+/** \brief unblock all threads waiting for block
+ \param p condition variable handle
+*/
+YAZ_EXPORT
+int yaz_cond_broadcast(YAZ_COND p);