I am developing Mosek.jl.
That library works by creating a task object, adding data to it and calling
a solve function. When a user in interactive mode hits ctrl-c, calls to
native functions are terminated, and that leaves the task object in an
inconsistent state, meaning that even calling the destructor may cause it
to segfault. This is why I am trying to take over the ctrl-c signal. I do
something like this
(https://github.com/JuliaOpt/Mosek.jl/blob/sigint/src/msk8_functions.jl#L2291-L2308):
msk_global_break = false
function msk_global_sigint_handler(sig::Int32)
println("msk_global_sigint_handler")
global msk_global_break = true
nothing
end
function optimize(task_:: MSKtask)
trmcode_ = Array(Int32,(1,))
SIGINT=2
old_sighandler = ccall((:signal,"libc"),Ptr{Void},(Cint,Ptr{Void}),SIGINT,
cfunction(msk_global_sigint_handler, Void, (Cint,)))
res = @msk_ccall( "optimizetrm",Int32,(Ptr{Void},Ptr{Int32}),task_.task,
trmcode_)
ccall((:signal,"libc"),Void,(Cint,Ptr{Void}),SIGINT,old_sighandler)
global msk_global_break
if msk_global_break
global msk_global_break = false
throw(InterruptException())
end
if res != MSK_RES_OK
msg = getlasterror(task_)
throw(MosekError(res,msg))
end
(convert(Int32,trmcode_[1]))
end
During long calls the msk_global_break flag is checked, and if set, the
operation terminates in a controlled manner.
I have seen older answers to similar questions, saying that this could
cause problems, but have been told that threading may be handled different
now. Is this something I can expect to work in Julia 0.4 and/or 0.5? In
particular, if the native optimizetrm function creates multiple threads,
will this still work?