v / vlib / os
Raw file | 133 loc (128 sloc) | 2.09 KB | Latest commit hash 017ace6ea
1module os
2
3fn signal_str(signal Signal) string {
4 mut result := signal.str().to_upper()
5 result = 'SIG${result}'
6 return result
7}
8
9fn signal_from_str(str JS.String) Signal {
10 s := string(str)
11 return match s {
12 'SIGHUP' {
13 Signal.hup
14 }
15 'SIGINT' {
16 Signal.int
17 }
18 'SIGQUIT' {
19 Signal.quit
20 }
21 'SIGILL' {
22 Signal.ill
23 }
24 'SIGTRAP' {
25 Signal.trap
26 }
27 'SIGABRT' {
28 Signal.abrt
29 }
30 'SIGBUS' {
31 Signal.bus
32 }
33 'SIGFPE' {
34 Signal.fpe
35 }
36 'SIGKILL' {
37 Signal.kill
38 }
39 'SIGUSR1' {
40 Signal.usr1
41 }
42 'SIGSEGV' {
43 Signal.segv
44 }
45 'SIGUSR2' {
46 Signal.usr2
47 }
48 'SIGPIPE' {
49 Signal.pipe
50 }
51 'SIGALRM' {
52 Signal.alrm
53 }
54 'SIGTERM' {
55 Signal.term
56 }
57 'SIGSTKFLT' {
58 Signal.stkflt
59 }
60 'SIGCHLD' {
61 Signal.chld
62 }
63 'SIGCONT' {
64 Signal.cont
65 }
66 'SIGSTOP' {
67 Signal.stop
68 }
69 'SIGTSTP' {
70 Signal.tstp
71 }
72 'SIGTTIN' {
73 Signal.ttin
74 }
75 'SIGTTOU' {
76 Signal.ttou
77 }
78 'SIGURG' {
79 Signal.urg
80 }
81 'SIGXCPU' {
82 Signal.xcpu
83 }
84 'SIGXFSZ' {
85 Signal.xfsz
86 }
87 'SIGVTALRM' {
88 Signal.vtalrm
89 }
90 'SIGPROF' {
91 Signal.prof
92 }
93 'SIGWINCH' {
94 Signal.winch
95 }
96 'SIGPOLL' {
97 Signal.poll
98 }
99 'SIGPWR' {
100 Signal.pwr
101 }
102 'SIGSYS' {
103 Signal.sys
104 }
105 else {
106 panic('unknown signal: ${s}')
107 }
108 }
109}
110
111// signal will assign `handler` callback to be called when `signum` signal is received.
112//
113// # Behaviour on different backends:
114// - NodeJS: Will use `process.on` and add `handler` to the listeners list for `signum` to happen
115// - Browser: Will use `window.addEventListener` for handling signal
116//
117// TODO: Add signal events implementation for browser backend
118pub fn signal_opt(signum Signal, handler SignalHandler) !SignalHandler {
119 signame := signal_str(signum)
120 _ := signame
121 $if js_node {
122 #$process.on(signame.str,function (sig) { handler(os__signal_from_str(sig));});
123
124 return handler
125 } $else $if js_browser {
126 #let event = new CustomEvent(signame.str, {detail: signum});
127 #window.addEventListener(signame.str, function (e) { handler(e.detail); });
128
129 return handler
130 } $else {
131 return error('signal handlers are not supported on bare JS')
132 }
133}