]>
Commit | Line | Data |
---|---|---|
528b2c61 | 1 | /* |
b8ae064d | 2 | * Copyright (C) 1996-2023 The Squid Software Foundation and contributors |
528b2c61 | 3 | * |
bbc27441 AJ |
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. | |
528b2c61 | 7 | */ |
8 | ||
ed4c6863 | 9 | /* DEBUG: section 05 Comm */ |
bbc27441 | 10 | |
582c2af2 | 11 | #include "squid.h" |
7e66d5e2 | 12 | #include "comm/Read.h" |
675b8408 | 13 | #include "debug/Stream.h" |
ef8acffa | 14 | #include "fd.h" |
528b2c61 | 15 | #include "fde.h" |
582c2af2 | 16 | #include "globals.h" |
528b2c61 | 17 | #include "Store.h" |
528b2c61 | 18 | |
a7d40d52 | 19 | fde *fde::Table = nullptr; |
f9fb22f5 | 20 | |
ed4c6863 EB |
21 | void |
22 | fde::setIo(READ_HANDLER *reader, WRITE_HANDLER *writer) | |
23 | { | |
24 | assert(reader); | |
25 | assert(writer); | |
26 | assert(!flags.read_pending); // this method is only meant for new FDs | |
27 | ||
28 | readMethod_ = reader; | |
29 | writeMethod_ = writer; | |
30 | } | |
31 | ||
32 | void | |
33 | fde::useDefaultIo() | |
34 | { | |
35 | debugs(5, 7, "old read_pending=" << flags.read_pending); | |
36 | ||
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; | |
42 | ||
43 | readMethod_ = default_read_method; | |
44 | writeMethod_ = default_write_method; | |
45 | } | |
46 | ||
47 | /// use I/O methods that maintain an internal-to-them buffer | |
48 | void | |
49 | fde::useBufferedIo(READ_HANDLER *bufferingReader, WRITE_HANDLER *bufferingWriter) | |
50 | { | |
51 | debugs(5, 7, "read_pending=" << flags.read_pending); | |
52 | ||
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 | |
57 | ||
58 | readMethod_ = bufferingReader; | |
59 | writeMethod_ = bufferingWriter; | |
60 | } | |
61 | ||
528b2c61 | 62 | bool |
a7d40d52 | 63 | fde::readPending(int fdNumber) const |
528b2c61 | 64 | { |
65 | if (type == FD_SOCKET) | |
7e66d5e2 | 66 | return Comm::MonitorsRead(fdNumber); |
62e76326 | 67 | |
a7d40d52 | 68 | return read_handler != nullptr; |
528b2c61 | 69 | } |
70 | ||
71 | void | |
a7d40d52 | 72 | fde::dumpStats(StoreEntry &dumpEntry, int fdNumber) const |
528b2c61 | 73 | { |
74 | if (!flags.open) | |
62e76326 | 75 | return; |
76 | ||
7aa9bb3e | 77 | #if _SQUID_WINDOWS_ |
c91ca3ce | 78 | storeAppendPrintf(&dumpEntry, "%4d 0x%-8lX %-6.6s %4d %7" PRId64 "%c %7" PRId64 "%c %-21s %s\n", |
74cef207 | 79 | fdNumber, |
80 | win32.handle, | |
81 | #else | |
c91ca3ce | 82 | storeAppendPrintf(&dumpEntry, "%4d %-6.6s %4d %7" PRId64 "%c %7" PRId64 "%c %-21s %s\n", |
62e76326 | 83 | fdNumber, |
74cef207 | 84 | #endif |
62e76326 | 85 | fdTypeStr[type], |
a7d40d52 | 86 | timeoutHandler ? (int) (timeout - squid_curtime) : 0, |
62e76326 | 87 | bytes_read, |
88 | readPending(fdNumber) ? '*' : ' ', | |
89 | bytes_written, | |
90 | write_handler ? '*' : ' ', | |
91 | remoteAddr(), | |
92 | desc); | |
528b2c61 | 93 | } |
94 | ||
95 | void | |
a7d40d52 | 96 | fde::DumpStats(StoreEntry *dumpEntry) |
528b2c61 | 97 | { |
528b2c61 | 98 | storeAppendPrintf(dumpEntry, "Active file descriptors:\n"); |
7aa9bb3e | 99 | #if _SQUID_WINDOWS_ |
74cef207 | 100 | storeAppendPrintf(dumpEntry, "%-4s %-10s %-6s %-4s %-7s* %-7s* %-21s %s\n", |
101 | "File", | |
102 | "Handle", | |
103 | #else | |
528b2c61 | 104 | storeAppendPrintf(dumpEntry, "%-4s %-6s %-4s %-7s* %-7s* %-21s %s\n", |
62e76326 | 105 | "File", |
74cef207 | 106 | #endif |
62e76326 | 107 | "Type", |
108 | "Tout", | |
109 | "Nread", | |
110 | "Nwrite", | |
111 | "Remote Address", | |
112 | "Description"); | |
7aa9bb3e | 113 | #if _SQUID_WINDOWS_ |
74cef207 | 114 | storeAppendPrintf(dumpEntry, "---- ---------- ------ ---- -------- -------- --------------------- ------------------------------\n"); |
115 | #else | |
528b2c61 | 116 | storeAppendPrintf(dumpEntry, "---- ------ ---- -------- -------- --------------------- ------------------------------\n"); |
74cef207 | 117 | #endif |
62e76326 | 118 | |
a7d40d52 AJ |
119 | for (int i = 0; i < Squid_MaxFD; ++i) { |
120 | fde::Table[i].dumpStats(*dumpEntry, i); | |
528b2c61 | 121 | } |
122 | } | |
123 | ||
124 | char const * | |
125 | fde::remoteAddr() const | |
126 | { | |
f5602663 | 127 | static char buf[MAX_IPSTRLEN+7]; // 7 = length of ':port' strings |
a7d40d52 AJ |
128 | *buf = 0; |
129 | ||
130 | if (type == FD_SOCKET) { | |
131 | if (*ipaddr) | |
f5602663 | 132 | snprintf(buf, sizeof(buf), "%s:%u", ipaddr, remote_port); |
a7d40d52 | 133 | else |
f5602663 | 134 | local_addr.toUrl(buf, sizeof(buf)); // toHostStr does not include port. |
a7d40d52 | 135 | } |
62e76326 | 136 | |
528b2c61 | 137 | return buf; |
138 | } | |
139 | ||
d7ca82e6 EB |
140 | void |
141 | fde::Init() | |
142 | { | |
143 | assert(!Table); | |
144 | Table = static_cast<fde *>(xcalloc(Squid_MaxFD, sizeof(fde))); | |
145 | } | |
146 |