@@ -50,7 +50,7 @@ pub fn SegmentList(Segment: type) type {
50
50
51
51
pub fn deinit (self : * Self , allocator : Allocator ) void {
52
52
for (self .nodes .items ) | * node | {
53
- destroySegment (allocator , node );
53
+ node . release (allocator , .{} );
54
54
}
55
55
self .nodes .deinit (allocator );
56
56
}
@@ -59,8 +59,26 @@ pub fn SegmentList(Segment: type) type {
59
59
return Node .create (allocator , @call (.auto , Segment .init , .{ allocator , options }));
60
60
}
61
61
62
- pub fn destroySegment (allocator : Allocator , node : * Node ) void {
63
- node .release (allocator , .{});
62
+ pub fn destroySegment (allocator : Allocator , segment : * Node ) void {
63
+ segment .releaseWithCleanup (allocator , destroySegmentCallback , .{});
64
+ }
65
+
66
+ pub fn destroySegments (allocator : Allocator , segments : * SharedPtr (Self )) void {
67
+ // we also call cleanup on these segments, to ensure that unused segments will get deleted from disk
68
+ segments .releaseWithCleanup (allocator , destroySegmentListCallback , .{allocator });
69
+ }
70
+
71
+ fn destroySegmentListCallback (segments : * Self , allocator : Allocator ) void {
72
+ while (segments .nodes .items .len > 0 ) {
73
+ var node = segments .nodes .pop ();
74
+ destroySegment (allocator , & node );
75
+ }
76
+ segments .deinit (allocator );
77
+ }
78
+
79
+ fn destroySegmentCallback (segment : * Segment ) void {
80
+ segment .cleanup ();
81
+ segment .deinit ();
64
82
}
65
83
66
84
pub fn appendSegmentInto (self : Self , copy : * Self , node : Node ) void {
@@ -190,7 +208,7 @@ pub fn SegmentListManager(Segment: type) type {
190
208
}
191
209
192
210
pub fn deinit (self : * Self ) void {
193
- self .releaseSegments ( & self .segments );
211
+ self .segments . release ( self .allocator , .{ self . allocator } );
194
212
}
195
213
196
214
pub fn count (self : Self ) usize {
@@ -204,8 +222,8 @@ pub fn SegmentListManager(Segment: type) type {
204
222
return self .segments .acquire ();
205
223
}
206
224
207
- fn releaseSegments (self : * Self , segments : * SharedPtr (List )) void {
208
- segments . release (self .allocator , .{ self . allocator } );
225
+ fn destroySegments (self : * Self , segments : * SharedPtr (List )) void {
226
+ List . destroySegments (self .allocator , segments );
209
227
}
210
228
211
229
pub fn needsMerge (self : Self ) bool {
@@ -214,7 +232,7 @@ pub fn SegmentListManager(Segment: type) type {
214
232
215
233
pub fn prepareMerge (self : * Self ) ! ? Update {
216
234
var segments = self .acquireSegments ();
217
- defer self .releaseSegments (& segments );
235
+ defer self .destroySegments (& segments );
218
236
219
237
self .num_allowed_segments .store (self .merge_policy .calculateBudget (segments .value .nodes .items ), .release );
220
238
if (! self .needsMerge ()) {
@@ -289,23 +307,5 @@ pub fn SegmentListManager(Segment: type) type {
289
307
}
290
308
self .destroySegments (& update .segments );
291
309
}
292
-
293
- pub fn destroySegments (self : * Self , segments : * SharedPtr (List )) void {
294
- // we also call cleanup on these segments, to ensure that unused segments will get deleted from disk
295
- segments .releaseWithCleanup (self .allocator , destroySegmentList , .{self .allocator });
296
- }
297
-
298
- fn destroySegmentList (segments : * List , allocator : Allocator ) void {
299
- while (segments .nodes .items .len > 0 ) {
300
- var node = segments .nodes .pop ();
301
- node .releaseWithCleanup (allocator , destroySegment , .{});
302
- }
303
- segments .deinit (allocator );
304
- }
305
-
306
- fn destroySegment (segment : * Segment ) void {
307
- segment .cleanup ();
308
- segment .deinit ();
309
- }
310
310
};
311
311
}
0 commit comments