Idris2/support/js/support_system_signal.js

107 lines
2.9 KiB
JavaScript
Raw Normal View History

const support_system_signal_process = require('process')
// https://en.wikipedia.org/wiki/Signal_(IPC)#Default_action
const support_system_signal_sighup = 1
const support_system_signal_sigint = 2
const support_system_signal_sigquit = 3
const support_system_signal_sigill = 4
const support_system_signal_sigtrap = 5
const support_system_signal_sigabrt = 6
const support_system_signal_sigfpe = 8
const support_system_signal_sigusr1 = 10
const support_system_signal_sigsegv = 11
const support_system_signal_sigusr2 = 12
function signal_int_to_string(signal) {
switch (signal) {
case 1:
return 'SIGHUP'
case 2:
return 'SIGINT'
case 3:
return 'SIGQUIT'
case 4:
return 'SIGILL'
case 5:
return 'SIGTRAP'
case 6:
return 'SIGABRT'
case 8:
return 'SIGFPE'
case 10:
return 'SIGUSR1'
case 11:
return 'SIGSEGV'
case 12:
return 'SIGUSR2'
default:
// https://nodejs.org/api/process.html#signal-events
// 0 can be sent to test for the existence of a process, it has no effect if the process exists, but will throw an error if the process does not exist.
return 0
}
}
function support_system_signal_ignoreSignal(signal) {
let signal_string = signal_int_to_string(signal)
try {
support_system_signal_process.on(signal_string, sig => {})
return 0
} catch (e) {
return -1
}
}
function support_system_signal_sendSignal(pid, signal) {
let signal_string = signal_int_to_string(signal)
try {
support_system_signal_process.kill(pid, signal_string)
return 0
} catch (e) {
return -1
}
}
function support_system_signal_raiseSignal(signal) {
let signal_string = signal_int_to_string(signal)
try {
support_system_signal_process.kill(support_system_signal_process.pid, signal_string)
return 0
} catch (e) {
return -1
}
}
function support_system_signal_defaultSignal(signal) {
let signal_string = signal_int_to_string(signal)
try {
support_system_signal_process.removeAllListeners(signal_string)
return 0
} catch (e) {
return -1
}
}
// this implementation deduplicates signals and leaves handle ordering up to details of the Map impl
var pending_signals = new Map();
function support_system_signal_collectSignal(signal) {
let signal_string = system_signal_int_to_string(signal)
try {
support_system_signal_process.on(signal_string, x => { pending_signals.set(signal) })
return 0
} catch (e) {
return -1
}
}
function support_system_signal_handleNextCollectedSignal() {
let next = pending_signals.keys().next()
if (next.done) {
return -1
} else {
let val = next.value
pending_signals.delete(val)
return val
}
}