0
0
mirror of https://gitlab.nic.cz/labs/bird.git synced 2025-01-03 15:41:54 +00:00

Locking: Dropping DEFINE_DOMAIN ugly macro

This commit is contained in:
Maria Matejka 2023-11-20 17:40:25 +01:00
parent 080e580834
commit 5a916ed53f
10 changed files with 39 additions and 33 deletions

View File

@ -9,27 +9,37 @@
#ifndef _BIRD_LOCKING_H_ #ifndef _BIRD_LOCKING_H_
#define _BIRD_LOCKING_H_ #define _BIRD_LOCKING_H_
#include "lib/macro.h"
struct domain_generic; struct domain_generic;
struct pool; struct pool;
#define LOCK_ORDER \
the_bird, \
meta, \
control, \
proto, \
service, \
rtable, \
attrs, \
logging, \
resource, \
/* Here define the global lock order; first to last. */ /* Here define the global lock order; first to last. */
struct lock_order { struct lock_order {
struct domain_generic *the_bird; #define LOCK_ORDER_EXPAND(p) struct domain_generic *p;
struct domain_generic *meta; MACRO_FOREACH(LOCK_ORDER_EXPAND, LOCK_ORDER)
struct domain_generic *control; #undef LOCK_ORDER_EXPAND
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__##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 lock_order locking_stack;
extern _Thread_local struct domain_generic **last_locked; extern _Thread_local struct domain_generic **last_locked;
#define DOMAIN(type) struct domain__##type #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_ORDER(type) OFFSETOF(struct lock_order, type)
#define DOMAIN_NEW(type) (DOMAIN(type)) { .type = domain_new(DOMAIN_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)) #define DG_UNLOCK(d) do_unlock(d, DG_LSP(d))
/* Use with care. To be removed in near future. */ /* Use with care. To be removed in near future. */
DEFINE_DOMAIN(the_bird);
extern DOMAIN(the_bird) the_bird_domain; extern DOMAIN(the_bird) the_bird_domain;
#define the_bird_lock() LOCK_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; \ _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) 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 #endif

View File

@ -5,8 +5,6 @@
#include <stdatomic.h> #include <stdatomic.h>
#include <pthread.h> #include <pthread.h>
DEFINE_DOMAIN(proto);
#define FOO_PUBLIC \ #define FOO_PUBLIC \
const char *name; \ const char *name; \
_Atomic uint counter; \ _Atomic uint counter; \

View File

@ -23,7 +23,6 @@ static list rcu_thread_list;
static struct rcu_thread main_rcu_thread; static struct rcu_thread main_rcu_thread;
DEFINE_DOMAIN(resource);
static DOMAIN(resource) rcu_domain; static DOMAIN(resource) rcu_domain;
static int static int

View File

@ -89,7 +89,6 @@ struct rte_owner {
event *stop; event *stop;
}; };
DEFINE_DOMAIN(attrs);
extern DOMAIN(attrs) attrs_domain; extern DOMAIN(attrs) attrs_domain;
#define RTA_LOCK LOCK_DOMAIN(attrs, attrs_domain) #define RTA_LOCK LOCK_DOMAIN(attrs, attrs_domain)

View File

@ -38,7 +38,6 @@
static list olock_list; static list olock_list;
DEFINE_DOMAIN(attrs);
static DOMAIN(attrs) olock_domain; static DOMAIN(attrs) olock_domain;
#define OBJ_LOCK LOCK_DOMAIN(attrs, olock_domain) #define OBJ_LOCK LOCK_DOMAIN(attrs, olock_domain)
#define OBJ_UNLOCK UNLOCK_DOMAIN(attrs, olock_domain) #define OBJ_UNLOCK UNLOCK_DOMAIN(attrs, olock_domain)

View File

@ -98,18 +98,16 @@ struct rt_table_exporter {
extern uint rtable_max_id; extern uint rtable_max_id;
DEFINE_DOMAIN(rtable);
/* The public part of rtable structure */ /* The public part of rtable structure */
#define RTABLE_PUBLIC \ #define RTABLE_PUBLIC \
resource r; \ resource r; \
node n; /* Node in list of all tables */ \ node n; /* Node in list of all tables */ \
char *name; /* Name of this table */ \ char *name; /* Name of this table */ \
uint addr_type; /* Type of address data stored in table (NET_*) */ \ uint addr_type; /* Type of address data stored in table (NET_*) */ \
uint id; /* Integer table ID for fast lookup */ \ uint id; /* Integer table ID for fast lookup */ \
DOMAIN(rtable) lock; /* Lock to take to access the private parts */ \ DOMAIN(rtable) lock; /* Lock to take to access the private parts */ \
struct rtable_config *config; /* Configuration of this table */ \ struct rtable_config *config; /* Configuration of this table */ \
struct birdloop *loop; /* Service thread */ \ struct birdloop *loop; /* Service thread */ \
/* The complete rtable structure */ /* The complete rtable structure */
struct rtable_private { struct rtable_private {
@ -167,7 +165,9 @@ struct rtable_private {
/* The final union private-public rtable structure */ /* The final union private-public rtable structure */
typedef union rtable { typedef union rtable {
struct { RTABLE_PUBLIC; }; struct {
RTABLE_PUBLIC;
};
struct rtable_private priv; struct rtable_private priv;
} rtable; } rtable;

View File

@ -120,7 +120,6 @@ long page_size = 0;
void *pages[0]; void *pages[0];
}; };
DEFINE_DOMAIN(resource);
static DOMAIN(resource) empty_pages_domain; static DOMAIN(resource) empty_pages_domain;
static struct empty_pages *empty_pages = NULL; static struct empty_pages *empty_pages = NULL;

View File

@ -594,7 +594,6 @@ sockets_fire(struct birdloop *loop)
* Threads * Threads
*/ */
DEFINE_DOMAIN(attrs);
static void bird_thread_start_event(void *_data); static void bird_thread_start_event(void *_data);
struct birdloop_pickup_group { struct birdloop_pickup_group {

View File

@ -105,8 +105,6 @@ struct bird_thread
}; };
DEFINE_DOMAIN(control);
struct bird_thread_syncer { struct bird_thread_syncer {
pool *pool; pool *pool;
DOMAIN(control) lock; DOMAIN(control) lock;

View File

@ -41,7 +41,6 @@ _Thread_local uint this_thread_id;
#include <pthread.h> #include <pthread.h>
DEFINE_DOMAIN(logging);
static DOMAIN(logging) log_domain; static DOMAIN(logging) log_domain;
#define log_lock() LOCK_DOMAIN(logging, log_domain); #define log_lock() LOCK_DOMAIN(logging, log_domain);
#define log_unlock() UNLOCK_DOMAIN(logging, log_domain); #define log_unlock() UNLOCK_DOMAIN(logging, log_domain);