| ... | @@ -1786,25 +1786,41 @@ pub fn sigaction(sig: u6, noalias act: ?*const Sigaction, noalias oact: ?*Sigact | ... | @@ -1786,25 +1786,41 @@ pub fn sigaction(sig: u6, noalias act: ?*const Sigaction, noalias oact: ?*Sigact |
| 1786 | | 1786 | |
| 1787 | const usize_bits = @typeInfo(usize).int.bits; | 1787 | const usize_bits = @typeInfo(usize).int.bits; |
| 1788 | | 1788 | |
| 1789 | pub fn sigaddset(set: *sigset_t, sig: u6) void { | 1789 | pub const sigset_t = [1024 / 32]u32; |
| 1790 | const s = sig - 1; | 1790 | |
| 1791 | // shift in musl: s&8*sizeof *set->__bits-1 | 1791 | const sigset_len = @typeInfo(sigset_t).array.len; |
| 1792 | const shift = @as(u5, @intCast(s & (usize_bits - 1))); | 1792 | |
| 1793 | const val = @as(u32, @intCast(1)) << shift; | 1793 | /// Empty set to initialize sigset_t instances from. |
| 1794 | (set.*)[@as(usize, @intCast(s)) / usize_bits] |= val; | 1794 | pub const empty_sigset: sigset_t = [_]u32{0} ** sigset_len; |
| | 1795 | |
| | 1796 | pub const filled_sigset: sigset_t = [_]u32{0x7fff_ffff} ++ [_]u32{0} ** (sigset_len - 1); |
| | 1797 | |
| | 1798 | pub const all_mask: sigset_t = [_]u32{0xffff_ffff} ** sigset_len; |
| | 1799 | |
| | 1800 | fn sigset_bit_index(sig: usize) struct { word: usize, mask: u32 } { |
| | 1801 | assert(sig > 0); |
| | 1802 | assert(sig < NSIG); |
| | 1803 | const bit = sig - 1; |
| | 1804 | const shift = @as(u5, @truncate(bit % 32)); |
| | 1805 | return .{ |
| | 1806 | .word = bit / 32, |
| | 1807 | .mask = @as(u32, 1) << shift, |
| | 1808 | }; |
| 1795 | } | 1809 | } |
| 1796 | | 1810 | |
| 1797 | pub fn sigdelset(set: *sigset_t, sig: u6) void { | 1811 | pub fn sigaddset(set: *sigset_t, sig: usize) void { |
| 1798 | const s = sig - 1; | 1812 | const index = sigset_bit_index(sig); |
| 1799 | // shift in musl: s&8*sizeof *set->__bits-1 | 1813 | (set.*)[index.word] |= index.mask; |
| 1800 | const shift = @as(u5, @intCast(s & (usize_bits - 1))); | | |
| 1801 | const val = @as(u32, @intCast(1)) << shift; | | |
| 1802 | (set.*)[@as(usize, @intCast(s)) / usize_bits] ^= val; | | |
| 1803 | } | 1814 | } |
| 1804 | | 1815 | |
| 1805 | pub fn sigismember(set: *const sigset_t, sig: u6) bool { | 1816 | pub fn sigdelset(set: *sigset_t, sig: usize) void { |
| 1806 | const s = sig - 1; | 1817 | const index = sigset_bit_index(sig); |
| 1807 | return ((set.*)[@as(usize, @intCast(s)) / usize_bits] & (@as(usize, @intCast(1)) << @intCast(s & (usize_bits - 1)))) != 0; | 1818 | (set.*)[index.word] ^= index.mask; |
| | 1819 | } |
| | 1820 | |
| | 1821 | pub fn sigismember(set: *const sigset_t, sig: usize) bool { |
| | 1822 | const index = sigset_bit_index(sig); |
| | 1823 | return ((set.*)[index.word] & index.mask) != 0; |
| 1808 | } | 1824 | } |
| 1809 | | 1825 | |
| 1810 | pub fn getsockname(fd: i32, noalias addr: *sockaddr, noalias len: *socklen_t) usize { | 1826 | pub fn getsockname(fd: i32, noalias addr: *sockaddr, noalias len: *socklen_t) usize { |
| ... | @@ -5402,10 +5418,6 @@ pub const TFD = switch (native_arch) { | ... | @@ -5402,10 +5418,6 @@ pub const TFD = switch (native_arch) { |
| 5402 | /// As signal numbers are sequential, NSIG is one greater than the largest defined signal number. | 5418 | /// As signal numbers are sequential, NSIG is one greater than the largest defined signal number. |
| 5403 | pub const NSIG = if (is_mips) 128 else 65; | 5419 | pub const NSIG = if (is_mips) 128 else 65; |
| 5404 | | 5420 | |
| 5405 | pub const sigset_t = [1024 / 32]u32; | | |
| 5406 | | | |
| 5407 | pub const all_mask: sigset_t = [_]u32{0xffffffff} ** @typeInfo(sigset_t).array.len; | | |
| 5408 | | | |
| 5409 | const k_sigaction_funcs = struct { | 5421 | const k_sigaction_funcs = struct { |
| 5410 | const handler = ?*align(1) const fn (i32) callconv(.c) void; | 5422 | const handler = ?*align(1) const fn (i32) callconv(.c) void; |
| 5411 | const restorer = *const fn () callconv(.c) void; | 5423 | const restorer = *const fn () callconv(.c) void; |
| ... | @@ -5446,10 +5458,6 @@ pub const Sigaction = extern struct { | ... | @@ -5446,10 +5458,6 @@ pub const Sigaction = extern struct { |
| 5446 | restorer: ?*const fn () callconv(.c) void = null, | 5458 | restorer: ?*const fn () callconv(.c) void = null, |
| 5447 | }; | 5459 | }; |
| 5448 | | 5460 | |
| 5449 | const sigset_len = @typeInfo(sigset_t).array.len; | | |
| 5450 | pub const empty_sigset = [_]u32{0} ** sigset_len; | | |
| 5451 | pub const filled_sigset = [_]u32{(1 << (31 & (usize_bits - 1))) - 1} ++ [_]u32{0} ** (sigset_len - 1); | | |
| 5452 | | | |
| 5453 | pub const SFD = struct { | 5461 | pub const SFD = struct { |
| 5454 | pub const CLOEXEC = 1 << @bitOffsetOf(O, "CLOEXEC"); | 5462 | pub const CLOEXEC = 1 << @bitOffsetOf(O, "CLOEXEC"); |
| 5455 | pub const NONBLOCK = 1 << @bitOffsetOf(O, "NONBLOCK"); | 5463 | pub const NONBLOCK = 1 << @bitOffsetOf(O, "NONBLOCK"); |