commit bdd1a9e48c7a1a09cf0a3b7c0d5be6547f8ef1aa (tree)
parent 4efd95180166e602402142eb64d77f97b48ddb3c
Author: naeu <36885263+naeu@users.noreply.github.com>
Date: Sat, 29 Jan 2022 19:17:37 +0000
std: add test for Thread.Semaphore
Diffstat:
1 file changed, 28 insertions(+), 0 deletions(-)
diff --git a/lib/std/Thread/Semaphore.zig b/lib/std/Thread/Semaphore.zig
@@ -11,6 +11,8 @@ const Semaphore = @This();
const std = @import("../std.zig");
const Mutex = std.Thread.Mutex;
const Condition = std.Thread.Condition;
+const builtin = @import("builtin");
+const testing = std.testing;
pub fn wait(sem: *Semaphore) void {
sem.mutex.lock();
@@ -31,3 +33,29 @@ pub fn post(sem: *Semaphore) void {
sem.permits += 1;
sem.cond.signal();
}
+
+test "Thread.Semaphore" {
+ if (builtin.single_threaded) {
+ return error.SkipZigTest;
+ }
+
+ const TestContext = struct {
+ sem: *Semaphore,
+ n: *i32,
+ fn worker(ctx: *@This()) void {
+ ctx.sem.wait();
+ ctx.n.* += 1;
+ ctx.sem.post();
+ }
+ };
+ const num_threads = 3;
+ var sem = Semaphore{ .permits = 1 };
+ var threads: [num_threads]std.Thread = undefined;
+ var n: i32 = 0;
+ var ctx = TestContext{ .sem = &sem, .n = &n };
+
+ for (threads) |*t| t.* = try std.Thread.spawn(.{}, TestContext.worker, .{&ctx});
+ for (threads) |t| t.join();
+ sem.wait();
+ try testing.expect(n == num_threads);
+}