From bdd1a9e48c7a1a09cf0a3b7c0d5be6547f8ef1aa Mon Sep 17 00:00:00 2001 From: naeu <36885263+naeu@users.noreply.github.com> Date: Sat, 29 Jan 2022 19:17:37 +0000 Subject: std: add test for Thread.Semaphore --- lib/std/Thread/Semaphore.zig | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'lib/std/Thread/Semaphore.zig') diff --git a/lib/std/Thread/Semaphore.zig b/lib/std/Thread/Semaphore.zig index 30d16037bc..72191ffd6f 100644 --- 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); +} -- cgit v1.2.3