summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/lkdhash.h43
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