MINOR: stream: Handle stream's timeouts in a dedicated function
This will be mandatory to be able to handle stream's timeouts before exiting
process_stream(). So, to not duplicate code, all this stuff is moved in a
dedicated function.
diff --git a/src/stream.c b/src/stream.c
index 4596fa6..a8a8816 100644
--- a/src/stream.c
+++ b/src/stream.c
@@ -1566,6 +1566,46 @@
}
}
+/* check SC and channel timeouts, and close the corresponding stream connectors
+ * for future reads or writes.
+ * Note: this will also concern upper layers but we do not touch any other
+ * flag. We must be careful and correctly detect state changes when calling
+ * them.
+ */
+static void stream_handle_timeouts(struct stream *s)
+{
+ stream_check_conn_timeout(s);
+
+ sc_check_timeouts(s->scf);
+ channel_check_timeout(&s->req);
+ if (unlikely((s->req.flags & (CF_SHUTW|CF_WRITE_TIMEOUT)) == CF_WRITE_TIMEOUT)) {
+ s->scb->flags |= SC_FL_NOLINGER;
+ sc_shutw(s->scb);
+ }
+
+ if (unlikely((s->req.flags & (CF_SHUTR|CF_READ_TIMEOUT)) == CF_READ_TIMEOUT)) {
+ if (s->scf->flags & SC_FL_NOHALF)
+ s->scf->flags |= SC_FL_NOLINGER;
+ sc_shutr(s->scf);
+ }
+
+ sc_check_timeouts(s->scb);
+ channel_check_timeout(&s->res);
+ if (unlikely((s->res.flags & (CF_SHUTW|CF_WRITE_TIMEOUT)) == CF_WRITE_TIMEOUT)) {
+ s->scf->flags |= SC_FL_NOLINGER;
+ sc_shutw(s->scf);
+ }
+
+ if (unlikely((s->res.flags & (CF_SHUTR|CF_READ_TIMEOUT)) == CF_READ_TIMEOUT)) {
+ if (s->scb->flags & SC_FL_NOHALF)
+ s->scb->flags |= SC_FL_NOLINGER;
+ sc_shutr(s->scb);
+ }
+
+ if (HAS_FILTERS(s))
+ flt_stream_check_timeouts(s);
+}
+
/* if the current task's wake_date was set, it's being profiled, thus we may
* report latencies and CPU usages in logs, so it's desirable to update the
* latency when entering process_stream().
@@ -1727,41 +1767,7 @@
* stream connectors when their timeouts have expired.
*/
if (unlikely(s->pending_events & TASK_WOKEN_TIMER)) {
- stream_check_conn_timeout(s);
-
- /* check SC and channel timeouts, and close the corresponding stream connectors
- * for future reads or writes. Note: this will also concern upper layers
- * but we do not touch any other flag. We must be careful and correctly
- * detect state changes when calling them.
- */
- sc_check_timeouts(scf);
- channel_check_timeout(req);
- if (unlikely((req->flags & (CF_SHUTW|CF_WRITE_TIMEOUT)) == CF_WRITE_TIMEOUT)) {
- scb->flags |= SC_FL_NOLINGER;
- sc_shutw(scb);
- }
-
- if (unlikely((req->flags & (CF_SHUTR|CF_READ_TIMEOUT)) == CF_READ_TIMEOUT)) {
- if (scf->flags & SC_FL_NOHALF)
- scf->flags |= SC_FL_NOLINGER;
- sc_shutr(scf);
- }
-
- sc_check_timeouts(scb);
- channel_check_timeout(res);
- if (unlikely((res->flags & (CF_SHUTW|CF_WRITE_TIMEOUT)) == CF_WRITE_TIMEOUT)) {
- scf->flags |= SC_FL_NOLINGER;
- sc_shutw(scf);
- }
-
- if (unlikely((res->flags & (CF_SHUTR|CF_READ_TIMEOUT)) == CF_READ_TIMEOUT)) {
- if (scb->flags & SC_FL_NOHALF)
- scb->flags |= SC_FL_NOLINGER;
- sc_shutr(scb);
- }
-
- if (HAS_FILTERS(s))
- flt_stream_check_timeouts(s);
+ stream_handle_timeouts(s);
/* Once in a while we're woken up because the task expires. But
* this does not necessarily mean that a timeout has been reached.