mirror of
https://github.com/zigzap/zap.git
synced 2025-10-20 23:24:09 +00:00
made endpoint's user list thread-safe
This commit is contained in:
parent
ed57d1e93e
commit
218b556d30
3 changed files with 17 additions and 2 deletions
|
@ -439,7 +439,7 @@ pub fn main() !void {
|
||||||
// and run
|
// and run
|
||||||
zap.start(.{
|
zap.start(.{
|
||||||
.threads = 2,
|
.threads = 2,
|
||||||
.workers = 2,
|
.workers = 1, // to stay in process; users list shared between threads
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
|
@ -33,6 +33,6 @@ pub fn main() !void {
|
||||||
// and run
|
// and run
|
||||||
zap.start(.{
|
zap.start(.{
|
||||||
.threads = 2,
|
.threads = 2,
|
||||||
.workers = 2,
|
.workers = 1, // to stay in-process, users list shared between threads
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@ const std = @import("std");
|
||||||
|
|
||||||
alloc: std.mem.Allocator = undefined,
|
alloc: std.mem.Allocator = undefined,
|
||||||
users: std.AutoHashMap(usize, InternalUser) = undefined,
|
users: std.AutoHashMap(usize, InternalUser) = undefined,
|
||||||
|
lock: std.Thread.Mutex = undefined,
|
||||||
count: usize = 0,
|
count: usize = 0,
|
||||||
|
|
||||||
pub const Self = @This();
|
pub const Self = @This();
|
||||||
|
@ -24,6 +25,7 @@ pub fn init(a: std.mem.Allocator) Self {
|
||||||
return .{
|
return .{
|
||||||
.alloc = a,
|
.alloc = a,
|
||||||
.users = std.AutoHashMap(usize, InternalUser).init(a),
|
.users = std.AutoHashMap(usize, InternalUser).init(a),
|
||||||
|
.lock = std.Thread.Mutex{},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,15 +48,24 @@ pub fn addByName(self: *Self, first: ?[]const u8, last: ?[]const u8) !usize {
|
||||||
std.mem.copy(u8, user.lastnamebuf[0..], lastname);
|
std.mem.copy(u8, user.lastnamebuf[0..], lastname);
|
||||||
user.lastnamelen = lastname.len;
|
user.lastnamelen = lastname.len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// We lock only on insertion, deletion, and listing
|
||||||
|
self.lock.lock();
|
||||||
|
defer self.lock.unlock();
|
||||||
try self.users.put(user.id, user);
|
try self.users.put(user.id, user);
|
||||||
return user.id;
|
return user.id;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn delete(self: *Self, id: usize) bool {
|
pub fn delete(self: *Self, id: usize) bool {
|
||||||
|
// We lock only on insertion, deletion, and listing
|
||||||
|
self.lock.lock();
|
||||||
|
defer self.lock.unlock();
|
||||||
return self.users.remove(id);
|
return self.users.remove(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get(self: *Self, id: usize) ?User {
|
pub fn get(self: *Self, id: usize) ?User {
|
||||||
|
// we don't care about locking here, as our usage-pattern is unlikely to
|
||||||
|
// get a user by id that is not known yet
|
||||||
if (self.users.get(id)) |pUser| {
|
if (self.users.get(id)) |pUser| {
|
||||||
return .{
|
return .{
|
||||||
.id = pUser.id,
|
.id = pUser.id,
|
||||||
|
@ -71,6 +82,7 @@ pub fn update(
|
||||||
first: ?[]const u8,
|
first: ?[]const u8,
|
||||||
last: ?[]const u8,
|
last: ?[]const u8,
|
||||||
) bool {
|
) bool {
|
||||||
|
// we don't care about locking here
|
||||||
var user: ?InternalUser = self.users.get(id);
|
var user: ?InternalUser = self.users.get(id);
|
||||||
// we got a copy apparently, so we need to put again
|
// we got a copy apparently, so we need to put again
|
||||||
if (user) |*pUser| {
|
if (user) |*pUser| {
|
||||||
|
@ -96,6 +108,9 @@ pub fn update(
|
||||||
|
|
||||||
// populate the list
|
// populate the list
|
||||||
pub fn list(self: *Self, out: *std.ArrayList(User)) !void {
|
pub fn list(self: *Self, out: *std.ArrayList(User)) !void {
|
||||||
|
// We lock only on insertion, deletion, and listing
|
||||||
|
self.lock.lock();
|
||||||
|
defer self.lock.unlock();
|
||||||
var it = JsonUserIterator.init(&self.users);
|
var it = JsonUserIterator.init(&self.users);
|
||||||
while (it.next()) |user| {
|
while (it.next()) |user| {
|
||||||
try out.append(user);
|
try out.append(user);
|
||||||
|
|
Loading…
Add table
Reference in a new issue