-#include "adaptation/icap/History.h"
+/*
+ * Copyright (C) 1996-2023 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 "adaptation/icap/History.h"
+#include "debug/Stream.h"
#include "globals.h"
-#include "SquidTime.h"
-
-Adaptation::Icap::History::History(): mergeOfIcapHeaders(hoRequest),
- lastIcapHeader(hoRequest), logType(LOG_TAG_NONE), req_sz(0),
- pastTime(0), concurrencyLevel(0)
-{
-}
-
-Adaptation::Icap::History::History(const Adaptation::Icap::History& ih)
-{
- assign(ih);
-}
-
-Adaptation::Icap::History::~History()
-{
- mergeOfIcapHeaders.clean();
- lastIcapHeader.clean();
- rfc931.clean();
-#if USE_SSL
- ssluser.clean();
-#endif
- log_uri.clean();
-}
-
-void Adaptation::Icap::History::assign(const Adaptation::Icap::History& ih)
-{
- mergeOfIcapHeaders.clean();
- mergeOfIcapHeaders.update(&ih.mergeOfIcapHeaders, NULL);
- lastIcapHeader.clean();
- lastIcapHeader.update(&ih.lastIcapHeader, NULL);
- rfc931 = ih.rfc931;
-
-#if USE_SSL
- ssluser = ih.ssluser;
-#endif
-
- logType = ih.logType;
- log_uri = ih.log_uri;
- req_sz = ih.req_sz;
- pastTime = ih.pastTime;
- currentStart = ih.currentStart;
- concurrencyLevel = ih.concurrencyLevel;
- debugs(93,7, HERE << this << " = " << &ih);
-}
-
-Adaptation::Icap::History& Adaptation::Icap::History::operator=(const History& ih)
-{
- if (this != &ih)
- assign(ih);
- return *this;
-}
+#include "time/gadgets.h"
-void Adaptation::Icap::History::setIcapLastHeader(const HttpHeader * lih)
+Adaptation::Icap::History::History():
+ req_sz(0),
+ concurrencyLevel(0)
{
- lastIcapHeader.clean();
- lastIcapHeader.update(lih, NULL);
+ memset(¤tStart, 0, sizeof(currentStart));
+ memset(&pastTime, 0, sizeof(pastTime));
}
-void Adaptation::Icap::History::mergeIcapHeaders(const HttpHeader * lih)
-{
- mergeOfIcapHeaders.update(lih, NULL);
- mergeOfIcapHeaders.compact();
-}
-
-void Adaptation::Icap::History::start(const char *context)
+void Adaptation::Icap::History::start(const char *context)
{
if (!concurrencyLevel++)
currentStart = current_time;
- debugs(93,4, HERE << "start " << context << " level=" << concurrencyLevel
- << " time=" << pastTime << ' ' << this);
+ debugs(93,4, "start " << context << " level=" << concurrencyLevel
+ << " time=" << tvToMsec(pastTime) << ' ' << this);
}
-void Adaptation::Icap::History::stop(const char *context)
+void Adaptation::Icap::History::stop(const char *context)
{
if (!concurrencyLevel) {
- debugs(93,1, HERE << "Internal error: poor history accounting " << this);
+ debugs(93, DBG_IMPORTANT, "ERROR: Squid BUG: poor history accounting " << this);
return;
}
- const int current = currentTime();
- debugs(93,4, HERE << "stop " << context << " level=" << concurrencyLevel <<
- " time=" << pastTime << '+' << current << ' ' << this);
-
+ struct timeval current;
+ currentTime(current);
+ debugs(93,4, "stop " << context << " level=" << concurrencyLevel <<
+ " time=" << tvToMsec(pastTime) << '+' << tvToMsec(current) << ' ' << this);
+
if (!--concurrencyLevel)
- pastTime += current;
+ tvAssignAdd(pastTime, current);
}
-int Adaptation::Icap::History::processingTime() const
+void
+Adaptation::Icap::History::processingTime(timeval &total) const
{
- const int total = pastTime + currentTime();
- debugs(93,7, HERE << " current total: " << total << ' ' << this);
- return total;
+ currentTime(total);
+ tvAssignAdd(total, pastTime);
+ debugs(93,7, " current total: " << tvToMsec(total) << ' ' << this);
}
-int Adaptation::Icap::History::currentTime() const
+void
+Adaptation::Icap::History::currentTime(timeval ¤t) const
{
- return concurrencyLevel > 0 ?
- max(0, tvSubMsec(currentStart, current_time)) : 0;
+ if (concurrencyLevel > 0)
+ tvSub(current, currentStart, current_time);
+ else {
+ current.tv_sec = 0;
+ current.tv_usec = 0;
+ }
}
+