]> git.ipfire.org Git - thirdparty/squid.git/blame - src/DelayTagged.cc
Interim: removed needless spacing and c++ guards, started fixing DelayTagged accessin...
[thirdparty/squid.git] / src / DelayTagged.cc
CommitLineData
1e5562e3 1/*
bbc27441 2 * Copyright (C) 1996-2014 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);
f5dc4237 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;
61 explicit DelayTaggedStatsVisitor(StoreEntry *se) sentry(se) {}
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
108void
109DelayTagged::update(int incr)
110{
111 DelayTaggedUpdater updater(spec, incr);
112 buckets.head->walk (DelayTaggedUpdateWalkee, &updater);
44453ab4 113 kickReads();
1e5562e3 114}
115
116void
117DelayTagged::parse()
118{
119 spec.parse();
120}
121
122DelayIdComposite::Pointer
123
124DelayTagged::id(CompositePoolNode::CompositeSelectionDetails &details)
125{
126 if (!details.tag.size())
127 return new NullDelayId;
128
129 return new Id(this, details.tag);
130}
131
132void *
133DelayTagged::Id::operator new(size_t size)
134{
135 DelayPools::MemoryUsed += sizeof (Id);
136 return ::operator new (size);
137}
138
139void
140DelayTagged::Id::operator delete (void *address)
141{
142 DelayPools::MemoryUsed -= sizeof (Id);
143 ::operator delete (address);
144}
145
1e5562e3 146void *
147DelayTaggedBucket::operator new(size_t size)
148{
149 DelayPools::MemoryUsed += sizeof (DelayTaggedBucket);
150 return ::operator new (size);
151}
152
153void
154DelayTaggedBucket::operator delete (void *address)
155{
156 DelayPools::MemoryUsed -= sizeof (DelayTaggedBucket);
157 ::operator delete (address);
158}
159
30abd221 160DelayTaggedBucket::DelayTaggedBucket(String &aTag) : tag (aTag)
1e5562e3 161{
bf8fe701 162 debugs(77, 3, "DelayTaggedBucket::DelayTaggedBucket");
1e5562e3 163}
164
165DelayTaggedBucket::~DelayTaggedBucket()
166{
bf8fe701 167 debugs(77, 3, "DelayTaggedBucket::~DelayTaggedBucket");
1e5562e3 168}
169
170void
78b06ec5 171DelayTaggedBucket::stats(StoreEntry *entry) const
1e5562e3 172{
78b06ec5
AJ
173 storeAppendPrintf(entry, " " SQUIDSTRINGPH ":", SQUIDSTRINGPRINT(tag));
174 theBucket.stats(entry);
1e5562e3 175}
176
30abd221 177DelayTagged::Id::Id(DelayTagged::Pointer aDelayTagged, String &aTag) : theTagged(aDelayTagged)
1e5562e3 178{
179 theBucket = new DelayTaggedBucket(aTag);
180 DelayTaggedBucket::Pointer const *existing = theTagged->buckets.find(theBucket, DelayTaggedCmp);
181
182 if (existing) {
183 theBucket = *existing;
184 return;
185 }
186
187 theBucket->theBucket.init(theTagged->spec);
188 theTagged->buckets.head = theTagged->buckets.head->insert (theBucket, DelayTaggedCmp);
189}
190
191DelayTagged::Id::~Id()
192{
bf8fe701 193 debugs(77, 3, "DelayTagged::Id::~Id");
1e5562e3 194}
195
196int
197DelayTagged::Id::bytesWanted (int min, int max) const
198{
199 return theBucket->theBucket.bytesWanted(min,max);
200}
201
202void
203DelayTagged::Id::bytesIn(int qty)
204{
205 theBucket->theBucket.bytesIn(qty);
206}
207
288d8048 208void
209DelayTagged::Id::delayRead(DeferredRead const &aRead)
210{
211 theTagged->delayRead(aRead);
212}
213
1e5562e3 214#endif
f53969cc 215