mirror of
https://codeberg.org/ziglang/zig.git
synced 2025-12-06 05:44:20 +00:00
posix/test.zig: "sigset_t bits" test fixes
Re-enable the test. Will trigger #24380 as-is, but follow-on change moes this code over to test/standalone. Make the test a bit easier to debug by stashing the "seen" signal number in the shared `seen_sig` (instead of just incrementing a counter for each hit). And only doing so if the `seen_sig` is zero.
This commit is contained in:
parent
0edccc1079
commit
e46ddeeb29
1 changed files with 13 additions and 14 deletions
|
|
@ -949,14 +949,11 @@ test "sigset_t bits" {
|
||||||
if (native_os == .wasi or native_os == .windows)
|
if (native_os == .wasi or native_os == .windows)
|
||||||
return error.SkipZigTest;
|
return error.SkipZigTest;
|
||||||
|
|
||||||
if (true) {
|
const NO_SIG: i32 = 0;
|
||||||
// https://github.com/ziglang/zig/issues/24380
|
|
||||||
return error.SkipZigTest;
|
|
||||||
}
|
|
||||||
|
|
||||||
const S = struct {
|
const S = struct {
|
||||||
var expected_sig: i32 = undefined;
|
var expected_sig: i32 = undefined;
|
||||||
var handler_called_count: u32 = 0;
|
var seen_sig: i32 = NO_SIG;
|
||||||
|
|
||||||
fn handler(sig: i32, info: *const posix.siginfo_t, ctx_ptr: ?*anyopaque) callconv(.c) void {
|
fn handler(sig: i32, info: *const posix.siginfo_t, ctx_ptr: ?*anyopaque) callconv(.c) void {
|
||||||
_ = ctx_ptr;
|
_ = ctx_ptr;
|
||||||
|
|
@ -965,23 +962,25 @@ test "sigset_t bits" {
|
||||||
.netbsd => info.info.signo,
|
.netbsd => info.info.signo,
|
||||||
else => info.signo,
|
else => info.signo,
|
||||||
};
|
};
|
||||||
if (sig == expected_sig and sig == info_sig) {
|
if (seen_sig == NO_SIG and sig == expected_sig and sig == info_sig) {
|
||||||
handler_called_count += 1;
|
seen_sig = sig;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const self_pid = posix.system.getpid();
|
// Assume this is a single-threaded process where the current thread has the
|
||||||
|
// 'pid' thread id. (The sigprocmask calls are thread-private state.)
|
||||||
|
const self_tid = posix.system.getpid();
|
||||||
|
|
||||||
// To check that sigset_t mapping matches kernel (think u32/u64 mismatches on
|
// To check that sigset_t mapping matches kernel (think u32/u64 mismatches on
|
||||||
// big-endian), try sending a blocked signal to make sure the mask matches the
|
// big-endian), try sending a blocked signal to make sure the mask matches the
|
||||||
// signal. (Send URG and CHLD because they're ignored by default in the
|
// signal. (Send URG and CHLD because they're ignored by default in the
|
||||||
// debugger, vs. USR1 or other named signals)
|
// debugger, vs. USR1 or other named signals)
|
||||||
inline for ([_]usize{ posix.SIG.URG, posix.SIG.CHLD, 62, 94, 126 }) |test_signo| {
|
inline for ([_]i32{ posix.SIG.URG, posix.SIG.CHLD, 62, 94, 126 }) |test_signo| {
|
||||||
if (test_signo >= posix.NSIG) continue;
|
if (test_signo >= posix.NSIG) continue;
|
||||||
|
|
||||||
S.expected_sig = test_signo;
|
S.expected_sig = test_signo;
|
||||||
S.handler_called_count = 0;
|
S.seen_sig = NO_SIG;
|
||||||
|
|
||||||
const sa: posix.Sigaction = .{
|
const sa: posix.Sigaction = .{
|
||||||
.handler = .{ .sigaction = &S.handler },
|
.handler = .{ .sigaction = &S.handler },
|
||||||
|
|
@ -1001,18 +1000,18 @@ test "sigset_t bits" {
|
||||||
|
|
||||||
// qemu maps target signals to host signals 1-to-1, so targets
|
// qemu maps target signals to host signals 1-to-1, so targets
|
||||||
// with more signals than the host will fail to send the signal.
|
// with more signals than the host will fail to send the signal.
|
||||||
const rc = posix.system.kill(self_pid, test_signo);
|
const rc = posix.system.kill(self_tid, test_signo);
|
||||||
switch (posix.errno(rc)) {
|
switch (posix.errno(rc)) {
|
||||||
.SUCCESS => {
|
.SUCCESS => {
|
||||||
// See that the signal is blocked, then unblocked
|
// See that the signal is blocked, then unblocked
|
||||||
try testing.expectEqual(0, S.handler_called_count);
|
try testing.expectEqual(NO_SIG, S.seen_sig);
|
||||||
posix.sigprocmask(posix.SIG.UNBLOCK, &block_one, null);
|
posix.sigprocmask(posix.SIG.UNBLOCK, &block_one, null);
|
||||||
try testing.expectEqual(1, S.handler_called_count);
|
try testing.expectEqual(test_signo, S.seen_sig);
|
||||||
},
|
},
|
||||||
.INVAL => {
|
.INVAL => {
|
||||||
// Signal won't get delviered. Just clean up.
|
// Signal won't get delviered. Just clean up.
|
||||||
posix.sigprocmask(posix.SIG.UNBLOCK, &block_one, null);
|
posix.sigprocmask(posix.SIG.UNBLOCK, &block_one, null);
|
||||||
try testing.expectEqual(0, S.handler_called_count);
|
try testing.expectEqual(NO_SIG, S.seen_sig);
|
||||||
},
|
},
|
||||||
else => |errno| return posix.unexpectedErrno(errno),
|
else => |errno| return posix.unexpectedErrno(errno),
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue