/*
- * Copyright (C) 1996-2016 The Squid Software Foundation and contributors
+ * Copyright (C) 1996-2020 The Squid Software Foundation and contributors
*
* Squid software is distributed under GPLv2+ license and includes
* contributions from numerous individuals and organizations.
#define CLIENT_DB_HASH_SIZE 467
#endif
-static ClientInfo *
+ClientInfo::ClientInfo(const Ip::Address &ip) :
+#if USE_DELAY_POOLS
+ BandwidthBucket(0, 0, 0),
+#endif
+ addr(ip),
+ n_established(0),
+ last_seen(0)
+#if USE_DELAY_POOLS
+ , writeLimitingActive(false),
+ firstTimeConnection(true),
+ quotaQueue(nullptr),
+ rationedQuota(0),
+ rationedCount(0),
+ eventWaiting(false)
+#endif
+{
+ debugs(77, 9, "ClientInfo constructed, this=" << static_cast<void*>(this));
+ char *buf = static_cast<char*>(xmalloc(MAX_IPSTRLEN)); // becomes hash.key
+ key = addr.toStr(buf,MAX_IPSTRLEN);
+}
+static ClientInfo *
clientdbAdd(const Ip::Address &addr)
{
- ClientInfo *c;
- char *buf = static_cast<char*>(xmalloc(MAX_IPSTRLEN)); // becomes hash.key
- c = (ClientInfo *)memAllocate(MEM_CLIENT_INFO);
- debugs(77, 9, "ClientInfo constructed, this=" << c);
- c->hash.key = addr.toStr(buf,MAX_IPSTRLEN);
- c->addr = addr;
-#if USE_DELAY_POOLS
- /* setup default values for client write limiter */
- c->writeLimitingActive=false;
- c->writeSpeedLimit=0;
- c->bucketSize = 0;
- c->firstTimeConnection=true;
- c->quotaQueue = NULL;
- c->rationedQuota = 0;
- c->rationedCount = 0;
- c->selectWaiting = false;
- c->eventWaiting = false;
-
- /* get current time */
- getCurrentTime();
- c->prevTime=current_dtime;/* put current time to have something sensible here */
-#endif
- hash_join(client_table, &c->hash);
+ ClientInfo *c = new ClientInfo(addr);
+ hash_join(client_table, static_cast<hash_link*>(c));
++statCounter.client_http.clients;
if ((statCounter.client_http.clients > max_clients) && !cleanup_running && cleanup_scheduled < 2) {
clientdbDump(StoreEntry * sentry)
{
const char *name;
- ClientInfo *c;
int icp_total = 0;
int icp_hits = 0;
int http_total = 0;
storeAppendPrintf(sentry, "Cache Clients:\n");
hash_first(client_table);
- while ((c = (ClientInfo *) hash_next(client_table))) {
- storeAppendPrintf(sentry, "Address: %s\n", hashKeyStr(&c->hash));
+ while (hash_link *hash = hash_next(client_table)) {
+ const ClientInfo *c = static_cast<const ClientInfo *>(hash);
+ storeAppendPrintf(sentry, "Address: %s\n", hashKeyStr(hash));
if ( (name = fqdncache_gethostbyaddr(c->addr, 0)) ) {
storeAppendPrintf(sentry, "Name: %s\n", name);
}
clientdbFreeItem(void *data)
{
ClientInfo *c = (ClientInfo *)data;
- safe_free(c->hash.key);
+ delete c;
+}
+
+ClientInfo::~ClientInfo()
+{
+ safe_free(key);
#if USE_DELAY_POOLS
- if (CommQuotaQueue *q = c->quotaQueue) {
+ if (CommQuotaQueue *q = quotaQueue) {
q->clientInfo = NULL;
delete q; // invalidates cbdata, cancelling any pending kicks
}
#endif
- debugs(77, 9, "ClientInfo destructed, this=" << c);
- memFree(c, MEM_CLIENT_INFO);
+ debugs(77, 9, "ClientInfo destructed, this=" << static_cast<void*>(this));
}
void
if (age < 60)
continue;
- hash_remove_link(client_table, &c->hash);
+ hash_remove_link(client_table, static_cast<hash_link*>(c));
clientdbFreeItem(c);
Ip::Address *
client_entry(Ip::Address *current)
{
- ClientInfo *c = NULL;
char key[MAX_IPSTRLEN];
+ hash_first(client_table);
if (current) {
current->toStr(key,MAX_IPSTRLEN);
- hash_first(client_table);
- while ((c = (ClientInfo *) hash_next(client_table))) {
- if (!strcmp(key, hashKeyStr(&c->hash)))
+ while (hash_link *hash = hash_next(client_table)) {
+ if (!strcmp(key, hashKeyStr(hash)))
break;
}
-
- c = (ClientInfo *) hash_next(client_table);
- } else {
- hash_first(client_table);
- c = (ClientInfo *) hash_next(client_table);
}
- hash_last(client_table);
+ ClientInfo *c = static_cast<ClientInfo *>(hash_next(client_table));
- if (c)
- return (&c->addr);
- else
- return (NULL);
+ hash_last(client_table);
+ return c ? &c->addr : nullptr;
}
variable_list *