Skip to content

Commit 9906472

Browse files
committed
Add SegmentListManager.update
1 parent 593d3ba commit 9906472

File tree

1 file changed

+27
-0
lines changed

1 file changed

+27
-0
lines changed

src/segment_list2.zig

+27
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ const Allocator = std.mem.Allocator;
33

44
const SearchResults = @import("common.zig").SearchResults;
55

6+
const Change = @import("change.zig").Change;
67
const SegmentId = @import("common.zig").SegmentId;
78

89
const Deadline = @import("utils/Deadline.zig");
@@ -275,6 +276,32 @@ pub fn SegmentListManager(Segment: type) type {
275276

276277
return true;
277278
}
279+
280+
pub fn update(self: *Self, changes: []const Change, lock: *std.Thread.RwLock, preCommitFn: anytype, ctx: anytype) !bool {
281+
var new_segment = try List.createSegment(self.allocator, self.options);
282+
errdefer List.destroySegment(self.allocator, &new_segment);
283+
284+
try new_segment.value.build(changes);
285+
errdefer new_segment.value.cleanup();
286+
287+
self.update_lock.lock();
288+
defer self.update_lock.unlock();
289+
290+
var new_segments_list = try self.segments.value.appendSegment(self.allocator, new_segment);
291+
errdefer new_segments_list.deinit(self.allocator);
292+
293+
var new_segments = try SharedPtr(List).create(self.allocator, new_segments_list);
294+
defer new_segments.release(self.allocator, .{self.allocator});
295+
296+
try @call(.auto, preCommitFn, .{ ctx, new_segments.value });
297+
298+
lock.lock();
299+
defer lock.unlock();
300+
301+
self.segments.swap(&new_segments);
302+
303+
return true;
304+
}
278305
};
279306
}
280307

0 commit comments

Comments
 (0)