hare

[hare] The Hare programming language
git clone https://git.torresjrjr.com/hare.git
Log | Files | Refs | README | LICENSE

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 };