]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: listeners: split delete_listener() in two versions
authorWilly Tarreau <w@1wt.eu>
Wed, 7 Oct 2020 13:36:16 +0000 (15:36 +0200)
committerWilly Tarreau <w@1wt.eu>
Fri, 9 Oct 2020 09:27:30 +0000 (11:27 +0200)
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.

include/haproxy/listener.h
src/listener.c

index d6e130cd3310378af76b2a8655d18945b6c3d66c..857ecb76a5181419da4006b29a1a516c07ea5e93 100644 (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
index 82ed026d5beb8e391ecc1339f8b118e4e759bf20..e44c82cdd39182cf49fe24867220b1dd83e5d132 100644 (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);
 }