diff --git a/lib/locking.h b/lib/locking.h index 6cec2ff3..86cbf72d 100644 --- a/lib/locking.h +++ b/lib/locking.h @@ -9,27 +9,37 @@ #ifndef _BIRD_LOCKING_H_ #define _BIRD_LOCKING_H_ +#include "lib/macro.h" + struct domain_generic; struct pool; +#define LOCK_ORDER \ + the_bird, \ + meta, \ + control, \ + proto, \ + service, \ + rtable, \ + attrs, \ + logging, \ + resource, \ + /* Here define the global lock order; first to last. */ struct lock_order { - struct domain_generic *the_bird; - struct domain_generic *meta; - struct domain_generic *control; - struct domain_generic *proto; - struct domain_generic *service; - struct domain_generic *rtable; - struct domain_generic *attrs; - struct domain_generic *logging; - struct domain_generic *resource; +#define LOCK_ORDER_EXPAND(p) struct domain_generic *p; + MACRO_FOREACH(LOCK_ORDER_EXPAND, LOCK_ORDER) +#undef LOCK_ORDER_EXPAND }; +#define LOCK_ORDER_EXPAND(p) struct domain__##p { struct domain_generic *p; }; + MACRO_FOREACH(LOCK_ORDER_EXPAND, LOCK_ORDER) +#undef LOCK_ORDER_EXPAND + 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_ORDER(type) OFFSETOF(struct lock_order, type) #define DOMAIN_NEW(type) (DOMAIN(type)) { .type = domain_new(DOMAIN_ORDER(type)) } @@ -63,7 +73,6 @@ uint dg_order(struct domain_generic *dg); #define DG_UNLOCK(d) do_unlock(d, DG_LSP(d)) /* 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) @@ -273,4 +282,11 @@ extern DOMAIN(the_bird) the_bird_domain; _obj ? (_pobj->locked_at = NULL, LOBJ_UNLOCK_SIMPLE(_obj, _level), _obj) : NULL; \ LOBJ_LOCK_SIMPLE(_obj, _level), _pobj->locked_at = (struct _stem##_private **) _lataux, _obj = NULL) +/* + * Get the locked object when the lock is already taken + */ + +#define LOBJ_PRIV(_obj, _level) \ + ({ ASSERT_DIE(DOMAIN_IS_LOCKED(_level, (_obj)->lock)); &(_obj)->priv; }) + #endif diff --git a/lib/locking_test.c b/lib/locking_test.c index 0d99b189..6c5de0cb 100644 --- a/lib/locking_test.c +++ b/lib/locking_test.c @@ -5,8 +5,6 @@ #include #include -DEFINE_DOMAIN(proto); - #define FOO_PUBLIC \ const char *name; \ _Atomic uint counter; \ diff --git a/lib/rcu.c b/lib/rcu.c index 7ea6ec9b..c4b4721b 100644 --- a/lib/rcu.c +++ b/lib/rcu.c @@ -23,7 +23,6 @@ static list rcu_thread_list; static struct rcu_thread main_rcu_thread; -DEFINE_DOMAIN(resource); static DOMAIN(resource) rcu_domain; static int diff --git a/lib/route.h b/lib/route.h index a0446b39..f7e9c7f7 100644 --- a/lib/route.h +++ b/lib/route.h @@ -89,7 +89,6 @@ struct rte_owner { event *stop; }; -DEFINE_DOMAIN(attrs); extern DOMAIN(attrs) attrs_domain; #define RTA_LOCK LOCK_DOMAIN(attrs, attrs_domain) diff --git a/nest/locks.c b/nest/locks.c index 66409c6d..8036a1ef 100644 --- a/nest/locks.c +++ b/nest/locks.c @@ -38,7 +38,6 @@ static list olock_list; -DEFINE_DOMAIN(attrs); static DOMAIN(attrs) olock_domain; #define OBJ_LOCK LOCK_DOMAIN(attrs, olock_domain) #define OBJ_UNLOCK UNLOCK_DOMAIN(attrs, olock_domain) diff --git a/nest/route.h b/nest/route.h index a3119c5b..d6661afc 100644 --- a/nest/route.h +++ b/nest/route.h @@ -98,18 +98,16 @@ struct rt_table_exporter { extern uint rtable_max_id; -DEFINE_DOMAIN(rtable); - /* The public part of rtable structure */ -#define RTABLE_PUBLIC \ - resource r; \ - node n; /* Node in list of all tables */ \ - char *name; /* Name of this table */ \ - uint addr_type; /* Type of address data stored in table (NET_*) */ \ - uint id; /* Integer table ID for fast lookup */ \ - DOMAIN(rtable) lock; /* Lock to take to access the private parts */ \ - struct rtable_config *config; /* Configuration of this table */ \ - struct birdloop *loop; /* Service thread */ \ +#define RTABLE_PUBLIC \ + resource r; \ + node n; /* Node in list of all tables */ \ + char *name; /* Name of this table */ \ + uint addr_type; /* Type of address data stored in table (NET_*) */ \ + uint id; /* Integer table ID for fast lookup */ \ + DOMAIN(rtable) lock; /* Lock to take to access the private parts */ \ + struct rtable_config *config; /* Configuration of this table */ \ + struct birdloop *loop; /* Service thread */ \ /* The complete rtable structure */ struct rtable_private { @@ -167,7 +165,9 @@ struct rtable_private { /* The final union private-public rtable structure */ typedef union rtable { - struct { RTABLE_PUBLIC; }; + struct { + RTABLE_PUBLIC; + }; struct rtable_private priv; } rtable; diff --git a/sysdep/unix/alloc.c b/sysdep/unix/alloc.c index 56e755db..341c02a2 100644 --- a/sysdep/unix/alloc.c +++ b/sysdep/unix/alloc.c @@ -120,7 +120,6 @@ long page_size = 0; void *pages[0]; }; - DEFINE_DOMAIN(resource); static DOMAIN(resource) empty_pages_domain; static struct empty_pages *empty_pages = NULL; diff --git a/sysdep/unix/io-loop.c b/sysdep/unix/io-loop.c index 5213fdc0..0a222ba0 100644 --- a/sysdep/unix/io-loop.c +++ b/sysdep/unix/io-loop.c @@ -594,7 +594,6 @@ sockets_fire(struct birdloop *loop) * Threads */ -DEFINE_DOMAIN(attrs); static void bird_thread_start_event(void *_data); struct birdloop_pickup_group { diff --git a/sysdep/unix/io-loop.h b/sysdep/unix/io-loop.h index d1fb4ea8..53d9f96b 100644 --- a/sysdep/unix/io-loop.h +++ b/sysdep/unix/io-loop.h @@ -105,8 +105,6 @@ struct bird_thread }; -DEFINE_DOMAIN(control); - struct bird_thread_syncer { pool *pool; DOMAIN(control) lock; diff --git a/sysdep/unix/log.c b/sysdep/unix/log.c index 0d6adf42..41c8f07f 100644 --- a/sysdep/unix/log.c +++ b/sysdep/unix/log.c @@ -41,7 +41,6 @@ _Thread_local uint this_thread_id; #include -DEFINE_DOMAIN(logging); static DOMAIN(logging) log_domain; #define log_lock() LOCK_DOMAIN(logging, log_domain); #define log_unlock() UNLOCK_DOMAIN(logging, log_domain);