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 }