118
Connection() : len (0), buf ((char *)xmalloc(SQUID_TCP_SO_RCVBUF)), size_ptr(NULL) {}
119
Connection() : len (0), buf ((char *)xmalloc(SQUID_TCP_SO_RCVBUF)), size_ptr(NULL), delayedLoops(0),
120
readPending(NULL), readPendingFunc(NULL) {}
137
139
int64_t *size_ptr; /* pointer to size in an ConnStateData for logging */
139
141
Comm::ConnectionPointer conn; ///< The currently connected connection.
142
uint8_t delayedLoops; ///< how many times a read on this connection has been postponed.
144
// XXX: make these an AsyncCall when event API can handle them
145
TunnelStateData *readPending;
146
EVH *readPendingFunc;
142
148
#if USE_DELAY_POOLS
210
216
static CLCB tunnelClientClosed;
211
217
static CTCB tunnelTimeout;
212
218
static PSC tunnelPeerSelectComplete;
219
static EVH tunnelDelayedClientRead;
220
static EVH tunnelDelayedServerRead;
213
221
static void tunnelConnected(const Comm::ConnectionPointer &server, void *);
214
222
static void tunnelRelayConnectRequest(const Comm::ConnectionPointer &server, void *);
262
270
connectReqWriting(false)
264
272
debugs(26, 3, "TunnelStateData constructed this=" << this);
273
client.readPendingFunc = &tunnelDelayedClientRead;
274
server.readPendingFunc = &tunnelDelayedServerRead;
267
277
TunnelStateData::~TunnelStateData()
331
344
TunnelStateData::readServer(char *, size_t len, Comm::Flag errcode, int xerrno)
333
346
debugs(26, 3, HERE << server.conn << ", read " << len << " bytes, err=" << errcode);
347
server.delayedLoops=0;
336
350
* Bail out early on Comm::ERR_CLOSING
476
490
TunnelStateData::readClient(char *, size_t len, Comm::Flag errcode, int xerrno)
478
492
debugs(26, 3, HERE << client.conn << ", read " << len << " bytes, err=" << errcode);
493
client.delayedLoops=0;
481
496
* Bail out early on Comm::ERR_CLOSING
695
tunnelDelayedClientRead(void *data)
699
TunnelStateData *tunnel = static_cast<TunnelStateData*>(data);
702
tunnel->client.readPending = NULL;
703
static uint64_t counter=0;
704
debugs(26, 7, "Client read(2) delayed " << ++counter << " times");
705
tunnel->copyRead(tunnel->client, TunnelStateData::ReadClient);
709
tunnelDelayedServerRead(void *data)
713
TunnelStateData *tunnel = static_cast<TunnelStateData*>(data);
716
tunnel->server.readPending = NULL;
717
static uint64_t counter=0;
718
debugs(26, 7, "Server read(2) delayed " << ++counter << " times");
719
tunnel->copyRead(tunnel->server, TunnelStateData::ReadServer);
680
723
TunnelStateData::copyRead(Connection &from, IOCB *completion)
682
725
assert(from.len == 0);
726
// If only the minimum permitted read size is going to be attempted
727
// then we schedule an event to try again in a few I/O cycles.
728
// Allow at least 1 byte to be read every (0.3*10) seconds.
729
int bw = from.bytesWanted(1, SQUID_TCP_SO_RCVBUF);
730
if (bw == 1 && ++from.delayedLoops < 10) {
731
from.readPending = this;
732
eventAdd("tunnelDelayedServerRead", from.readPendingFunc, from.readPending, 0.3, true);
683
736
AsyncCall::Pointer call = commCbCall(5,4, "TunnelBlindCopyReadHandler",
684
737
CommIoCbPtrFun(completion, this));
685
comm_read(from.conn, from.buf, from.bytesWanted(1, SQUID_TCP_SO_RCVBUF), call);
738
comm_read(from.conn, from.buf, bw, call);
967
1020
if (CachePeer *p = srv->getPeer()) {
1021
if (p->secure.encryptTransport) {
969
1022
AsyncCall::Pointer callback = asyncCall(5,4,
970
1023
"TunnelStateData::ConnectedToPeer",
971
1024
MyAnswerDialer(&TunnelStateData::connectedToPeer, this));