new module unix.signals: app-level signal handlers
example: IN: scratchpad USING: unix.ffi unix.signals ; Loading resource:basis/unix/signals/signals.factor IN: scratchpad [ V{ "Me not that kind of orc!" "Me busy, leave me alone!" "Work work" "Zug zug" } pop print flush ] SIGINFO add-signal-handler IN: scratchpad load: 0.60 cmd: factor 41541 running 0.28u 0.16s Zug zug load: 0.71 cmd: factor 41541 running 0.28u 0.16s Work work load: 0.71 cmd: factor 41541 running 0.28u 0.16s Me busy, leave me alone! load: 0.73 cmd: factor 41541 running 0.28u 0.16s Me not that kind of orc!db4
parent
0c58fd5c26
commit
fc7c175c9f
|
@ -187,12 +187,23 @@ M: stdin cancel-operation
|
||||||
size-read-fd <fd> init-fd <input-port> >>size
|
size-read-fd <fd> init-fd <input-port> >>size
|
||||||
data-read-fd <fd> >>data ;
|
data-read-fd <fd> >>data ;
|
||||||
|
|
||||||
|
SYMBOL: dispatch-signal-hook
|
||||||
|
|
||||||
|
dispatch-signal-hook [ [ drop ] ] initialize
|
||||||
|
|
||||||
: signal-pipe-fd ( -- n )
|
: signal-pipe-fd ( -- n )
|
||||||
OBJ-SIGNAL-PIPE special-object ; inline
|
OBJ-SIGNAL-PIPE special-object ; inline
|
||||||
|
|
||||||
|
: signal-pipe-loop ( port -- )
|
||||||
|
'[
|
||||||
|
int heap-size _ io:stream-read
|
||||||
|
dup [ int deref dispatch-signal-hook get call( x -- ) ] when*
|
||||||
|
] loop ;
|
||||||
|
|
||||||
: start-signal-pipe-thread ( -- )
|
: start-signal-pipe-thread ( -- )
|
||||||
signal-pipe-fd [ <fd> init-fd <input-port>
|
signal-pipe-fd [
|
||||||
'[ [ 4 _ io:stream-read ] loop ] "Signals" spawn drop
|
<fd> init-fd <input-port>
|
||||||
|
'[ _ signal-pipe-loop ] "Signals" spawn drop
|
||||||
] when* ;
|
] when* ;
|
||||||
|
|
||||||
M: unix init-stdio
|
M: unix init-stdio
|
||||||
|
|
|
@ -168,4 +168,7 @@ FUNCTION: int unlink ( c-string path ) ;
|
||||||
FUNCTION: int utimes ( c-string path, timeval[2] times ) ;
|
FUNCTION: int utimes ( c-string path, timeval[2] times ) ;
|
||||||
FUNCTION: ssize_t write ( int fd, void* buf, size_t nbytes ) ;
|
FUNCTION: ssize_t write ( int fd, void* buf, size_t nbytes ) ;
|
||||||
|
|
||||||
|
FUNCTION: int kill ( pid_t pid, int signal ) ;
|
||||||
|
FUNCTION: int raise ( int signal ) ;
|
||||||
|
|
||||||
"librt" "librt.so" cdecl add-library
|
"librt" "librt.so" cdecl add-library
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
USING: calendar continuations io kernel math namespaces threads
|
||||||
|
tools.test unix.ffi unix.signals ;
|
||||||
|
IN: unix.signals.tests
|
||||||
|
|
||||||
|
SYMBOL: sigusr1-count
|
||||||
|
0 sigusr1-count set-global
|
||||||
|
|
||||||
|
CONSTANT: test-sigusr1-handler [ 1 sigusr1-count +@ ]
|
||||||
|
|
||||||
|
"=========" print
|
||||||
|
"NOTE: This test uses SIGUSR1. It may break or cause unwanted behavior" print
|
||||||
|
"if other SIGUSR1 handlers are installed." print
|
||||||
|
"=========" print flush
|
||||||
|
|
||||||
|
test-sigusr1-handler SIGUSR1 add-signal-handler
|
||||||
|
[
|
||||||
|
|
||||||
|
[ 1 ] [
|
||||||
|
sigusr1-count get-global
|
||||||
|
SIGUSR1 raise drop
|
||||||
|
0.5 seconds sleep
|
||||||
|
sigusr1-count get-global
|
||||||
|
swap -
|
||||||
|
] unit-test
|
||||||
|
|
||||||
|
] [ test-sigusr1-handler SIGUSR1 remove-signal-handler ] [ ] cleanup
|
||||||
|
|
||||||
|
[ 0 ] [
|
||||||
|
sigusr1-count get-global
|
||||||
|
SIGUSR1 raise drop
|
||||||
|
0.5 seconds sleep
|
||||||
|
sigusr1-count get-global swap -
|
||||||
|
] unit-test
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
! (c)2011 Joe Groff bsd license
|
||||||
|
USING: assocs io.backend.unix kernel namespaces sequences
|
||||||
|
threads ;
|
||||||
|
IN: unix.signals
|
||||||
|
|
||||||
|
<PRIVATE
|
||||||
|
|
||||||
|
SYMBOL: signal-handlers
|
||||||
|
|
||||||
|
signal-handlers [ H{ } ] initialize
|
||||||
|
|
||||||
|
PRIVATE>
|
||||||
|
|
||||||
|
: dispatch-signal ( sig -- )
|
||||||
|
signal-handlers get-global at [ in-thread ] each ;
|
||||||
|
|
||||||
|
: add-signal-handler ( handler: ( -- ) sig -- )
|
||||||
|
signal-handlers get-global push-at ;
|
||||||
|
|
||||||
|
: remove-signal-handler ( handler sig -- )
|
||||||
|
signal-handlers get-global at [ remove! drop ] [ drop ] if* ;
|
||||||
|
|
||||||
|
[ dispatch-signal ] dispatch-signal-hook set-global
|
|
@ -318,6 +318,12 @@ void factor_vm::unix_init_signals()
|
||||||
|
|
||||||
init_sigaction_with_handler(&enqueue_sigaction, enqueue_signal_handler);
|
init_sigaction_with_handler(&enqueue_sigaction, enqueue_signal_handler);
|
||||||
sigaction_safe(SIGWINCH,&enqueue_sigaction,NULL);
|
sigaction_safe(SIGWINCH,&enqueue_sigaction,NULL);
|
||||||
|
sigaction_safe(SIGUSR1,&enqueue_sigaction,NULL);
|
||||||
|
sigaction_safe(SIGCONT,&enqueue_sigaction,NULL);
|
||||||
|
sigaction_safe(SIGURG,&enqueue_sigaction,NULL);
|
||||||
|
sigaction_safe(SIGIO,&enqueue_sigaction,NULL);
|
||||||
|
sigaction_safe(SIGPROF,&enqueue_sigaction,NULL);
|
||||||
|
sigaction_safe(SIGVTALRM,&enqueue_sigaction,NULL);
|
||||||
#ifdef SIGINFO
|
#ifdef SIGINFO
|
||||||
sigaction_safe(SIGINFO,&enqueue_sigaction,NULL);
|
sigaction_safe(SIGINFO,&enqueue_sigaction,NULL);
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue