]> git.ipfire.org Git - thirdparty/squid.git/blame - src/DelayTagged.cc
SourceFormat Enforcement
[thirdparty/squid.git] / src / DelayTagged.cc
CommitLineData
1e5562e3 1/*
bde978a6 2 * Copyright (C) 1996-2015 The Squid Software Foundation and contributors
26ac0430 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.
1e5562e3 7 */
8
bbc27441
AJ
9/* DEBUG: section 77 Delay Pools */
10
f7f3304a 11#include "squid.h"
1e5562e3 12
9a0a18de 13#if USE_DELAY_POOLS
1b76e6c1 14#include "comm/Connection.h"
1e5562e3 15#include "DelayTagged.h"
1e5562e3 16#include "NullDelayId.h"
17#include "Store.h"
18
19void *
20DelayTagged::operator new(size_t size)
21{
22 DelayPools::MemoryUsed += sizeof (DelayTagged);
23 return ::operator new (size);
24}
25
26void
27DelayTagged::operator delete (void *address)
28{
29 DelayPools::MemoryUsed -= sizeof (DelayTagged);
30 ::operator delete (address);
31}
32
1e5562e3 33DelayTagged::DelayTagged()
34{
35 DelayPools::registerForUpdates (this);
36}
37
1e4f953d 38static Splay<DelayTaggedBucket::Pointer>::SPLAYFREE DelayTaggedFree;
1e5562e3 39
40DelayTagged::~DelayTagged()
41{
42 DelayPools::deregisterForUpdates (this);
d6349cfb 43 buckets.destroy(DelayTaggedFree);
1e5562e3 44}
45
1e4f953d 46static Splay<DelayTaggedBucket::Pointer>::SPLAYCMP DelayTaggedCmp;
1e5562e3 47
48int
49DelayTaggedCmp(DelayTaggedBucket::Pointer const &left, DelayTaggedBucket::Pointer const &right)
50{
51 /* for rate limiting, case insensitive */
bb790702 52 return left->tag.caseCmp(right->tag);
1e5562e3 53}
54
55void
56DelayTaggedFree(DelayTaggedBucket::Pointer &)
57{}
58
f5dc4237
FC
59struct DelayTaggedStatsVisitor {
60 StoreEntry *sentry;
d6349cfb 61 explicit DelayTaggedStatsVisitor(StoreEntry *se): sentry(se) {}
f5dc4237
FC
62 void operator() (DelayTaggedBucket::Pointer const &current) {
63 current->stats(sentry);
64 }
65};
1e5562e3 66
67void
68DelayTagged::stats(StoreEntry * sentry)
69{
70 spec.stats (sentry, "Per Tag");
71
72 if (spec.restore_bps == -1)
73 return;
74
75 storeAppendPrintf(sentry, "\t\tCurrent: ");
76
f5dc4237 77 if (buckets.empty()) {
1e5562e3 78 storeAppendPrintf (sentry, "Not used yet.\n\n");
79 return;
80 }
81
f5dc4237
FC
82 DelayTaggedStatsVisitor visitor(sentry);
83 buckets.visit(visitor);
1e5562e3 84 storeAppendPrintf(sentry, "\n\n");
85}
86
87void
88DelayTagged::dump(StoreEntry *entry) const
89{
90 spec.dump(entry);
91}
92
26ac0430
AJ
93struct DelayTaggedUpdater {
94 DelayTaggedUpdater (DelaySpec &_spec, int _incr):spec(_spec),incr(_incr) {};
1e5562e3 95
96 DelaySpec spec;
97 int incr;
98};
99
100void
101DelayTaggedUpdateWalkee(DelayTaggedBucket::Pointer const &current, void *state)
102{
103 DelayTaggedUpdater *t = (DelayTaggedUpdater *)state;
104 /* This doesn't change the value of the DelayTaggedBucket, so is safe */
105 const_cast<DelayTaggedBucket *>(current.getRaw())->theBucket.update(t->spec, t->incr);
106}
107
d6349cfb
FC
108struct DelayTaggedUpdateVisitor {
109 DelayTaggedUpdater *updater;
110 explicit DelayTaggedUpdateVisitor(DelayTaggedUpdater *u) : updater(u) {}
111 void operator() (DelayTaggedBucket::Pointer const &current) {
112 const_cast<DelayTaggedBucket *>(current.getRaw())->theBucket.update(updater->spec, updater->incr);
113 }
114};
115
1e5562e3 116void
117DelayTagged::update(int incr)
118{
119 DelayTaggedUpdater updater(spec, incr);
d6349cfb
FC
120 DelayTaggedUpdateVisitor visitor(&updater);
121 buckets.visit(visitor);
44453ab4 122 kickReads();
1e5562e3 123}
124
125void
126DelayTagged::parse()
127{
128 spec.parse();
129}
130
131DelayIdComposite::Pointer
132
133DelayTagged::id(CompositePoolNode::CompositeSelectionDetails &details)
134{
135 if (!details.tag.size())
136 return new NullDelayId;
137
138 return new Id(this, details.tag);
139}
140
141void *
142DelayTagged::Id::operator new(size_t size)
143{
144 DelayPools::MemoryUsed += sizeof (Id);
145 return ::operator new (size);
146}
147
148void
149DelayTagged::Id::operator delete (void *address)
150{
151 DelayPools::MemoryUsed -= sizeof (Id);
152 ::operator delete (address);
153}
154
1e5562e3 155void *
156DelayTaggedBucket::operator new(size_t size)
157{
158 DelayPools::MemoryUsed += sizeof (DelayTaggedBucket);
159 return ::operator new (size);
160}
161
162void
163DelayTaggedBucket::operator delete (void *address)
164{
165 DelayPools::MemoryUsed -= sizeof (DelayTaggedBucket);
166 ::operator delete (address);
167}
168
30abd221 169DelayTaggedBucket::DelayTaggedBucket(String &aTag) : tag (aTag)
1e5562e3 170{
bf8fe701 171 debugs(77, 3, "DelayTaggedBucket::DelayTaggedBucket");
1e5562e3 172}
173
174DelayTaggedBucket::~DelayTaggedBucket()
175{
bf8fe701 176 debugs(77, 3, "DelayTaggedBucket::~DelayTaggedBucket");
1e5562e3 177}
178
179void
78b06ec5 180DelayTaggedBucket::stats(StoreEntry *entry) const
1e5562e3 181{
78b06ec5
AJ
182 storeAppendPrintf(entry, " " SQUIDSTRINGPH ":", SQUIDSTRINGPRINT(tag));
183 theBucket.stats(entry);
1e5562e3 184}
185
30abd221 186DelayTagged::Id::Id(DelayTagged::Pointer aDelayTagged, String &aTag) : theTagged(aDelayTagged)
1e5562e3 187{
188 theBucket = new DelayTaggedBucket(aTag);
189 DelayTaggedBucket::Pointer const *existing = theTagged->buckets.find(theBucket, DelayTaggedCmp);
190
191 if (existing) {
192 theBucket = *existing;
193 return;
194 }
195
196 theBucket->theBucket.init(theTagged->spec);
d6349cfb 197 theTagged->buckets.insert (theBucket, DelayTaggedCmp);
1e5562e3 198}
199
200DelayTagged::Id::~Id()
201{
bf8fe701 202 debugs(77, 3, "DelayTagged::Id::~Id");
1e5562e3 203}
204
205int
206DelayTagged::Id::bytesWanted (int min, int max) const
207{
208 return theBucket->theBucket.bytesWanted(min,max);
209}
210
211void
212DelayTagged::Id::bytesIn(int qty)
213{
214 theBucket->theBucket.bytesIn(qty);
215}
216
288d8048 217void
218DelayTagged::Id::delayRead(DeferredRead const &aRead)
219{
220 theTagged->delayRead(aRead);
221}
222
1e5562e3 223#endif
f53969cc 224