]>
git.ipfire.org Git - thirdparty/squid.git/blob - src/fde.cc
2 * Copyright (C) 1996-2020 The Squid Software Foundation and contributors
4 * Squid software is distributed under GPLv2+ license and includes
5 * contributions from numerous individuals and organizations.
6 * Please see the COPYING and CONTRIBUTORS files for details.
9 /* DEBUG: section 05 Comm */
12 #include "comm/Read.h"
17 #include "SquidTime.h"
20 fde
*fde::Table
= nullptr;
23 fde::setIo(READ_HANDLER
*reader
, WRITE_HANDLER
*writer
)
27 assert(!flags
.read_pending
); // this method is only meant for new FDs
30 writeMethod_
= writer
;
36 debugs(5, 7, "old read_pending=" << flags
.read_pending
);
38 // Some buffering readers are using external-to-them buffers (e.g., inBuf)
39 // and might leave true flags.read_pending behind without losing data. We
40 // must clear the flag here because default I/O methods do not know about it
41 // and will leave it set forever, resulting in I/O loops.
42 flags
.read_pending
= false;
44 readMethod_
= default_read_method
;
45 writeMethod_
= default_write_method
;
48 /// use I/O methods that maintain an internal-to-them buffer
50 fde::useBufferedIo(READ_HANDLER
*bufferingReader
, WRITE_HANDLER
*bufferingWriter
)
52 debugs(5, 7, "read_pending=" << flags
.read_pending
);
54 assert(bufferingReader
);
55 assert(bufferingWriter
);
56 // flags.read_pending ought to be false here, but these buffering methods
57 // can handle a stale true flag so we do not check or reset it
59 readMethod_
= bufferingReader
;
60 writeMethod_
= bufferingWriter
;
64 fde::readPending(int fdNumber
) const
66 if (type
== FD_SOCKET
)
67 return Comm::MonitorsRead(fdNumber
);
69 return read_handler
!= nullptr;
73 fde::dumpStats(StoreEntry
&dumpEntry
, int fdNumber
) const
79 storeAppendPrintf(&dumpEntry
, "%4d 0x%-8lX %-6.6s %4d %7" PRId64
"%c %7" PRId64
"%c %-21s %s\n",
83 storeAppendPrintf(&dumpEntry
, "%4d %-6.6s %4d %7" PRId64
"%c %7" PRId64
"%c %-21s %s\n",
87 timeoutHandler
? (int) (timeout
- squid_curtime
) : 0,
89 readPending(fdNumber
) ? '*' : ' ',
91 write_handler
? '*' : ' ',
97 fde::DumpStats(StoreEntry
*dumpEntry
)
99 storeAppendPrintf(dumpEntry
, "Active file descriptors:\n");
101 storeAppendPrintf(dumpEntry
, "%-4s %-10s %-6s %-4s %-7s* %-7s* %-21s %s\n",
105 storeAppendPrintf(dumpEntry
, "%-4s %-6s %-4s %-7s* %-7s* %-21s %s\n",
115 storeAppendPrintf(dumpEntry
, "---- ---------- ------ ---- -------- -------- --------------------- ------------------------------\n");
117 storeAppendPrintf(dumpEntry
, "---- ------ ---- -------- -------- --------------------- ------------------------------\n");
120 for (int i
= 0; i
< Squid_MaxFD
; ++i
) {
121 fde::Table
[i
].dumpStats(*dumpEntry
, i
);
126 fde::remoteAddr() const
128 static char buf
[MAX_IPSTRLEN
+7]; // 7 = length of ':port' strings
131 if (type
== FD_SOCKET
) {
133 snprintf(buf
, sizeof(buf
), "%s:%u", ipaddr
, remote_port
);
135 local_addr
.toUrl(buf
, sizeof(buf
)); // toHostStr does not include port.