MINOR: listeners: split delete_listener() in two versions

We'll need an already locked variant of this function so let's make
__delete_listener() which will be called with the protocol lock held
and the listener's lock held.
This commit is contained in:
Willy Tarreau 2020-10-07 15:36:16 +02:00
parent 4b51f42899
commit b4c083f5bf
2 changed files with 15 additions and 7 deletions

View File

@ -95,6 +95,7 @@ int create_listeners(struct bind_conf *bc, const struct sockaddr_storage *ss,
* been unbound. This is the generic function to use to remove a listener.
*/
void delete_listener(struct listener *listener);
void __delete_listener(struct listener *listener);
/* This function is called on a read event from a listening socket, corresponding
* to an accept. It tries to accept as many connections as possible, and for each

View File

@ -580,15 +580,11 @@ int create_listeners(struct bind_conf *bc, const struct sockaddr_storage *ss,
* state is automatically updated from LI_ASSIGNED to LI_INIT. The protocol's
* number of listeners is updated, as well as the global number of listeners
* and jobs. Note that the listener must have previously been unbound. This
* is the generic function to use to remove a listener.
*
* Will grab the proto_lock.
*
* is a low-level function expected to be called with the proto_lock and the
* listener's lock held.
*/
void delete_listener(struct listener *listener)
void __delete_listener(struct listener *listener)
{
HA_SPIN_LOCK(PROTO_LOCK, &proto_lock);
HA_SPIN_LOCK(LISTENER_LOCK, &listener->lock);
if (listener->state == LI_ASSIGNED) {
listener_set_state(listener, LI_INIT);
LIST_DEL(&listener->rx.proto_list);
@ -596,6 +592,17 @@ void delete_listener(struct listener *listener)
_HA_ATOMIC_SUB(&jobs, 1);
_HA_ATOMIC_SUB(&listeners, 1);
}
}
/* Delete a listener from its protocol's list of listeners (please check
* __delete_listener() above). The proto_lock and the listener's lock will
* be grabbed in this order.
*/
void delete_listener(struct listener *listener)
{
HA_SPIN_LOCK(PROTO_LOCK, &proto_lock);
HA_SPIN_LOCK(LISTENER_LOCK, &listener->lock);
__delete_listener(listener);
HA_SPIN_UNLOCK(LISTENER_LOCK, &listener->lock);
HA_SPIN_UNLOCK(PROTO_LOCK, &proto_lock);
}