include/types/stream_interface.h
This file describes the stream_interface struct and associated constants.
- Copyright (C) 2000-2008 Willy Tarreau - w@1wt.eu
+ Copyright (C) 2000-2009 Willy Tarreau - w@1wt.eu
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
SI_FL_WAIT_ROOM = 0x0004, /* waiting for space to store incoming data */
SI_FL_WAIT_DATA = 0x0008, /* waiting for more data to send */
SI_FL_CAP_SPLTCP = 0x0010, /* splicing possible from/to TCP */
+ SI_FL_DONT_WAKE = 0x0020, /* resync in progress, don't wake up */
};
#define SI_FL_CAP_SPLICE (SI_FL_CAP_SPLTCP)
rqf_last = s->req->flags;
rpf_last = s->rep->flags;
+ /* we don't want the stream interface functions to recursively wake us up */
+ if (s->req->prod->owner == t)
+ s->req->prod->flags |= SI_FL_DONT_WAKE;
+ if (s->req->cons->owner == t)
+ s->req->cons->flags |= SI_FL_DONT_WAKE;
+
/* 1a: Check for low level timeouts if needed. We just set a flag on
* stream interfaces when their timeouts have expired.
*/
if ((s->rep->flags ^ rpf_last) & BF_MASK_STATIC)
goto resync_response;
+ /* we're interested in getting wakeups again */
+ s->req->prod->flags &= ~SI_FL_DONT_WAKE;
+ s->req->cons->flags &= ~SI_FL_DONT_WAKE;
+
/* This is needed only when debugging is enabled, to indicate
* client-side or server-side close. Please note that in the unlikely
* event where both sides would close at once, the sequence is reported
((ob->flags & BF_OUT_EMPTY) && !ob->to_forward) ||
si->state != SI_ST_EST)) {
out_wakeup:
- task_wakeup(si->owner, TASK_WOKEN_IO);
+ if (!(si->flags & SI_FL_DONT_WAKE) && si->owner)
+ task_wakeup(si->owner, TASK_WOKEN_IO);
}
}