summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/locking.h8
-rw-r--r--lib/rcu.c3
-rw-r--r--lib/resource.c7
3 files changed, 14 insertions, 4 deletions
diff --git a/lib/locking.h b/lib/locking.h
index 751eecbd..fc3c59ff 100644
--- a/lib/locking.h
+++ b/lib/locking.h
@@ -10,6 +10,7 @@
#define _BIRD_LOCKING_H_
struct domain_generic;
+struct pool;
/* Here define the global lock order; first to last. */
struct lock_order {
@@ -30,8 +31,8 @@ extern _Thread_local struct domain_generic **last_locked;
#define DEFINE_DOMAIN(type) DOMAIN(type) { struct domain_generic *type; }
#define DOMAIN_ORDER(type) OFFSETOF(struct lock_order, type)
-#define DOMAIN_NEW(type, name) (DOMAIN(type)) { .type = domain_new(name, DOMAIN_ORDER(type)) }
-struct domain_generic *domain_new(const char *name, uint order);
+#define DOMAIN_NEW(type) (DOMAIN(type)) { .type = domain_new(DOMAIN_ORDER(type)) }
+struct domain_generic *domain_new(uint order);
#define DOMAIN_FREE(type, d) domain_free((d).type)
void domain_free(struct domain_generic *);
@@ -39,6 +40,9 @@ void domain_free(struct domain_generic *);
#define DOMAIN_NAME(type, d) domain_name((d).type)
const char *domain_name(struct domain_generic *);
+#define DOMAIN_SETUP(type, d, n, p) domain_setup((d).type, n, p)
+void domain_setup(struct domain_generic *, const char *name, struct pool *);
+
#define DOMAIN_NULL(type) (DOMAIN(type)) {}
#define LOCK_DOMAIN(type, d) do_lock(((d).type), &(locking_stack.type))
diff --git a/lib/rcu.c b/lib/rcu.c
index 8ae4f2ab..7ea6ec9b 100644
--- a/lib/rcu.c
+++ b/lib/rcu.c
@@ -73,7 +73,8 @@ rcu_thread_stop(struct rcu_thread *rc)
void
rcu_init(void)
{
- rcu_domain = DOMAIN_NEW(resource, "Read-Copy-Update");
+ rcu_domain = DOMAIN_NEW(resource);
+ DOMAIN_SETUP(resource, rcu_domain, "Read-Copy-Update", NULL);
init_list(&rcu_thread_list);
rcu_thread_start(&main_rcu_thread);
}
diff --git a/lib/resource.c b/lib/resource.c
index 2071a411..e0aaac0a 100644
--- a/lib/resource.c
+++ b/lib/resource.c
@@ -51,6 +51,9 @@ rp_init(pool *z, struct domain_generic *dom, const char *name)
{
ASSERT_DIE(DG_IS_LOCKED(dom));
+ if (name && !domain_name(dom))
+ domain_setup(dom, name, z);
+
z->name = name;
z->domain = dom;
z->inside = (TLIST_LIST(resource)) {};
@@ -87,7 +90,9 @@ pool *
rp_vnewf(pool *p, struct domain_generic *dom, const char *fmt, va_list args)
{
pool *z = rp_new(p, dom, NULL);
- z->name = mb_vsprintf(p, fmt, args);
+ z->name = mb_vsprintf(z, fmt, args);
+ if (!domain_name(dom))
+ domain_setup(dom, z->name, z);
return z;
}