From 318ac8720fcf5ab14ef794d36947870abb7d85f9 Mon Sep 17 00:00:00 2001 From: Maria Matejka Date: Sun, 7 May 2023 17:30:33 +0200 Subject: OLocks in BGP must be freed early --- nest/proto.c | 9 ++++++++- nest/protocol.h | 2 ++ 2 files changed, 10 insertions(+), 1 deletion(-) (limited to 'nest') diff --git a/nest/proto.c b/nest/proto.c index 647b7f4e..c07560c6 100644 --- a/nest/proto.c +++ b/nest/proto.c @@ -1157,11 +1157,15 @@ proto_event(void *ptr) p->do_stop = 0; } - if (proto_is_done(p)) + if (proto_is_done(p) && p->pool_fragile) /* perusing pool_fragile to do this once only */ + { + rp_free(p->pool_fragile); + p->pool_fragile = NULL; if (p->loop != &main_birdloop) birdloop_stop_self(p->loop, proto_loop_stopped, p); else proto_cleanup(p); + } } @@ -1235,7 +1239,10 @@ proto_start(struct proto *p) p->iface_sub.target = proto_event_list(p); PROTO_LOCKED_FROM_MAIN(p) + { + p->pool_fragile = rp_newf(p->pool, birdloop_domain(p->loop), "Protocol %s fragile objects", p->cf->name); proto_notify_state(p, (p->proto->start ? p->proto->start(p) : PS_UP)); + } } diff --git a/nest/protocol.h b/nest/protocol.h index 02ec5c15..e8f19801 100644 --- a/nest/protocol.h +++ b/nest/protocol.h @@ -130,6 +130,8 @@ struct proto { struct proto_config *cf; /* Configuration data */ struct proto_config *cf_new; /* Configuration we want to switch to after shutdown (NULL=delete) */ pool *pool; /* Pool containing local objects */ + pool *pool_fragile; /* Pool containing fragile local objects which need to be freed + before the protocol's birdloop actually stops, like olocks */ event *event; /* Protocol event */ timer *restart_timer; /* Timer to restart the protocol from limits */ event *restart_event; /* Event to restart/shutdown the protocol from limits */ -- cgit v1.2.3