2
2
3
3
#include " defs.h"
4
4
5
+ #if defined(PROFILE_MEMORY_ALLOCATIONS)
6
+ # include < library/cpp/monlib/dynamic_counters/counters.h>
7
+ #endif
8
+
5
9
#include < yql/essentials/utils/chunked_buffer.h>
6
10
7
11
#include < util/generic/noncopyable.h>
8
12
#include < util/stream/output.h>
9
13
#include < util/system/yassert.h>
10
14
11
- namespace NKikimr {
15
+ namespace NKikimr ::NMiniKQL {
12
16
13
- namespace NMiniKQL {
17
+ #if defined(PROFILE_MEMORY_ALLOCATIONS)
18
+ extern NMonitoring::TDynamicCounters::TCounterPtr TotalBytesWastedCounter;
19
+ void InitializeGlobalPagedBufferCounters (::NMonitoring::TDynamicCounterPtr root);
20
+ #endif
14
21
15
22
class TPagedBuffer ;
16
23
@@ -48,6 +55,10 @@ class TBufferPage : private TNonCopyable {
48
55
Size_ = 0 ;
49
56
}
50
57
58
+ inline size_t Wasted () const {
59
+ return PageCapacity - Size_;
60
+ }
61
+
51
62
private:
52
63
TBufferPage* Next_ = nullptr ;
53
64
size_t Size_ = 0 ;
@@ -75,6 +86,9 @@ class TPagedBuffer : private TNonCopyable {
75
86
76
87
~TPagedBuffer () {
77
88
if (Head_) {
89
+ auto * tailPage = TBufferPage::GetPage (Tail_);
90
+ tailPage->Size_ = TailSize_;
91
+
78
92
TBufferPage* curr = TBufferPage::GetPage (Head_);
79
93
while (curr) {
80
94
auto drop = curr;
@@ -117,7 +131,6 @@ class TPagedBuffer : private TNonCopyable {
117
131
}
118
132
119
133
inline size_t Size () const {
120
- // + (Tail_ ? TailSize_ : 0);
121
134
size_t sizeWithReserve = ClosedPagesSize_ + ((-size_t (Tail_ != nullptr )) & TailSize_);
122
135
Y_DEBUG_ABORT_UNLESS (sizeWithReserve >= HeadReserve_);
123
136
return sizeWithReserve - HeadReserve_;
@@ -171,26 +184,35 @@ class TPagedBuffer : private TNonCopyable {
171
184
}
172
185
173
186
inline void Clear () {
187
+ // TODO: not wasted or never called?
174
188
Tail_ = Head_;
175
189
ClosedPagesSize_ = HeadReserve_ = 0 ;
176
- // = Tail_ ? 0 : TBufferPage::PageAllocSize;
177
190
TailSize_ = (-size_t (Tail_ == nullptr )) & TBufferPage::PageCapacity;
178
191
}
179
192
180
193
inline void EraseBack (size_t len) {
181
194
Y_DEBUG_ABORT_UNLESS (Tail_ && TailSize_ >= len);
182
195
TailSize_ -= len;
196
+ #if defined(PROFILE_MEMORY_ALLOCATIONS)
197
+ TotalBytesWastedCounter->Add (len);
198
+ #endif
183
199
}
184
200
185
201
inline void Advance (size_t len) {
186
202
if (Y_LIKELY (TailSize_ + len <= TBufferPage::PageCapacity)) {
187
203
TailSize_ += len;
204
+ #if defined(PROFILE_MEMORY_ALLOCATIONS)
205
+ TotalBytesWastedCounter->Sub (len);
206
+ #endif
188
207
return ;
189
208
}
190
209
191
210
MKQL_ENSURE (len <= TBufferPage::PageCapacity, " Advance() size too big" );
192
211
AppendPage ();
193
212
TailSize_ = len;
213
+ #if defined(PROFILE_MEMORY_ALLOCATIONS)
214
+ TotalBytesWastedCounter->Sub (len);
215
+ #endif
194
216
}
195
217
196
218
inline void Append (char c) {
@@ -211,6 +233,9 @@ class TPagedBuffer : private TNonCopyable {
211
233
TailSize_ += chunk;
212
234
data += chunk;
213
235
size -= chunk;
236
+ #if defined(PROFILE_MEMORY_ALLOCATIONS)
237
+ TotalBytesWastedCounter->Sub (chunk);
238
+ #endif
214
239
}
215
240
}
216
241
@@ -227,6 +252,4 @@ class TPagedBuffer : private TNonCopyable {
227
252
size_t ClosedPagesSize_ = 0 ;
228
253
};
229
254
230
- } // NMiniKQL
231
-
232
- } // NKikimr
255
+ } // namespace NKikimr::NMiniKQL
0 commit comments