diff options
| author | Nathan Reiner <nathan@nathanreiner.xyz> | 2025-11-17 09:57:09 +0100 |
|---|---|---|
| committer | Nathan Reiner <nathan@nathanreiner.xyz> | 2025-11-17 09:57:09 +0100 |
| commit | e95cf5c7b6a08eb560763d5167fbddc1c2117bcc (patch) | |
| tree | 2f7815c9f39328fcaced2113de727f63e4837fa3 /src/storage/session-manager/root.zig | |
| parent | 0016aaa197697ec5ff38dfb3f63ac8b6f74b48e0 (diff) | |
add file uploading and multi-threading
Diffstat (limited to 'src/storage/session-manager/root.zig')
| -rw-r--r-- | src/storage/session-manager/root.zig | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/src/storage/session-manager/root.zig b/src/storage/session-manager/root.zig index 7f44bf0..d0e1441 100644 --- a/src/storage/session-manager/root.zig +++ b/src/storage/session-manager/root.zig @@ -11,8 +11,12 @@ pub const empty: Self = .{ }; cache: std.StringHashMapUnmanaged(Session), +rw_lock: std.Thread.RwLock = .{}, pub fn add(self: *Self, storage: *Storage, info: Storage.User.Info) !*Session { + self.rw_lock.lock(); + defer self.rw_lock.unlock(); + const session = try Session.init(storage.allocator, info); errdefer session.deinit(storage.allocator); try self.cache.put(storage.allocator, session.fingerprint, session); @@ -20,7 +24,12 @@ pub fn add(self: *Self, storage: *Storage, info: Storage.User.Info) !*Session { } pub fn renew(self: *Self, storage: *Storage, fingerprint: []const u8) !*Session { + self.rw_lock.lockShared(); if (self.cache.get(fingerprint)) |s| { + self.rw_lock.unlockShared(); + self.rw_lock.lock(); + defer self.rw_lock.unlock(); + var session = s; try session.reset(); @@ -29,24 +38,34 @@ pub fn renew(self: *Self, storage: *Storage, fingerprint: []const u8) !*Session _ = self.cache.remove(fingerprint); return self.cache.getPtr(session.fingerprint) orelse unreachable; + } else { + self.rw_lock.unlockShared(); } return error.SessionNotFound; } pub fn remove(self: *Self, storage: *Storage, fingerprint: []const u8) void { + self.rw_lock.lockShared(); if (self.cache.getPtr(fingerprint)) |session| { + self.rw_lock.unlockShared(); + self.rw_lock.lock(); + defer self.rw_lock.unlock(); + session.deinit(storage.allocator); _ = self.cache.remove(fingerprint); + } else { + self.rw_lock.unlockShared(); } } pub fn get(self: *Self, storage: *Storage, fingerprint: []const u8) ?*Session { + self.rw_lock.lockShared(); + defer self.rw_lock.unlockShared(); if (self.cache.getPtr(fingerprint)) |session| { const now = std.time.Instant.now() catch return null; const since = now.since(session.age); if (since > config.session_expires_after) { - std.debug.print("here\n", .{}); session.deinit(storage.allocator); _ = self.cache.remove(fingerprint); return null; |