# See the License for the specific language governing permissions and
# limitations under the License.
-# Module to manage standard C signals
+# ANSI C signal handling
#
# Common usage imply 5 steps:
#
#define _POSIX_SOURCE 1
#include <signal.h>
#include <stdio.h>
+ #include <unistd.h>
/*
*/
char raised; /* !=0 if has been raised */
void* handler; /* instance to receive call */
char safely; /* if !=0 then manage signal safely, otherwise react when raised */
- } nit_signals_list[32] = {0x0};
+ } nit_signals_list[32] = {{0}};
/* Receiver to all signals
If unsafe, it calls directly the Nit receiver,
# otherwise the receiver is invoked when the signal is raised, it may
# crash the Nit system but is unavoidable for unstoppable signals.
fun handle_signal(signal: Int, safely: Bool) import receive_signal `{
- SignalHandler last_handler;
if (signal < 32 && signal >=0) {
struct sigaction act;
sigemptyset(&act.sa_mask);
sigaction(signal, &act, NULL);
- last_handler = (SignalHandler)nit_signals_list[signal].handler;
+ #ifdef SignalHandler_decr_ref
+ SignalHandler last_handler = (SignalHandler)nit_signals_list[signal].handler;
if (last_handler != NULL)
SignalHandler_decr_ref(last_handler);
+ #endif
nit_signals_list[signal].handler = self;
+
+ #ifdef SignalHandler_incr_ref
SignalHandler_incr_ref(self);
+ #endif
nit_signals_list[signal].safely = safely;
+
nit_SignalHandler_receive_signal = SignalHandler_receive_signal;
}
`}
# Set to ignore the signal
fun ignore_signal(signal: Int) `{
- SignalHandler last_handler;
if (signal < 32 && signal >=0) {
struct sigaction act;
sigemptyset(&act.sa_mask);
act.sa_handler = SIG_IGN;
sigaction(signal, &act, NULL);
- last_handler = (SignalHandler)nit_signals_list[signal].handler;
+ #ifdef SignalHandler_decr_ref
+ SignalHandler last_handler = (SignalHandler)nit_signals_list[signal].handler;
if (last_handler != NULL)
SignalHandler_decr_ref(last_handler);
+ #endif
}
`}
# Set default action for the signal
fun default_signal(signal: Int) `{
- SignalHandler last_handler;
if (signal < 32 && signal >=0) {
struct sigaction act;
sigemptyset(&act.sa_mask);
act.sa_handler = SIG_DFL;
sigaction(signal, &act, NULL);
- last_handler = (SignalHandler)nit_signals_list[signal].handler;
+ #ifdef SignalHandler_decr_ref
+ SignalHandler last_handler = (SignalHandler)nit_signals_list[signal].handler;
if (last_handler != NULL)
SignalHandler_decr_ref(last_handler);
+ #endif
}
`}
end