]>
git.ipfire.org Git - thirdparty/squid.git/blob - src/fde.cc
2 * Copyright (C) 1996-2023 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"
13 #include "debug/Stream.h"
19 fde
*fde::Table
= nullptr;
22 fde::setIo(READ_HANDLER
*reader
, WRITE_HANDLER
*writer
)
26 assert(!flags
.read_pending
); // this method is only meant for new FDs
29 writeMethod_
= writer
;
35 debugs(5, 7, "old read_pending=" << flags
.read_pending
);
37 // Some buffering readers are using external-to-them buffers (e.g., inBuf)
38 // and might leave true flags.read_pending behind without losing data. We
39 // must clear the flag here because default I/O methods do not know about it
40 // and will leave it set forever, resulting in I/O loops.
41 flags
.read_pending
= false;
43 readMethod_
= default_read_method
;
44 writeMethod_
= default_write_method
;
47 /// use I/O methods that maintain an internal-to-them buffer
49 fde::useBufferedIo(READ_HANDLER
*bufferingReader
, WRITE_HANDLER
*bufferingWriter
)
51 debugs(5, 7, "read_pending=" << flags
.read_pending
);
53 assert(bufferingReader
);
54 assert(bufferingWriter
);
55 // flags.read_pending ought to be false here, but these buffering methods
56 // can handle a stale true flag so we do not check or reset it
58 readMethod_
= bufferingReader
;
59 writeMethod_
= bufferingWriter
;
63 fde::readPending(int fdNumber
) const
65 if (type
== FD_SOCKET
)
66 return Comm::MonitorsRead(fdNumber
);
68 return read_handler
!= nullptr;
72 fde::dumpStats(StoreEntry
&dumpEntry
, int fdNumber
) const
78 storeAppendPrintf(&dumpEntry
, "%4d 0x%-8lX %-6.6s %4d %7" PRId64
"%c %7" PRId64
"%c %-21s %s\n",
82 storeAppendPrintf(&dumpEntry
, "%4d %-6.6s %4d %7" PRId64
"%c %7" PRId64
"%c %-21s %s\n",
86 timeoutHandler
? (int) (timeout
- squid_curtime
) : 0,
88 readPending(fdNumber
) ? '*' : ' ',
90 write_handler
? '*' : ' ',
96 fde::DumpStats(StoreEntry
*dumpEntry
)
98 storeAppendPrintf(dumpEntry
, "Active file descriptors:\n");
100 storeAppendPrintf(dumpEntry
, "%-4s %-10s %-6s %-4s %-7s* %-7s* %-21s %s\n",
104 storeAppendPrintf(dumpEntry
, "%-4s %-6s %-4s %-7s* %-7s* %-21s %s\n",
114 storeAppendPrintf(dumpEntry
, "---- ---------- ------ ---- -------- -------- --------------------- ------------------------------\n");
116 storeAppendPrintf(dumpEntry
, "---- ------ ---- -------- -------- --------------------- ------------------------------\n");
119 for (int i
= 0; i
< Squid_MaxFD
; ++i
) {
120 fde::Table
[i
].dumpStats(*dumpEntry
, i
);
125 fde::remoteAddr() const
127 static char buf
[MAX_IPSTRLEN
+7]; // 7 = length of ':port' strings
130 if (type
== FD_SOCKET
) {
132 snprintf(buf
, sizeof(buf
), "%s:%u", ipaddr
, remote_port
);
134 local_addr
.toUrl(buf
, sizeof(buf
)); // toHostStr does not include port.
144 Table
= static_cast<fde
*>(xcalloc(Squid_MaxFD
, sizeof(fde
)));