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);
+ }
}
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));
+ }
}
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 */
* so that we are the only instance attempting to talk with that neighbor.
*/
struct object_lock *lock;
- lock = p->lock = olock_new(P->pool);
+ lock = p->lock = olock_new(P->pool_fragile);
lock->addr = p->remote_ip;
lock->port = p->cf->remote_port;
lock->iface = p->cf->iface;