Chromium Code Reviews| Index: runtime/bin/process_patch.dart |
| diff --git a/runtime/bin/process_patch.dart b/runtime/bin/process_patch.dart |
| index e0e8fc6e237d21c632eb4158506f848ec3c7d11d..77e2ffcd84fb40a3136f377522f5f989b2c1c9fc 100644 |
| --- a/runtime/bin/process_patch.dart |
| +++ b/runtime/bin/process_patch.dart |
| @@ -71,12 +71,76 @@ patch class Process { |
| } |
| +List<_SignalController> _signalControllers = new List(32); |
| + |
| + |
| +class _SignalController { |
| + final ProcessSignal signal; |
| + |
| + StreamController _controller; |
| + var _id; |
| + |
| + _SignalController(this.signal) { |
| + _controller = new StreamController.broadcast( |
| + onListen: _listen, |
| + onCancel: _cancel); |
| + } |
| + |
| + Stream<ProcessSignal> get stream => _controller.stream; |
| + |
| + void _listen() { |
| + var id = _setSignalHandler(signal._signalNumber); |
| + if (id is! int) { |
| + _controller.addError( |
| + new SignalException("Failed to listen for $signal", id)); |
| + return; |
| + } |
| + _id = id; |
| + var socket = new _RawSocket(new _NativeSocket.watch(id)); |
| + socket.listen((event) { |
| + if (event == RawSocketEvent.READ) { |
| + var bytes = socket.read(); |
| + for (int i = 0; i < bytes.length; i++) { |
| + _controller.add(signal); |
| + } |
| + } |
| + }); |
| + } |
| + |
| + void _cancel() { |
| + if (_id != null) { |
| + _clearSignalHandler(signal._signalNumber); |
| + _id = null; |
| + } |
| + } |
| + |
| + /* patch */ static int _setSignalHandler(int signal) |
| + native "Process_SetSignalHandler"; |
| + /* patch */ static int _clearSignalHandler(int signal) |
| + native "Process_ClearSignalHandler"; |
| +} |
| + |
| + |
| patch class _ProcessUtils { |
| /* patch */ static void _exit(int status) native "Process_Exit"; |
| /* patch */ static void _setExitCode(int status) |
| native "Process_SetExitCode"; |
| /* patch */ static void _sleep(int millis) native "Process_Sleep"; |
| /* patch */ static int _pid(Process process) native "Process_Pid"; |
| + /* patch */ static Stream<ProcessSignal> _watchSignal(ProcessSignal signal) { |
| + if (signal != ProcessSignal.SIGHUP && |
| + signal != ProcessSignal.SIGINT && |
| + signal != ProcessSignal.SIGUSR1 && |
| + signal != ProcessSignal.SIGUSR2 && |
| + signal != ProcessSignal.SIGWINCH) { |
|
Søren Gjesse
2013/12/18 08:07:14
Different set for Windows?
Anders Johnsen
2013/12/18 21:20:29
Done.
|
| + throw new SignalException( |
| + "It's not allowed to listen for $signal signals."); |
|
Søren Gjesse
2013/12/18 08:07:14
"Listening for signal $signal is not supported"
Anders Johnsen
2013/12/18 21:20:29
Done.
|
| + } |
| + if (_signalControllers[signal._signalNumber] == null) { |
| + _signalControllers[signal._signalNumber] = new _SignalController(signal); |
| + } |
| + return _signalControllers[signal._signalNumber].stream; |
| + } |
| } |