138 signal_unlock(); |
139 signal_unlock(); |
139 return oldhandler; |
140 return oldhandler; |
140 } |
141 } |
141 } |
142 } |
142 |
143 |
143 sa_handler_t signal(int sig, sa_handler_t disp) { |
144 JNIEXPORT sa_handler_t JNICALL |
|
145 signal(int sig, sa_handler_t disp) { |
144 return set_signal(sig, disp, false); |
146 return set_signal(sig, disp, false); |
145 } |
147 } |
146 |
148 |
147 sa_handler_t sigset(int sig, sa_handler_t disp) { |
149 JNIEXPORT sa_handler_t JNICALL |
|
150 sigset(int sig, sa_handler_t disp) { |
148 return set_signal(sig, disp, true); |
151 return set_signal(sig, disp, true); |
149 } |
152 } |
150 |
153 |
151 static int call_os_sigaction(int sig, const struct sigaction *act, |
154 static int call_os_sigaction(int sig, const struct sigaction *act, |
152 struct sigaction *oact) { |
155 struct sigaction *oact) { |
159 } |
162 } |
160 } |
163 } |
161 return (*os_sigaction)(sig, act, oact); |
164 return (*os_sigaction)(sig, act, oact); |
162 } |
165 } |
163 |
166 |
164 int sigaction(int sig, const struct sigaction *act, struct sigaction *oact) { |
167 JNIEXPORT int JNICALL |
|
168 sigaction(int sig, const struct sigaction *act, struct sigaction *oact) { |
165 int res; |
169 int res; |
166 bool sigused; |
170 bool sigused; |
167 struct sigaction oldAct; |
171 struct sigaction oldAct; |
168 |
172 |
169 signal_lock(); |
173 signal_lock(); |
204 return res; |
208 return res; |
205 } |
209 } |
206 } |
210 } |
207 |
211 |
208 /* The three functions for the jvm to call into. */ |
212 /* The three functions for the jvm to call into. */ |
209 void JVM_begin_signal_setting() { |
213 JNIEXPORT void JNICALL |
|
214 JVM_begin_signal_setting() { |
210 signal_lock(); |
215 signal_lock(); |
211 sigemptyset(&jvmsigs); |
216 sigemptyset(&jvmsigs); |
212 jvm_signal_installing = true; |
217 jvm_signal_installing = true; |
213 tid = pthread_self(); |
218 tid = pthread_self(); |
214 signal_unlock(); |
219 signal_unlock(); |
215 } |
220 } |
216 |
221 |
217 void JVM_end_signal_setting() { |
222 JNIEXPORT void JNICALL |
|
223 JVM_end_signal_setting() { |
218 signal_lock(); |
224 signal_lock(); |
219 jvm_signal_installed = true; |
225 jvm_signal_installed = true; |
220 jvm_signal_installing = false; |
226 jvm_signal_installing = false; |
221 pthread_cond_broadcast(&cond); |
227 pthread_cond_broadcast(&cond); |
222 signal_unlock(); |
228 signal_unlock(); |
223 } |
229 } |
224 |
230 |
225 struct sigaction *JVM_get_signal_action(int sig) { |
231 JNIEXPORT struct sigaction * JNICALL |
|
232 JVM_get_signal_action(int sig) { |
226 /* Does race condition make sense here? */ |
233 /* Does race condition make sense here? */ |
227 if (sigismember(&jvmsigs, sig)) { |
234 if (sigismember(&jvmsigs, sig)) { |
228 return &sact[sig]; |
235 return &sact[sig]; |
229 } |
236 } |
230 return NULL; |
237 return NULL; |