Skip to content

Commit fb5a9bc

Browse files
committed
SharedPtr refactoring
1 parent c496621 commit fb5a9bc

5 files changed

+12
-21
lines changed

src/Index.zig

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ const FileSegment = @import("FileSegment.zig");
2323
const FileSegmentList = SegmentList(FileSegment);
2424
const FileSegmentNode = FileSegmentList.Node;
2525

26-
const SharedPtr = @import("utils/smartptr.zig").SharedPtr;
26+
const SharedPtr = @import("utils/shared_ptr.zig").SharedPtr;
2727

2828
const SegmentMerger = @import("segment_merger.zig").SegmentMerger;
2929

src/segment_list.zig

+5-5
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ const SegmentInfo = @import("segment.zig").SegmentInfo;
99

1010
const Deadline = @import("utils/Deadline.zig");
1111

12-
const SharedPtr = @import("utils/smartptr.zig").SharedPtr;
12+
const SharedPtr = @import("utils/shared_ptr.zig").SharedPtr;
1313
const TieredMergePolicy = @import("segment_merge_policy.zig").TieredMergePolicy;
1414
const SegmentMerger = @import("segment_merger.zig").SegmentMerger;
1515

@@ -51,7 +51,7 @@ pub fn SegmentList(Segment: type) type {
5151

5252
pub fn deinit(self: *Self, allocator: Allocator, delete_files: KeepOrDelete) void {
5353
for (self.nodes.items) |*node| {
54-
node.release(allocator, .{delete_files});
54+
node.release(allocator, Segment.deinit, .{delete_files});
5555
}
5656
self.nodes.deinit(allocator);
5757
}
@@ -61,11 +61,11 @@ pub fn SegmentList(Segment: type) type {
6161
}
6262

6363
pub fn destroySegment(allocator: Allocator, segment: *Node) void {
64-
segment.release(allocator, .{.delete});
64+
segment.release(allocator, Segment.deinit, .{.delete});
6565
}
6666

6767
pub fn destroySegments(allocator: Allocator, segments: *SharedPtr(Self)) void {
68-
segments.release(allocator, .{ allocator, .delete });
68+
segments.release(allocator, Self.deinit, .{ allocator, .delete });
6969
}
7070

7171
pub fn appendSegmentInto(self: Self, copy: *Self, node: Node) void {
@@ -173,7 +173,7 @@ pub fn SegmentListManager(Segment: type) type {
173173
}
174174

175175
pub fn deinit(self: *Self, allocator: Allocator, delete_files: KeepOrDelete) void {
176-
self.segments.release(allocator, .{ allocator, delete_files });
176+
self.segments.release(allocator, List.deinit, .{ allocator, delete_files });
177177
}
178178

179179
pub fn count(self: Self) usize {

src/segment_merge_policy.zig

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
const std = @import("std");
22
const log = std.log.scoped(.segment_merge_policy);
33

4-
const SharedPtr = @import("utils/smartptr.zig").SharedPtr;
4+
const SharedPtr = @import("utils/shared_ptr.zig").SharedPtr;
55

66
// This code is largely based on Michael McCandless' TieredMergePolicy from Lucene:
77
// https://issues.apache.org/jira/browse/LUCENE-854

src/segment_merger.zig

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ const common = @import("common.zig");
44
const Item = common.Item;
55
const SegmentInfo = @import("segment.zig").SegmentInfo;
66

7-
const SharedPtr = @import("utils/smartptr.zig").SharedPtr;
7+
const SharedPtr = @import("utils/shared_ptr.zig").SharedPtr;
88
const SegmentList = @import("segment_list.zig").SegmentList;
99

1010
pub const MergedSegmentInfo = struct {

src/utils/smartptr.zig src/utils/shared_ptr.zig

+4-13
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,13 @@ pub fn RefCounter(comptime T: type) type {
1414
};
1515
}
1616

17+
// Increases the reference count.
1718
pub fn incr(self: *Self) void {
1819
const prev_ref_count = self.refs.fetchAdd(1, .monotonic);
1920
std.debug.assert(prev_ref_count > 0);
2021
}
2122

23+
// Decreases the reference count and returns true if it reached zero.
2224
pub fn decr(self: *Self) bool {
2325
const prev_ref_count = self.refs.fetchSub(1, .monotonic);
2426
if (prev_ref_count == 1) {
@@ -60,21 +62,10 @@ pub fn SharedPtr(comptime T: type) type {
6062
return .{ .value = &inner_ptr.value };
6163
}
6264

63-
pub fn release(self: *Self, allocator: Allocator, deinit_args: anytype) void {
65+
pub fn release(self: *Self, allocator: Allocator, cleanupFn: anytype, cleanup_args: anytype) void {
6466
const inner_ptr = self.getInnerPtr();
6567
if (inner_ptr.refs.decr()) {
66-
if (std.meta.hasMethod(T, "deinit")) {
67-
@call(.auto, T.deinit, .{&inner_ptr.value} ++ deinit_args);
68-
}
69-
allocator.destroy(inner_ptr);
70-
self.value = undefined;
71-
}
72-
}
73-
74-
pub fn releaseWithCleanup(self: *Self, allocator: Allocator, cleanupFn: anytype, extra_args: anytype) void {
75-
const inner_ptr = self.getInnerPtr();
76-
if (inner_ptr.refs.decr()) {
77-
@call(.auto, cleanupFn, .{&inner_ptr.value} ++ extra_args);
68+
@call(.auto, cleanupFn, .{&inner_ptr.value} ++ cleanup_args);
7869
allocator.destroy(inner_ptr);
7970
self.value = undefined;
8071
}

0 commit comments

Comments
 (0)