[julia-users] Re: signals handling

2014-06-17 Thread Stephen Chisholm
I'm able to catch the InterruptException with the code below when running 
in the REPL, but it doesn't seem to get thrown when running the code in a 
script.

while true
try sleep(1)
println(running...)
catch err 
println(error: $err)
end 
end


On Monday, 16 June 2014 18:30:36 UTC-3, Ivar Nesje wrote:

 SIGINT gets converted to a InterruptException, that can be caught in a 
 catch statement. If you happened to be in a ccall, you might cause your 
 program to be in a corrupt state and leak resources such as memory.

 I'm not sure how you can interact with other signals.



[julia-users] Re: signals handling

2014-06-17 Thread Stephen Chisholm
I'm able to register a callback function using signal in libc, see the code 
below.

SIGINT=2

function catch_function(x)
println(caught signal $x)
exit(0)::Nothing
end
catch_function_c = cfunction(catch_function, None, (Int64,))
ccall((:signal, libc), Void, (Int64, Ptr{Void}), SIGINT, catch_function_c)

while true
sleep(1)
end



On Tuesday, 17 June 2014 09:24:43 UTC-3, Stephen Chisholm wrote:

 I'm able to catch the InterruptException with the code below when running 
 in the REPL, but it doesn't seem to get thrown when running the code in a 
 script.

 while true
 try sleep(1)
 println(running...)
 catch err 
 println(error: $err)
 end 
 end


 On Monday, 16 June 2014 18:30:36 UTC-3, Ivar Nesje wrote:

 SIGINT gets converted to a InterruptException, that can be caught in a 
 catch statement. If you happened to be in a ccall, you might cause your 
 program to be in a corrupt state and leak resources such as memory.

 I'm not sure how you can interact with other signals.



Re: [julia-users] Re: signals handling

2014-06-17 Thread Stefan Karpinski
That is very unlikely to be reliable, but it's cool that it works. I think
that we probably should change SIGINT from raising a normal error to
triggering some kind of interrupt handling mechanism (which can in turn
raise an error by default).


On Tue, Jun 17, 2014 at 10:41 AM, Stephen Chisholm sbchish...@gmail.com
wrote:

 I'm able to register a callback function using signal in libc, see the
 code below.

 SIGINT=2

 function catch_function(x)
 println(caught signal $x)
 exit(0)::Nothing
 end
 catch_function_c = cfunction(catch_function, None, (Int64,))
 ccall((:signal, libc), Void, (Int64, Ptr{Void}), SIGINT,
 catch_function_c)

 while true
 sleep(1)
 end



 On Tuesday, 17 June 2014 09:24:43 UTC-3, Stephen Chisholm wrote:

 I'm able to catch the InterruptException with the code below when running
 in the REPL, but it doesn't seem to get thrown when running the code in a
 script.

 while true
 try sleep(1)
 println(running...)
 catch err
 println(error: $err)
 end
 end


 On Monday, 16 June 2014 18:30:36 UTC-3, Ivar Nesje wrote:

 SIGINT gets converted to a InterruptException, that can be caught in a
 catch statement. If you happened to be in a ccall, you might cause your
 program to be in a corrupt state and leak resources such as memory.

 I'm not sure how you can interact with other signals.




Re: [julia-users] Re: signals handling

2014-06-17 Thread Stephen Chisholm
I like the idea of an interrupt handling mechanism.  What do you see that 
would make the signal/libc approach unreliable?

On Tuesday, 17 June 2014 12:18:11 UTC-3, Stefan Karpinski wrote:

 That is very unlikely to be reliable, but it's cool that it works. I think 
 that we probably should change SIGINT from raising a normal error to 
 triggering some kind of interrupt handling mechanism (which can in turn 
 raise an error by default).


 On Tue, Jun 17, 2014 at 10:41 AM, Stephen Chisholm sbchi...@gmail.com 
 javascript: wrote:

 I'm able to register a callback function using signal in libc, see the 
 code below.

 SIGINT=2

 function catch_function(x)
 println(caught signal $x)
 exit(0)::Nothing
 end
 catch_function_c = cfunction(catch_function, None, (Int64,))
 ccall((:signal, libc), Void, (Int64, Ptr{Void}), SIGINT, 
 catch_function_c)

 while true
  sleep(1)
 end



 On Tuesday, 17 June 2014 09:24:43 UTC-3, Stephen Chisholm wrote:

 I'm able to catch the InterruptException with the code below when 
 running in the REPL, but it doesn't seem to get thrown when running the 
 code in a script.

 while true
 try sleep(1)
 println(running...)
 catch err 
 println(error: $err)
 end 
 end


 On Monday, 16 June 2014 18:30:36 UTC-3, Ivar Nesje wrote:

 SIGINT gets converted to a InterruptException, that can be caught in a 
 catch statement. If you happened to be in a ccall, you might cause your 
 program to be in a corrupt state and leak resources such as memory.

 I'm not sure how you can interact with other signals.




Re: [julia-users] Re: signals handling

2014-06-17 Thread Stefan Karpinski
There's very few things you can safely do in a signal handler. Calling a
julia function can potentially lead to code generation, GC, etc., all of
which is bad news in a signal handler. That's why we need a first-class
mechanism for this: install a Julia function as a handler and the system
arranges for your function to be called when the interrupt happens, but
safely.


On Tue, Jun 17, 2014 at 11:21 AM, Stephen Chisholm sbchish...@gmail.com
wrote:

 I like the idea of an interrupt handling mechanism.  What do you see that
 would make the signal/libc approach unreliable?


 On Tuesday, 17 June 2014 12:18:11 UTC-3, Stefan Karpinski wrote:

 That is very unlikely to be reliable, but it's cool that it works. I
 think that we probably should change SIGINT from raising a normal error to
 triggering some kind of interrupt handling mechanism (which can in turn
 raise an error by default).


 On Tue, Jun 17, 2014 at 10:41 AM, Stephen Chisholm sbchi...@gmail.com
 wrote:

 I'm able to register a callback function using signal in libc, see the
 code below.

 SIGINT=2

 function catch_function(x)
 println(caught signal $x)
 exit(0)::Nothing
 end
 catch_function_c = cfunction(catch_function, None, (Int64,))
 ccall((:signal, libc), Void, (Int64, Ptr{Void}), SIGINT,
 catch_function_c)

 while true
  sleep(1)
 end



 On Tuesday, 17 June 2014 09:24:43 UTC-3, Stephen Chisholm wrote:

 I'm able to catch the InterruptException with the code below when
 running in the REPL, but it doesn't seem to get thrown when running the
 code in a script.

 while true
 try sleep(1)
 println(running...)
 catch err
 println(error: $err)
 end
 end


 On Monday, 16 June 2014 18:30:36 UTC-3, Ivar Nesje wrote:

 SIGINT gets converted to a InterruptException, that can be caught in a
 catch statement. If you happened to be in a ccall, you might cause your
 program to be in a corrupt state and leak resources such as memory.

 I'm not sure how you can interact with other signals.





Re: [julia-users] Re: signals handling

2014-06-17 Thread Stephen Chisholm
That's a good point regarding code gen and garbage collection, etc.. I 
should be able to work with this for now but definitely look forward to a 
safer first-class mechanism.  Is there an issue opened for this on github?

On Tuesday, 17 June 2014 12:36:02 UTC-3, Stefan Karpinski wrote:

 There's very few things you can safely do in a signal handler. Calling a 
 julia function can potentially lead to code generation, GC, etc., all of 
 which is bad news in a signal handler. That's why we need a first-class 
 mechanism for this: install a Julia function as a handler and the system 
 arranges for your function to be called when the interrupt happens, but 
 safely.


 On Tue, Jun 17, 2014 at 11:21 AM, Stephen Chisholm sbchi...@gmail.com 
 javascript: wrote:

 I like the idea of an interrupt handling mechanism.  What do you see that 
 would make the signal/libc approach unreliable?


 On Tuesday, 17 June 2014 12:18:11 UTC-3, Stefan Karpinski wrote:

 That is very unlikely to be reliable, but it's cool that it works. I 
 think that we probably should change SIGINT from raising a normal error to 
 triggering some kind of interrupt handling mechanism (which can in turn 
 raise an error by default).


 On Tue, Jun 17, 2014 at 10:41 AM, Stephen Chisholm sbchi...@gmail.com 
 wrote:

 I'm able to register a callback function using signal in libc, see the 
 code below.

 SIGINT=2

 function catch_function(x)
 println(caught signal $x)
 exit(0)::Nothing
 end
 catch_function_c = cfunction(catch_function, None, (Int64,))
 ccall((:signal, libc), Void, (Int64, Ptr{Void}), SIGINT, 
 catch_function_c)

 while true
  sleep(1)
 end



 On Tuesday, 17 June 2014 09:24:43 UTC-3, Stephen Chisholm wrote:

 I'm able to catch the InterruptException with the code below when 
 running in the REPL, but it doesn't seem to get thrown when running the 
 code in a script.

 while true
 try sleep(1)
 println(running...)
 catch err 
 println(error: $err)
 end 
 end


 On Monday, 16 June 2014 18:30:36 UTC-3, Ivar Nesje wrote:

 SIGINT gets converted to a InterruptException, that can be caught in 
 a catch statement. If you happened to be in a ccall, you might cause 
 your 
 program to be in a corrupt state and leak resources such as memory.

 I'm not sure how you can interact with other signals.