diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/locking.h | 8 | ||||
-rw-r--r-- | lib/rcu.c | 3 | ||||
-rw-r--r-- | lib/resource.c | 7 |
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)) @@ -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; } |