aboutsummaryrefslogtreecommitdiff
path: root/lib/std/Thread.zig
diff options
context:
space:
mode:
authorprotty <45520026+kprotty@users.noreply.github.com>2022-04-26 16:48:56 -0500
committerGitHub <noreply@github.com>2022-04-26 16:48:56 -0500
commit18f30346291bd2471e07924af161de080935dd60 (patch)
tree609cdd73aa40f15625f896e79b9420b3e320ddcd /lib/std/Thread.zig
parent50f1856476038e57f5d2f47c751f608b0b360662 (diff)
downloadzig-18f30346291bd2471e07924af161de080935dd60.tar.gz
zig-18f30346291bd2471e07924af161de080935dd60.zip
std.Thread: ResetEvent improvements (#11523)
* std: start removing redundant ResetEvents * src: fix other uses of std.Thread.ResetEvent * src: add builtin.sanitize_thread for tsan detection * atomic: add Atomic.fence for proper fencing with tsan * Thread: remove the other ResetEvent's and rewrite the current one * Thread: ResetEvent docs * zig fmt + WaitGroup.reset() fix * src: fix build issues for ResetEvent + tsan * Thread: ResetEvent tests * Thread: ResetEvent module doc * Atomic: replace llvm *p memory constraint with *m * panicking: handle spurious wakeups in futex.wait() when waiting for abort() * zig fmt
Diffstat (limited to 'lib/std/Thread.zig')
-rw-r--r--lib/std/Thread.zig32
1 files changed, 9 insertions, 23 deletions
diff --git a/lib/std/Thread.zig b/lib/std/Thread.zig
index db7117fdd7..45d2ac0040 100644
--- a/lib/std/Thread.zig
+++ b/lib/std/Thread.zig
@@ -10,10 +10,8 @@ const assert = std.debug.assert;
const target = builtin.target;
const Atomic = std.atomic.Atomic;
-pub const AutoResetEvent = @import("Thread/AutoResetEvent.zig");
pub const Futex = @import("Thread/Futex.zig");
pub const ResetEvent = @import("Thread/ResetEvent.zig");
-pub const StaticResetEvent = @import("Thread/StaticResetEvent.zig");
pub const Mutex = @import("Thread/Mutex.zig");
pub const Semaphore = @import("Thread/Semaphore.zig");
pub const Condition = @import("Thread/Condition.zig");
@@ -1078,17 +1076,13 @@ test "setName, getName" {
if (builtin.single_threaded) return error.SkipZigTest;
const Context = struct {
- start_wait_event: ResetEvent = undefined,
- test_done_event: ResetEvent = undefined,
+ start_wait_event: ResetEvent = .{},
+ test_done_event: ResetEvent = .{},
+ thread_done_event: ResetEvent = .{},
done: std.atomic.Atomic(bool) = std.atomic.Atomic(bool).init(false),
thread: Thread = undefined,
- fn init(self: *@This()) !void {
- try self.start_wait_event.init();
- try self.test_done_event.init();
- }
-
pub fn run(ctx: *@This()) !void {
// Wait for the main thread to have set the thread field in the context.
ctx.start_wait_event.wait();
@@ -1104,16 +1098,14 @@ test "setName, getName" {
// Signal our test is done
ctx.test_done_event.set();
- while (!ctx.done.load(.SeqCst)) {
- std.time.sleep(5 * std.time.ns_per_ms);
- }
+ // wait for the thread to property exit
+ ctx.thread_done_event.wait();
}
};
var context = Context{};
- try context.init();
-
var thread = try spawn(.{}, Context.run, .{&context});
+
context.thread = thread;
context.start_wait_event.set();
context.test_done_event.wait();
@@ -1139,16 +1131,14 @@ test "setName, getName" {
},
}
- context.done.store(true, .SeqCst);
+ context.thread_done_event.set();
thread.join();
}
test "std.Thread" {
// Doesn't use testing.refAllDecls() since that would pull in the compileError spinLoopHint.
- _ = AutoResetEvent;
_ = Futex;
_ = ResetEvent;
- _ = StaticResetEvent;
_ = Mutex;
_ = Semaphore;
_ = Condition;
@@ -1163,9 +1153,7 @@ test "Thread.join" {
if (builtin.single_threaded) return error.SkipZigTest;
var value: usize = 0;
- var event: ResetEvent = undefined;
- try event.init();
- defer event.deinit();
+ var event = ResetEvent{};
const thread = try Thread.spawn(.{}, testIncrementNotify, .{ &value, &event });
thread.join();
@@ -1177,9 +1165,7 @@ test "Thread.detach" {
if (builtin.single_threaded) return error.SkipZigTest;
var value: usize = 0;
- var event: ResetEvent = undefined;
- try event.init();
- defer event.deinit();
+ var event = ResetEvent{};
const thread = try Thread.spawn(.{}, testIncrementNotify, .{ &value, &event });
thread.detach();