diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/lkdhash.h | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/include/lkdhash.h b/include/lkdhash.h new file mode 100644 index 0000000..e8349c5 --- /dev/null +++ b/include/lkdhash.h @@ -0,0 +1,43 @@ +#ifndef __LKDHASH_H__ +#define __LKDHASH_H__ + +// This is intended to be used in conjunction with uthash and libglvnd_pthread. +#include "glvnd_pthread.h" +#include "uthash.h" + +/* + * Macros for defining a "locked hash": a hashtable protected by a lock. + */ +#define DEFINE_LKDHASH(_hashtype, _hashname) \ + struct { \ + _hashtype *hash; \ + glvnd_rwlock_t lock; \ + } _hashname + +#define DEFINE_INITIALIZED_LKDHASH(_hashtype, _hashname) \ + struct { \ + _hashtype *hash; \ + glvnd_rwlock_t lock; \ + } _hashname = { NULL, GLVND_RWLOCK_INITIALIZER } + +#define LKDHASH_INIT(imp, _lockedhash) do { \ + (_lockedhash).hash = NULL; \ + (imp).rwlock_init(&(_lockedhash).lock, NULL); \ +} while (0) + +/* + * Macros for locking/unlocking the locked hash. + */ +#define LKDHASH_RDLOCK(imp, _lockedhash) \ + (imp).rwlock_rdlock(&(_lockedhash).lock) +#define LKDHASH_WRLOCK(imp, _lockedhash) \ + (imp).rwlock_wrlock(&(_lockedhash).lock) +#define LKDHASH_UNLOCK(imp, _lockedhash) \ + (imp).rwlock_unlock(&(_lockedhash).lock) + +/* + * Converts a locked hash into a hash suitable for use with uthash. + */ +#define _LH(_lockedhash) ((_lockedhash).hash) + +#endif |