]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MEDIUM: stream-int: completely remove stream_int_update_embedded()
authorWilly Tarreau <w@1wt.eu>
Thu, 24 Sep 2015 16:05:45 +0000 (18:05 +0200)
committerWilly Tarreau <w@1wt.eu>
Fri, 25 Sep 2015 19:16:02 +0000 (21:16 +0200)
This one is not needed anymore as what it used to do is either
completely covered by the new stream_int_notify() function, or undesired
and inherited from the past as a side effect of introducing the
connections.

This update is theorically never called since it's assigned only when
nothing is connected to the stream interface. However a test has been
added to si_update() to stay safe if some foreign code decides to call
si_update() in unsafe situations.

include/proto/stream_interface.h
src/stream_interface.c

index 22d05be80598c390cd6c366f5a36261901768cf7..cf45c5e26a7325bbe54c76048c9f3c3746fd6931 100644 (file)
@@ -326,7 +326,8 @@ static inline void si_shutw(struct stream_interface *si)
 static inline void si_update(struct stream_interface *si)
 {
        stream_int_update(si);
-       si->ops->update(si);
+       if (si->ops->update)
+               si->ops->update(si);
 }
 
 /* Calls chk_rcv on the connection using the data layer */
index a13311cf91e5cbe2f1e17bc5bc7e821b1563289e..111071a98635076afaa0e057ea37673377b13dfe 100644 (file)
@@ -38,7 +38,6 @@
 #include <types/pipe.h>
 
 /* socket functions used when running a stream interface as a task */
-static void stream_int_update_embedded(struct stream_interface *si);
 static void stream_int_shutr(struct stream_interface *si);
 static void stream_int_shutw(struct stream_interface *si);
 static void stream_int_chk_rcv(struct stream_interface *si);
@@ -59,7 +58,6 @@ static void si_idle_conn_null_cb(struct connection *conn);
 
 /* stream-interface operations for embedded tasks */
 struct si_ops si_embedded_ops = {
-       .update  = stream_int_update_embedded,
        .chk_rcv = stream_int_chk_rcv,
        .chk_snd = stream_int_chk_snd,
        .shutr   = stream_int_shutr,
@@ -151,91 +149,6 @@ void stream_int_retnclose(struct stream_interface *si, const struct chunk *msg)
        channel_shutr_now(oc);
 }
 
-/* default update function for embedded tasks, to be used at the end of the i/o handler */
-static void stream_int_update_embedded(struct stream_interface *si)
-{
-       int old_flags = si->flags;
-       struct channel *ic = si_ic(si);
-       struct channel *oc = si_oc(si);
-
-       DPRINTF(stderr, "%s: si=%p, si->state=%d ic->flags=%08x oc->flags=%08x\n",
-               __FUNCTION__,
-               si, si->state, ic->flags, oc->flags);
-
-       if (si->state != SI_ST_EST)
-               return;
-
-       if ((oc->flags & (CF_SHUTW|CF_SHUTW_NOW)) == CF_SHUTW_NOW &&
-           channel_is_empty(oc))
-               si_shutw(si);
-
-       if ((oc->flags & (CF_SHUTW|CF_SHUTW_NOW)) == 0 && channel_may_recv(oc))
-               si->flags |= SI_FL_WAIT_DATA;
-
-       /* we're almost sure that we need some space if the buffer is not
-        * empty, even if it's not full, because the applets can't fill it.
-        */
-       if ((ic->flags & (CF_SHUTR|CF_DONT_READ)) == 0 && !channel_is_empty(ic))
-               si->flags |= SI_FL_WAIT_ROOM;
-
-       if (oc->flags & CF_WRITE_ACTIVITY) {
-               if (tick_isset(oc->wex))
-                       oc->wex = tick_add_ifset(now_ms, oc->wto);
-       }
-
-       if (ic->flags & CF_READ_ACTIVITY ||
-           (oc->flags & CF_WRITE_ACTIVITY && !(si->flags & SI_FL_INDEP_STR))) {
-               if (tick_isset(ic->rex))
-                       ic->rex = tick_add_ifset(now_ms, ic->rto);
-       }
-
-       /* save flags to detect changes */
-       old_flags = si->flags;
-       if (likely((oc->flags & (CF_SHUTW|CF_WRITE_PARTIAL|CF_DONT_READ)) == CF_WRITE_PARTIAL &&
-                  channel_may_recv(oc) &&
-                  (si_opposite(si)->flags & SI_FL_WAIT_ROOM)))
-               si_chk_rcv(si_opposite(si));
-
-       if (((ic->flags & CF_READ_PARTIAL) && !channel_is_empty(ic)) &&
-           (ic->pipe /* always try to send spliced data */ ||
-            (ic->buf->i == 0 && (si_opposite(si)->flags & SI_FL_WAIT_DATA)))) {
-               si_chk_snd(si_opposite(si));
-               /* check if the consumer has freed some space */
-               if (channel_may_recv(ic) && !ic->pipe)
-                       si->flags &= ~SI_FL_WAIT_ROOM;
-       }
-
-       /* Note that we're trying to wake up in two conditions here :
-        *  - special event, which needs the holder task attention
-        *  - status indicating that the applet can go on working. This
-        *    is rather hard because we might be blocking on output and
-        *    don't want to wake up on input and vice-versa. The idea is
-        *    to only rely on the changes the chk_* might have performed.
-        */
-       if (/* check stream interface changes */
-           ((old_flags & ~si->flags) & (SI_FL_WAIT_ROOM|SI_FL_WAIT_DATA)) ||
-
-           /* changes on the production side */
-           (ic->flags & (CF_READ_NULL|CF_READ_ERROR)) ||
-           si->state != SI_ST_EST ||
-           (si->flags & SI_FL_ERR) ||
-           ((ic->flags & CF_READ_PARTIAL) &&
-            (!ic->to_forward || si_opposite(si)->state != SI_ST_EST)) ||
-
-           /* changes on the consumption side */
-           (oc->flags & (CF_WRITE_NULL|CF_WRITE_ERROR)) ||
-           ((oc->flags & CF_WRITE_ACTIVITY) &&
-            ((oc->flags & CF_SHUTW) ||
-             ((oc->flags & CF_WAKE_WRITE) &&
-              (si_opposite(si)->state != SI_ST_EST ||
-               (channel_is_empty(oc) && !oc->to_forward)))))) {
-               if (!(si->flags & SI_FL_DONT_WAKE))
-                       task_wakeup(si_task(si), TASK_WOKEN_IO);
-       }
-       if (ic->flags & CF_READ_ACTIVITY)
-               ic->flags &= ~CF_READ_DONTWAIT;
-}
-
 /*
  * This function performs a shutdown-read on a detached stream interface in a
  * connected or init state (it does nothing for other states). It either shuts