lib/sql/src/search/cache.zig
daab053ee43316e1809a84551d573ddd1e5bf3d2
1 const std = @import("std");
2
3 const fs_io = std.Options.debug_io;
4
5 pub const Lock = struct {
6 file: std.Io.File,
7
8 pub fn acquire(root: []const u8, name: []const u8) !Lock {
9 var dir = try std.Io.Dir.openDirAbsolute(fs_io, root, .{});
10 defer dir.close(fs_io);
11 const file = try dir.createFile(fs_io, name, .{
12 .truncate = false,
13 .read = true,
14 .permissions = @fromBackingInt(@intCast(0o600)),
15 });
16 errdefer file.close(fs_io);
17 try file.lock(fs_io, .exclusive);
18 return .{ .file = file };
19 }
20
21 pub fn release(self: *Lock) void {
22 self.file.unlock(fs_io);
23 self.file.close(fs_io);
24 self.* = undefined;
25 }
26 };
27
28 test "search cache lock can be reacquired" {
29 var tmp = std.testing.tmpDir(.{});
30 defer tmp.cleanup();
31 const root = try tmp.dir.realPathFileAlloc(fs_io, ".", std.testing.allocator);
32 defer std.testing.allocator.free(root);
33 var first = try Lock.acquire(root, "search.lock");
34 first.release();
35 var second = try Lock.acquire(root, "search.lock");
36 second.release();
37 }