Lines Matching defs:signo
139 * @param[in] signo, the value of the signal.
142 static bool ismarked(int signo)
144 return sig_chains[signo - 1].marked;
149 * @param[in] signo, the value of the signal.
154 static void signal_chain_handler(int signo, siginfo_t* siginfo, void* ucontext_raw)
156 SIGCHAIN_PRINT_DEBUG("%{public}s signo: %{public}d", __func__, signo);
162 if (sig_chains[signo - 1].sca_special_actions[idx].sca_sigaction == NULL) {
167 bool noreturn = (sig_chains[signo - 1].sca_special_actions[idx].sca_flags &
170 sigchain_sigmask(SIG_SETMASK, &sig_chains[signo - 1].sca_special_actions[idx].sca_mask,
178 if (signo == FREEZE_SIGNAL_35) {
196 __func__, idx, signo, (unsigned long long)sig_chains[signo - 1].sca_special_actions[idx].sca_sigaction,
197 noreturn, signo, thread_list_lock_status,
200 if (sig_chains[signo - 1].sca_special_actions[idx].sca_sigaction(signo,
203 SIGCHAIN_PRINT_ERROR("%{public}s call %{public}d rd sigchain action for signal: %{public}d directly return", __func__, idx, signo);
211 SIGCHAIN_PRINT_ERROR("signal_chain_handler sca_sigaction all null for signal: %{public}d", signo);
215 int sa_flags = sig_chains[signo - 1].sig_action.sa_flags;
219 sigorset(&mask, &ucontext->uc_sigmask, &sig_chains[signo - 1].sig_action.sa_mask);
222 sigaddset(&mask, signo);
229 __func__, signo, (unsigned long long)sig_chains[signo - 1].sig_action.sa_sigaction);
230 sig_chains[signo - 1].sig_action.sa_sigaction(signo, siginfo, ucontext_raw);
232 if (sig_chains[signo - 1].sig_action.sa_handler == SIG_IGN) {
233 SIGCHAIN_PRINT_ERROR("%{public}s SIG_IGN handler for signal: %{public}d", __func__, signo);
235 } else if (sig_chains[signo - 1].sig_action.sa_handler == SIG_DFL) {
236 SIGCHAIN_PRINT_ERROR("%{public}s SIG_DFL handler for signal: %{public}d", __func__, signo);
237 remove_all_special_handler(signo);
238 if (__syscall(SYS_rt_tgsigqueueinfo, __syscall(SYS_getpid), __syscall(SYS_gettid), signo, siginfo) != 0) {
239 SIGCHAIN_PRINT_ERROR("Failed to rethrow sig(%{public}d), errno(%{public}d).", signo, errno);
241 SIGCHAIN_PRINT_ERROR("pid(%{public}d) rethrow sig(%{public}d) success.", __syscall(SYS_getpid), signo);
245 __func__, (unsigned long long)sig_chains[signo - 1].sig_action.sa_handler, signo);
246 sig_chains[signo - 1].sig_action.sa_handler(signo);
255 * @param[in] signo, the value of the signal.
258 static void sigchain_register(int signo)
260 SIGCHAIN_PRINT_INFO("%{public}s signo: %{public}d", __func__, signo);
267 __libc_sigaction(signo, &signal_action, &sig_chains[signo - 1].sig_action);
272 * @param[in] signo, the value of the signal.
275 static void unregister_sigchain(int signo)
277 SIGCHAIN_PRINT_INFO("%{public}s signo: %{public}d", __func__, signo);
278 __libc_sigaction(signo, &sig_chains[signo - 1].sig_action, NULL);
279 sig_chains[signo - 1].marked = false;
284 * @param[in] signo, the value of the signal.
287 static void mark_signal_to_sigchain(int signo)
289 SIGCHAIN_PRINT_INFO("%{public}s signo: %{public}d", __func__, signo);
290 if (!sig_chains[signo - 1].marked) {
291 sigchain_register(signo);
292 sig_chains[signo - 1].marked = true;
298 * @param[in] signo, the value of the signal.
302 static void setaction(int signo, const struct sigaction *restrict new_sa)
304 SIGCHAIN_PRINT_DEBUG("%{public}s signo: %{public}d", __func__, signo);
305 sig_chains[signo - 1].sig_action = *new_sa;
310 * @param[in] signo, the value of the signal.
313 static struct sigaction getaction(int signo)
315 SIGCHAIN_PRINT_DEBUG("%{public}s signo: %{public}d", __func__, signo);
316 return sig_chains[signo - 1].sig_action;
321 * @param[in] signo, the value of the signal.
325 static void add_special_handler(int signo, struct signal_chain_action* sa)
327 SIGCHAIN_PRINT_INFO("%{public}s signo: %{public}d", __func__, signo);
329 if (sig_chains[signo - 1].sca_special_actions[i].sca_sigaction == NULL) {
330 sig_chains[signo - 1].sca_special_actions[i] = *sa;
331 SIGCHAIN_PRINT_INFO("%{public}s signo %{public}d is registered with special handler!", __func__, signo);
341 * @param[in] signo, the value of the signal.
345 static void rm_special_handler(int signo, bool (*fn)(int, siginfo_t*, void*))
347 SIGCHAIN_PRINT_INFO("%{public}s signo: %{public}d", __func__, signo);
350 if (sig_chains[signo - 1].sca_special_actions[i].sca_sigaction == fn) {
351 sig_chains[signo - 1].sca_special_actions[i].sca_sigaction = NULL;
354 if (sig_chains[signo - 1].sca_special_actions[k].sca_sigaction == NULL) {
359 unregister_sigchain(signo);
365 SIGCHAIN_PRINT_FATAL("%{public}s failed to remove the special handler!. signo: %{public}d",
366 __func__, signo);
372 * @param[in] signo, the value of the signal.
376 void add_special_signal_handler(int signo, struct signal_chain_action* sa)
378 SIGCHAIN_PRINT_INFO("%{public}s signo: %{public}d", __func__, signo);
379 if (signo <= 0 || signo >= _NSIG) {
380 SIGCHAIN_PRINT_FATAL("%{public}s Invalid signal %{public}d", __func__, signo);
385 add_special_handler(signo, sa);
386 mark_signal_to_sigchain(signo);
391 * @param[in] signo, the value of the signal.
395 void remove_special_signal_handler(int signo, bool (*fn)(int, siginfo_t*, void*))
397 SIGCHAIN_PRINT_INFO("%{public}s signo: %{public}d", __func__, signo);
398 if (signo <= 0 || signo >= _NSIG) {
399 SIGCHAIN_PRINT_FATAL("%{public}s Invalid signal %{public}d", __func__, signo);
403 if (ismarked(signo)) {
405 rm_special_handler(signo, fn);
411 * @param[in] signo, the value of the signal.
414 void remove_all_special_handler(int signo)
416 SIGCHAIN_PRINT_INFO("%{public}s signo: %{public}d", __func__, signo);
417 if (signo <= 0 || signo >= _NSIG) {
418 SIGCHAIN_PRINT_FATAL("%{public}s Invalid signal %{public}d", __func__, signo);
422 if (ismarked(signo)) {
425 sig_chains[signo - 1].sca_special_actions[i].sca_sigaction = NULL;
427 unregister_sigchain(signo);
433 * @param[in] signo, the value of the signal.
437 void add_special_handler_at_last(int signo, struct signal_chain_action* sa)
439 SIGCHAIN_PRINT_INFO("%{public}s signo: %{public}d", __func__, signo);
440 if (signo <= 0 || signo >= _NSIG) {
441 SIGCHAIN_PRINT_FATAL("%{public}s Invalid signal %{public}d", __func__, signo);
445 if (sig_chains[signo - 1].sca_special_actions[SIGNAL_CHAIN_SPECIAL_ACTION_MAX - 1].sca_sigaction == NULL) {
446 sig_chains[signo - 1].sca_special_actions[SIGNAL_CHAIN_SPECIAL_ACTION_MAX - 1] = *sa;
447 mark_signal_to_sigchain(signo);
456 * @param[in] signo, the value of the signal.
461 bool intercept_sigaction(int signo, const struct sigaction *restrict sa,
464 SIGCHAIN_PRINT_DEBUG("%{public}s signo: %{public}d", __func__, signo);
465 if (signo <= 0 || signo >= _NSIG) {
466 SIGCHAIN_PRINT_ERROR("%{public}s Invalid signal %{public}d", __func__, signo);
470 if (ismarked(signo)) {
471 struct sigaction saved_action = getaction(signo);
474 setaction(signo, sa);