Signal Handlers
TERR
supports installing signal handlers to catch illegal operations that occur in
foreign code called via the
.C()
or
.Call()
functions.
A signal handler can catch such illegal operations as referencing an illegal memory location. If an illegal operation is caught by a signal handler, it generates an error "Unhandled exception in foreign function" rather than crashing the process. Currently, these signal handlers are disabled by default, because we found that they could possibly interfere with the signal handlers used by Java.
Sometimes when investigating unexpected failures, you might want to enable the signal handlers. You can enable signal handlers when starting the Spotfire Enterprise Runtime for R console application by specifying the option:
--enable-signal-handlers
Alternatively, you can enable them by starting the engine from Java with the following engine parameter:
TerrJava.startEngine("FFInterface.SignalHandlersEnabled=TRUE")
If you want to enable signal handling when using Java on Linux, it might
be helpful to set the environment variable
LD_PRELOAD
so the signal handlers set up by
TERR
are "chained" after the Java signal handlers, as described in the URL
http://www.oracle.com/technetwork/java/javase/signals-139944.html#gbzcz.
According to this URL, setting the environment variable
LD_PRELOAD
to
<libjvm.so-directory-in-java-tree>/libjsig.so
causes Java to link in the special libjsig.so library, which handles both Java
signal handlers and native code with its own handlers. We have found several
cases where this workaround solves the problem of embedding
TERR
within a complex Java application.