1 /* This file is part of NIT ( http://www.nitlanguage.org ).
3 * Copyright 2011 Alexis Laferrière <alexis.laf@xymus.net>
5 * This file is free software, which comes along with NIT. This software is
6 * distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
7 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
8 * PARTICULAR PURPOSE. You can modify it is you want, provided this header
9 * is kept unaltered, and a notification of the changes is added.
10 * You are allowed to redistribute it and sell it, alone or is a part of
15 #define _POSIX_SOURCE 1
19 #include "signals.nit.h"
22 Structure to manage each possible signals
23 are used in an array of 32 maximum signals.
24 This array is global to the software.
26 struct nit_signals_ent
{
27 char raised
; /* !=0 if has been raised */
28 SignalHandler handler
; /* instance to receive call */
29 char safely
; /* if !=0 then manage signal safely, otherwise react when raised */
30 } nit_signals_list
[32] = {0x0};
32 /* Receiver to all signals
33 If unsafe, it calls directly the Nit receiver,
34 otherwise it marks the signal as raised and returns.
36 void receiver( int sig
)
38 if ( sig
< 32 && sig
>=0 )
40 if ( nit_signals_list
[sig
].safely
) {
41 nit_signals_list
[ sig
].raised
+= 1;
43 SignalHandler_receive_signal( nit_signals_list
[ sig
].handler
, sig
);
49 C implementation of signals::SignalHandler::handle_signal
51 Imported methods signatures:
52 void SignalHandler_receive_signal( SignalHandler recv, bigint signal ) for signals::SignalHandler::receive_signal
54 void SignalHandler_handle_signal___impl( SignalHandler recv
, bigint signal
, int safely
)
56 SignalHandler last_handler
;
57 if ( signal
< 32 && signal
>=0 ) {
59 sigemptyset(&act
.sa_mask
);
61 act
.sa_handler
= receiver
;
63 sigaction(signal
, &act
, NULL
);
65 last_handler
= nit_signals_list
[signal
].handler
;
66 if ( last_handler
!= NULL
)
67 SignalHandler_decr_ref( last_handler
);
69 nit_signals_list
[signal
].handler
= recv
;
70 SignalHandler_incr_ref( recv
);
72 nit_signals_list
[signal
].safely
= safely
;
77 C implementation of signals::SignalHandler::ignore_signal
79 void SignalHandler_ignore_signal___impl( SignalHandler recv
, bigint signal
)
81 SignalHandler last_handler
;
82 if ( signal
< 32 && signal
>=0 ) {
84 sigemptyset(&act
.sa_mask
);
86 act
.sa_handler
= SIG_IGN
;
87 sigaction(signal
, &act
, NULL
);
89 last_handler
= nit_signals_list
[signal
].handler
;
90 if ( last_handler
!= NULL
)
91 SignalHandler_decr_ref( last_handler
);
96 C implementation of signals::SignalHandler::default_signal
98 void SignalHandler_default_signal___impl( SignalHandler recv
, bigint signal
)
100 SignalHandler last_handler
;
101 if ( signal
< 32 && signal
>=0 ) {
102 struct sigaction act
;
103 sigemptyset(&act
.sa_mask
);
105 act
.sa_handler
= SIG_DFL
;
106 sigaction(signal
, &act
, NULL
);
108 last_handler
= nit_signals_list
[signal
].handler
;
109 if ( last_handler
!= NULL
)
110 SignalHandler_decr_ref( last_handler
);
114 void Object_set_alarm___impl( Object recv
, bigint sec
)
120 C implementation of signals::Object::check_signals
122 Imported methods signatures:
123 void SignalHandler_receive_signal( SignalHandler recv, bigint signal ) for signals::SignalHandler::receive_signal
125 int Object_check_signals___impl( Object recv
)
128 int raised_something
= 0;
130 for ( sig
= 0; sig
< 32; sig
++ )
131 if ( nit_signals_list
[sig
].raised
) {
132 nit_signals_list
[sig
].raised
= 0;
133 raised_something
= 1;
134 SignalHandler_receive_signal( nit_signals_list
[sig
].handler
, sig
);
137 return raised_something
;