aboutsummaryrefslogtreecommitdiff
path: root/src/storage/session-manager
diff options
context:
space:
mode:
authorNathan Reiner <nathan@nathanreiner.xyz>2025-11-17 09:57:09 +0100
committerNathan Reiner <nathan@nathanreiner.xyz>2025-11-17 09:57:09 +0100
commite95cf5c7b6a08eb560763d5167fbddc1c2117bcc (patch)
tree2f7815c9f39328fcaced2113de727f63e4837fa3 /src/storage/session-manager
parent0016aaa197697ec5ff38dfb3f63ac8b6f74b48e0 (diff)
add file uploading and multi-threading
Diffstat (limited to 'src/storage/session-manager')
-rw-r--r--src/storage/session-manager/root.zig21
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;