summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorMaria Matejka <mq@ucw.cz>2021-02-04 15:52:42 +0100
committerMaria Matejka <mq@ucw.cz>2021-11-22 19:05:43 +0100
commit1db83a507a9ae287815d62733d1337074993b433 (patch)
treec18bab7948e6fd3d1ce6a4ce00f8f2e58b9e9bd6 /lib
parentfeb17ced234bad13ae64b52a3f86241f74517997 (diff)
Locking subsystem: Just a global BIRD lock to begin with.
Diffstat (limited to 'lib')
-rw-r--r--lib/birdlib.h1
-rw-r--r--lib/lists.c2
-rw-r--r--lib/locking.h46
3 files changed, 48 insertions, 1 deletions
diff --git a/lib/birdlib.h b/lib/birdlib.h
index dc8bd00f..3dc39d19 100644
--- a/lib/birdlib.h
+++ b/lib/birdlib.h
@@ -9,6 +9,7 @@
#ifndef _BIRD_BIRDLIB_H_
#define _BIRD_BIRDLIB_H_
+#include "sysdep/config.h"
#include "lib/alloca.h"
/* Ugly structure offset handling macros */
diff --git a/lib/lists.c b/lib/lists.c
index 58d51073..dc2e4cbb 100644
--- a/lib/lists.c
+++ b/lib/lists.c
@@ -26,7 +26,7 @@
#define _BIRD_LISTS_C_
-#include "nest/bird.h"
+#include "lib/birdlib.h"
#include "lib/lists.h"
LIST_INLINE int
diff --git a/lib/locking.h b/lib/locking.h
new file mode 100644
index 00000000..eb1bc8fa
--- /dev/null
+++ b/lib/locking.h
@@ -0,0 +1,46 @@
+/*
+ * BIRD Library -- Locking
+ *
+ * (c) 2020--2021 Maria Matejka <mq@jmq.cz>
+ *
+ * Can be freely distributed and used under the terms of the GNU GPL.
+ */
+
+#ifndef _BIRD_LOCKING_H_
+#define _BIRD_LOCKING_H_
+
+struct domain_generic;
+
+/* Here define the global lock order; first to last. */
+struct lock_order {
+ struct domain_generic *the_bird;
+};
+
+#define LOCK_ORDER_DEPTH (sizeof(struct lock_order) / sizeof(struct domain_generic *))
+
+extern _Thread_local struct lock_order locking_stack;
+extern _Thread_local struct domain_generic **last_locked;
+
+#define DOMAIN(type) struct domain__##type
+#define DEFINE_DOMAIN(type) DOMAIN(type) { struct domain_generic *type; }
+
+#define DOMAIN_NEW(type, name) (DOMAIN(type)) { .type = domain_new(name) }
+struct domain_generic *domain_new(const char *name);
+
+#define DOMAIN_NULL(type) (DOMAIN(type)) {}
+
+#define LOCK_DOMAIN(type, d) do_lock(((d).type), &(locking_stack.type))
+#define UNLOCK_DOMAIN(type, d) do_unlock(((d).type), &(locking_stack.type))
+
+/* Internal for locking */
+void do_lock(struct domain_generic *dg, struct domain_generic **lsp);
+void do_unlock(struct domain_generic *dg, struct domain_generic **lsp);
+
+/* Use with care. To be removed in near future. */
+DEFINE_DOMAIN(the_bird);
+extern DOMAIN(the_bird) the_bird_domain;
+
+#define the_bird_lock() LOCK_DOMAIN(the_bird, the_bird_domain)
+#define the_bird_unlock() UNLOCK_DOMAIN(the_bird, the_bird_domain)
+
+#endif