-#include "config.h"
+/*
+ * Copyright (C) 1996-2021 The Squid Software Foundation and contributors
+ *
+ * Squid software is distributed under GPLv2+ license and includes
+ * contributions from numerous individuals and organizations.
+ * Please see the COPYING and CONTRIBUTORS files for details.
+ */
+
+#include "squid.h"
#include "ClientInfo.h"
+#include "comm/Connection.h"
#include "comm/IoCallback.h"
+#include "comm/Loops.h"
#include "comm/Write.h"
#include "CommCalls.h"
#include "fde.h"
+#include "globals.h"
Comm::CbEntry *Comm::iocb_table;
{
// XXX: convert this to a std::map<> ?
iocb_table = static_cast<CbEntry*>(xcalloc(Squid_MaxFD, sizeof(CbEntry)));
- for (int pos = 0; pos < Squid_MaxFD; pos++) {
+ for (int pos = 0; pos < Squid_MaxFD; ++pos) {
iocb_table[pos].fd = pos;
- iocb_table[pos].readcb.fd = pos;
iocb_table[pos].readcb.type = IOCB_READ;
- iocb_table[pos].writecb.fd = pos;
iocb_table[pos].writecb.type = IOCB_WRITE;
}
}
void
Comm::CallbackTableDestruct()
{
+ // release any Comm::Connections being held.
+ for (int pos = 0; pos < Squid_MaxFD; ++pos) {
+ iocb_table[pos].readcb.conn = NULL;
+ iocb_table[pos].writecb.conn = NULL;
+ }
safe_free(iocb_table);
}
void
Comm::IoCallback::selectOrQueueWrite()
{
-#if DELAY_POOLS
- // stand in line if there is one
- if (ClientInfo *clientInfo = fd_table[fd].clientInfo) {
- if (clientInfo->writeLimitingActive) {
- quotaQueueReserv = clientInfo->quotaEnqueue(fd);
- clientInfo->kickQuotaQueue();
- return;
- }
+#if USE_DELAY_POOLS
+ if (BandwidthBucket *bucket = BandwidthBucket::SelectBucket(&fd_table[conn->fd])) {
+ bucket->scheduleWrite(this);
+ return;
}
#endif
- commSetSelect(fd, COMM_SELECT_WRITE, Comm::HandleWrite, this, 0);
+ SetSelect(conn->fd, COMM_SELECT_WRITE, Comm::HandleWrite, this, 0);
}
void
void
Comm::IoCallback::reset()
{
+ conn = NULL;
if (freefunc) {
freefunc(buf);
buf = NULL;
}
xerrno = 0;
-#if DELAY_POOLS
+#if USE_DELAY_POOLS
quotaQueueReserv = 0;
#endif
}
// Schedule the callback call and clear the callback
void
-Comm::IoCallback::finish(comm_err_t code, int xerrn)
+Comm::IoCallback::finish(Comm::Flag code, int xerrn)
{
- debugs(5, 3, HERE << "called for FD " << fd << " (" << code << ", " << xerrno << ")");
+ debugs(5, 3, "called for " << conn << " (" << code << ", " << xerrn << ")");
assert(active());
/* free data */
- if (freefunc) {
+ if (freefunc && buf) {
freefunc(buf);
buf = NULL;
freefunc = NULL;
if (callback != NULL) {
typedef CommIoCbParams Params;
Params ¶ms = GetCommParams<Params>(callback);
- params.fd = fd;
+ if (conn != NULL) params.fd = conn->fd; // for legacy write handlers...
+ params.conn = conn;
params.buf = buf;
params.size = offset;
params.flag = code;
/* Reset for next round. */
reset();
}
+