diff options
Diffstat (limited to 'runtime')
-rw-r--r-- | runtime/js/40_signals.js | 182 | ||||
-rw-r--r-- | runtime/js/90_deno_ns.js | 1 | ||||
-rw-r--r-- | runtime/js/99_main.js | 3 | ||||
-rw-r--r-- | runtime/ops/process.rs | 11 | ||||
-rw-r--r-- | runtime/ops/signal.rs | 92 |
5 files changed, 96 insertions, 193 deletions
diff --git a/runtime/js/40_signals.js b/runtime/js/40_signals.js index 67c1da313..40fe94d42 100644 --- a/runtime/js/40_signals.js +++ b/runtime/js/40_signals.js @@ -7,7 +7,6 @@ const { errors } = window.__bootstrap.errors; const { Error, - ObjectAssign, Promise, PromisePrototypeThen, PromiseResolve, @@ -26,148 +25,6 @@ core.opSync("op_signal_unbind", rid); } - // From `kill -l` - const LinuxSignal = { - 1: "SIGHUP", - 2: "SIGINT", - 3: "SIGQUIT", - 4: "SIGILL", - 5: "SIGTRAP", - 6: "SIGABRT", - 7: "SIGBUS", - 8: "SIGFPE", - 9: "SIGKILL", - 10: "SIGUSR1", - 11: "SIGSEGV", - 12: "SIGUSR2", - 13: "SIGPIPE", - 14: "SIGALRM", - 15: "SIGTERM", - 16: "SIGSTKFLT", - 17: "SIGCHLD", - 18: "SIGCONT", - 19: "SIGSTOP", - 20: "SIGTSTP", - 21: "SIGTTIN", - 22: "SIGTTOU", - 23: "SIGURG", - 24: "SIGXCPU", - 25: "SIGXFSZ", - 26: "SIGVTALRM", - 27: "SIGPROF", - 28: "SIGWINCH", - 29: "SIGIO", - 30: "SIGPWR", - 31: "SIGSYS", - SIGHUP: 1, - SIGINT: 2, - SIGQUIT: 3, - SIGILL: 4, - SIGTRAP: 5, - SIGABRT: 6, - SIGBUS: 7, - SIGFPE: 8, - SIGKILL: 9, - SIGUSR1: 10, - SIGSEGV: 11, - SIGUSR2: 12, - SIGPIPE: 13, - SIGALRM: 14, - SIGTERM: 15, - SIGSTKFLT: 16, - SIGCHLD: 17, - SIGCONT: 18, - SIGSTOP: 19, - SIGTSTP: 20, - SIGTTIN: 21, - SIGTTOU: 22, - SIGURG: 23, - SIGXCPU: 24, - SIGXFSZ: 25, - SIGVTALRM: 26, - SIGPROF: 27, - SIGWINCH: 28, - SIGIO: 29, - SIGPWR: 30, - SIGSYS: 31, - }; - - // From `kill -l` - const MacOSSignal = { - 1: "SIGHUP", - 2: "SIGINT", - 3: "SIGQUIT", - 4: "SIGILL", - 5: "SIGTRAP", - 6: "SIGABRT", - 7: "SIGEMT", - 8: "SIGFPE", - 9: "SIGKILL", - 10: "SIGBUS", - 11: "SIGSEGV", - 12: "SIGSYS", - 13: "SIGPIPE", - 14: "SIGALRM", - 15: "SIGTERM", - 16: "SIGURG", - 17: "SIGSTOP", - 18: "SIGTSTP", - 19: "SIGCONT", - 20: "SIGCHLD", - 21: "SIGTTIN", - 22: "SIGTTOU", - 23: "SIGIO", - 24: "SIGXCPU", - 25: "SIGXFSZ", - 26: "SIGVTALRM", - 27: "SIGPROF", - 28: "SIGWINCH", - 29: "SIGINFO", - 30: "SIGUSR1", - 31: "SIGUSR2", - SIGHUP: 1, - SIGINT: 2, - SIGQUIT: 3, - SIGILL: 4, - SIGTRAP: 5, - SIGABRT: 6, - SIGEMT: 7, - SIGFPE: 8, - SIGKILL: 9, - SIGBUS: 10, - SIGSEGV: 11, - SIGSYS: 12, - SIGPIPE: 13, - SIGALRM: 14, - SIGTERM: 15, - SIGURG: 16, - SIGSTOP: 17, - SIGTSTP: 18, - SIGCONT: 19, - SIGCHLD: 20, - SIGTTIN: 21, - SIGTTOU: 22, - SIGIO: 23, - SIGXCPU: 24, - SIGXFSZ: 25, - SIGVTALRM: 26, - SIGPROF: 27, - SIGWINCH: 28, - SIGINFO: 29, - SIGUSR1: 30, - SIGUSR2: 31, - }; - - const Signal = {}; - - function setSignals() { - if (build.os === "darwin") { - ObjectAssign(Signal, MacOSSignal); - } else { - ObjectAssign(Signal, LinuxSignal); - } - } - function signal(signo) { if (build.os === "windows") { throw new Error("not implemented!"); @@ -175,42 +32,6 @@ return new SignalStream(signo); } - const signals = { - alarm() { - return signal(Signal.SIGALRM); - }, - child() { - return signal(Signal.SIGCHLD); - }, - hungup() { - return signal(Signal.SIGHUP); - }, - interrupt() { - return signal(Signal.SIGINT); - }, - io() { - return signal(Signal.SIGIO); - }, - pipe() { - return signal(Signal.SIGPIPE); - }, - quit() { - return signal(Signal.SIGQUIT); - }, - terminate() { - return signal(Signal.SIGTERM); - }, - userDefined1() { - return signal(Signal.SIGUSR1); - }, - userDefined2() { - return signal(Signal.SIGUSR2); - }, - windowChange() { - return signal(Signal.SIGWINCH); - }, - }; - class SignalStream { #disposed = false; #pollingPromise = PromiseResolve(false); @@ -275,9 +96,6 @@ window.__bootstrap.signals = { signal, - signals, - Signal, SignalStream, - setSignals, }; })(this); diff --git a/runtime/js/90_deno_ns.js b/runtime/js/90_deno_ns.js index 71c8bd0f0..8f1fe89f5 100644 --- a/runtime/js/90_deno_ns.js +++ b/runtime/js/90_deno_ns.js @@ -106,7 +106,6 @@ __bootstrap.denoNsUnstable = { signal: __bootstrap.signals.signal, - signals: __bootstrap.signals.signals, Signal: __bootstrap.signals.Signal, SignalStream: __bootstrap.signals.SignalStream, emit: __bootstrap.compilerApi.emit, diff --git a/runtime/js/99_main.js b/runtime/js/99_main.js index c9dd611da..59b3a428f 100644 --- a/runtime/js/99_main.js +++ b/runtime/js/99_main.js @@ -37,7 +37,6 @@ delete Object.prototype.__proto__; const encoding = window.__bootstrap.encoding; const Console = window.__bootstrap.console.Console; const worker = window.__bootstrap.worker; - const signals = window.__bootstrap.signals; const internals = window.__bootstrap.internals; const performance = window.__bootstrap.performance; const crypto = window.__bootstrap.crypto; @@ -609,7 +608,6 @@ delete Object.prototype.__proto__; // `Deno` with `Deno` namespace from "./deno.ts". ObjectDefineProperty(globalThis, "Deno", util.readOnly(finalDenoNs)); ObjectFreeze(globalThis.Deno.core); - signals.setSignals(); util.log("args", args); } @@ -697,7 +695,6 @@ delete Object.prototype.__proto__; // existing global `Deno` with `Deno` namespace from "./deno.ts". ObjectDefineProperty(globalThis, "Deno", util.readOnly(finalDenoNs)); ObjectFreeze(globalThis.Deno.core); - signals.setSignals(); } else { delete globalThis.Deno; util.assert(globalThis.Deno === undefined); diff --git a/runtime/ops/process.rs b/runtime/ops/process.rs index 44ead73da..b1d5e80ca 100644 --- a/runtime/ops/process.rs +++ b/runtime/ops/process.rs @@ -198,7 +198,7 @@ fn op_run( #[derive(Serialize)] #[serde(rename_all = "camelCase")] -struct RunStatus { +struct ProcessStatus { got_signal: bool, exit_code: i32, exit_signal: i32, @@ -208,7 +208,7 @@ async fn op_run_status( state: Rc<RefCell<OpState>>, rid: ResourceId, _: (), -) -> Result<RunStatus, AnyError> { +) -> Result<ProcessStatus, AnyError> { let resource = state .borrow_mut() .resource_table @@ -227,7 +227,7 @@ async fn op_run_status( .expect("Should have either an exit code or a signal."); let got_signal = signal.is_some(); - Ok(RunStatus { + Ok(ProcessStatus { got_signal, exit_code: code.unwrap_or(-1), exit_signal: signal.unwrap_or(-1), @@ -288,13 +288,14 @@ pub fn kill(pid: i32, signal: i32) -> Result<(), AnyError> { #[derive(Deserialize)] struct KillArgs { pid: i32, - signo: i32, + signo: String, } fn op_kill(state: &mut OpState, args: KillArgs, _: ()) -> Result<(), AnyError> { super::check_unstable(state, "Deno.kill"); state.borrow_mut::<Permissions>().run.check_all()?; - kill(args.pid, args.signo)?; + let signo = super::signal::signal_str_to_int_unwrap(&args.signo)?; + kill(args.pid, signo)?; Ok(()) } diff --git a/runtime/ops/signal.rs b/runtime/ops/signal.rs index 889021706..eea8161cd 100644 --- a/runtime/ops/signal.rs +++ b/runtime/ops/signal.rs @@ -1,4 +1,5 @@ // Copyright 2018-2021 the Deno authors. All rights reserved. MIT license. +use deno_core::error::type_error; use deno_core::error::AnyError; use deno_core::op_async_unref; use deno_core::op_sync; @@ -53,15 +54,102 @@ impl Resource for SignalStreamResource { } } +#[cfg(target_os = "linux")] +fn signal_str_to_int(s: &str) -> Option<libc::c_int> { + match s { + "SIGHUP" => Some(1), + "SIGINT" => Some(2), + "SIGQUIT" => Some(3), + "SIGILL" => Some(4), + "SIGTRAP" => Some(5), + "SIGABRT" => Some(6), + "SIGBUS" => Some(7), + "SIGFPE" => Some(8), + "SIGKILL" => Some(9), + "SIGUSR1" => Some(10), + "SIGSEGV" => Some(11), + "SIGUSR2" => Some(12), + "SIGPIPE" => Some(13), + "SIGALRM" => Some(14), + "SIGTERM" => Some(15), + "SIGSTKFLT" => Some(16), + "SIGCHLD" => Some(17), + "SIGCONT" => Some(18), + "SIGSTOP" => Some(19), + "SIGTSTP" => Some(20), + "SIGTTIN" => Some(21), + "SIGTTOU" => Some(22), + "SIGURG" => Some(23), + "SIGXCPU" => Some(24), + "SIGXFSZ" => Some(25), + "SIGVTALRM" => Some(26), + "SIGPROF" => Some(27), + "SIGWINCH" => Some(28), + "SIGIO" => Some(29), + "SIGPWR" => Some(30), + "SIGSYS" => Some(31), + _ => None, + } +} + +#[cfg(target_os = "macos")] +fn signal_str_to_int(s: &str) -> Option<libc::c_int> { + match s { + "SIGHUP" => Some(1), + "SIGINT" => Some(2), + "SIGQUIT" => Some(3), + "SIGILL" => Some(4), + "SIGTRAP" => Some(5), + "SIGABRT" => Some(6), + "SIGEMT" => Some(7), + "SIGFPE" => Some(8), + "SIGKILL" => Some(9), + "SIGBUS" => Some(10), + "SIGSEGV" => Some(11), + "SIGSYS" => Some(12), + "SIGPIPE" => Some(13), + "SIGALRM" => Some(14), + "SIGTERM" => Some(15), + "SIGURG" => Some(16), + "SIGSTOP" => Some(17), + "SIGTSTP" => Some(18), + "SIGCONT" => Some(19), + "SIGCHLD" => Some(20), + "SIGTTIN" => Some(21), + "SIGTTOU" => Some(22), + "SIGIO" => Some(23), + "SIGXCPU" => Some(24), + "SIGXFSZ" => Some(25), + "SIGVTALRM" => Some(26), + "SIGPROF" => Some(27), + "SIGWINCH" => Some(28), + "SIGINFO" => Some(29), + "SIGUSR1" => Some(30), + "SIGUSR2" => Some(31), + _ => None, + } +} + +#[cfg(target_os = "windows")] +fn signal_str_to_int(s: &str) -> Option<libc::c_int> { + unimplemented!() +} + +pub fn signal_str_to_int_unwrap(s: &str) -> Result<libc::c_int, AnyError> { + signal_str_to_int(s) + .ok_or_else(|| type_error(format!("Invalid signal : {}", s))) +} + #[cfg(unix)] fn op_signal_bind( state: &mut OpState, - signo: i32, + sig: String, _: (), ) -> Result<ResourceId, AnyError> { super::check_unstable(state, "Deno.signal"); + let signo = signal_str_to_int_unwrap(&sig)?; let resource = SignalStreamResource { - signal: AsyncRefCell::new(signal(SignalKind::from_raw(signo)).expect("")), + signal: AsyncRefCell::new(signal(SignalKind::from_raw(signo)).unwrap()), cancel: Default::default(), }; let rid = state.resource_table.add(resource); |