signal.ha (2482B)
1 // SPDX-License-Identifier: MPL-2.0 2 // (c) Hare authors <https://harelang.org> 3 4 // TODO: work when _NSIG != 64 5 6 export fn sigemptyset(set: *sigset) void = { 7 set.__val[0] = 0; 8 }; 9 10 export fn sigaddset(set: *sigset, signum: int) (void | errno) = { 11 if (signum < 1 || signum > NSIG) { 12 return EINVAL; 13 }; 14 signum -= 1; 15 set.__val[0] |= (1 << signum): u64; 16 }; 17 18 export fn sigdelset(set: *sigset, signum: int) (void | errno) = { 19 if (signum < 1 || signum > NSIG) { 20 return EINVAL; 21 }; 22 signum -= 1; 23 set.__val[0] &= ~(1 << signum: u64); 24 }; 25 26 export fn sigismember(set: *sigset, signum: int) (bool | errno) = { 27 if (signum < 1 || signum > NSIG) { 28 return EINVAL; 29 }; 30 signum -= 1; 31 return (set.__val[0] & (1 << signum: u64)) != 0; 32 }; 33 34 export fn sigfillset(set: *sigset) void = { 35 set.__val[0] = ~0u64; 36 }; 37 38 // Test sigset operations do not fail for valid signal numbers. 39 @test fn sigset_valid_signum() void = { 40 let set: sigset = sigset { ... }; 41 sigemptyset(&set); 42 43 assert(!(sigismember(&set, 1) is errno), "Unexpected error"); 44 assert(!(sigismember(&set, 15) is errno), "Unexpected error"); 45 assert(!(sigismember(&set, NSIG) is errno), "Unexpected error"); 46 47 assert(!(sigaddset(&set, 1) is errno), "Unexpected error"); 48 assert(!(sigaddset(&set, 15) is errno), "Unexpected error"); 49 assert(!(sigaddset(&set, NSIG) is errno), "Unexpected error"); 50 51 // It's ok to add a signal that is already present in the set. 52 assert(!(sigaddset(&set, 1) is errno), "Unexpected error"); 53 54 assert(!(sigdelset(&set, 1) is errno), "Unexpected error"); 55 assert(!(sigdelset(&set, 15) is errno), "Unexpected error"); 56 assert(!(sigdelset(&set, NSIG) is errno), "Unexpected error"); 57 58 // It's ok to delete a signal that is not present in the set. 59 assert(!(sigdelset(&set, 10) is errno), "Unexpected error"); 60 }; 61 62 // Test sigset operations fail for invalid signal numbers. 63 @test fn sigset_invalid_signum() void = { 64 let set: sigset = sigset { ... }; 65 sigemptyset(&set); 66 67 assert(sigismember(&set, -1) is errno, "Expected error"); 68 assert(sigismember(&set, 0) is errno, "Expected error"); 69 assert(sigismember(&set, NSIG + 1) is errno, "Expected error"); 70 71 assert(sigaddset(&set, -1) is errno, "Expected error"); 72 assert(sigaddset(&set, 0) is errno, "Expected error"); 73 assert(sigaddset(&set, NSIG + 1) is errno, "Expected error"); 74 75 assert(sigdelset(&set, -1) is errno, "Expected error"); 76 assert(sigdelset(&set, 0) is errno, "Expected error"); 77 assert(sigdelset(&set, NSIG + 1) is errno, "Expected error"); 78 };