summaryrefslogtreecommitdiff
path: root/proto/bgp
diff options
context:
space:
mode:
authorMaria Matejka <mq@ucw.cz>2023-01-24 11:01:34 +0100
committerMaria Matejka <mq@ucw.cz>2023-01-24 11:34:36 +0100
commitf7c2a886c9fb73b2749d5e270f15b79c44e72a62 (patch)
tree602486438a95ce8bd1d71d0461227e0138b54b95 /proto/bgp
parent3ac628e0f0b7ffaa49c95688cc95954ece8f61fc (diff)
Object locks use events
Instead of calling custom hooks from object locks, we use standard event sending mechanism to inform protocols about object lock changes. As event sending is lockless, the unlocking protocol simply enqueues the appropriate event to the given loop when the locking is done.
Diffstat (limited to 'proto/bgp')
-rw-r--r--proto/bgp/bgp.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/proto/bgp/bgp.c b/proto/bgp/bgp.c
index 48e98bdf..c74b8273 100644
--- a/proto/bgp/bgp.c
+++ b/proto/bgp/bgp.c
@@ -1528,9 +1528,9 @@ bgp_feed_end(struct channel *C)
static void
-bgp_start_locked(struct object_lock *lock)
+bgp_start_locked(void *_p)
{
- struct bgp_proto *p = lock->data;
+ struct bgp_proto *p = _p;
const struct bgp_config *cf = p->cf;
if (p->p.proto_state != PS_START)
@@ -1637,8 +1637,11 @@ bgp_start(struct proto *P)
lock->iface = p->cf->iface;
lock->vrf = p->cf->iface ? NULL : p->p.vrf;
lock->type = OBJLOCK_TCP;
- lock->hook = bgp_start_locked;
- lock->data = p;
+ lock->event = (event) {
+ .hook = bgp_start_locked,
+ .data = p,
+ };
+ lock->target = &global_event_list;
/* For dynamic BGP, we use inst 1 to avoid collisions with regular BGP */
if (bgp_is_dynamic(p))