X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=include%2Fyaz%2Fmutex.h;h=ff8babbd429865dccfa61fe8ebd18c8664cfcf2f;hp=cbd238df587d8313111e0b2492d6d9e0478c75d7;hb=9f11f349958f122419856006d9295eb0ce41274d;hpb=2788a4851b551e1a3efb320a2878b809f2d8a9d7 diff --git a/include/yaz/mutex.h b/include/yaz/mutex.h index cbd238d..ff8babb 100644 --- a/include/yaz/mutex.h +++ b/include/yaz/mutex.h @@ -1,5 +1,5 @@ /* This file is part of the YAZ toolkit. - * Copyright (C) 1995-2009 Index Data. + * Copyright (C) 1995-2010 Index Data. * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -33,20 +33,110 @@ #define YAZ_MUTEX_H #include +#include #include YAZ_BEGIN_CDECL -/** \brief NMEM/YAZ MUTEX opaque pointer */ +/** \brief YAZ MUTEX opaque pointer */ typedef struct yaz_mutex *YAZ_MUTEX; -/** \brief create Mutex */ -YAZ_EXPORT void yaz_mutex_create(YAZ_MUTEX *); -/** \brief enter critical section / AKA lock */ -YAZ_EXPORT void yaz_mutex_enter(YAZ_MUTEX); -/** \brief leave critical section / AKA unlock */ -YAZ_EXPORT void yaz_mutex_leave(YAZ_MUTEX); -/** \brief destroy MUTEX */ -YAZ_EXPORT void yaz_mutex_destroy(YAZ_MUTEX *); + +/** \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 create MUTEX with custom MUTEX flags + \param mutexp is pointer to MUTEX handle (*mutexp must be NULL) + \param attr is flags defined by PTHREAD_MUTEX_xxx + + It is important that *mutexp is NULL. If not, yaz_mutex_create will + not modify the handle (assumes it is already created!) + + This calls yax_mutex_create_attr(mutexp, PTHREAD_MUTEX_NORMAL) + */ +YAZ_EXPORT void yaz_mutex_create_attr(YAZ_MUTEX *mutexp, int flags); + +/** \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); YAZ_END_CDECL @@ -54,6 +144,7 @@ YAZ_END_CDECL /* * Local variables: * c-basic-offset: 4 + * c-file-style: "Stroustrup" * indent-tabs-mode: nil * End: * vim: shiftwidth=4 tabstop=8 expandtab