diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2023-01-09 20:02:14 +0300 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2023-01-09 20:02:14 +0300 |
commit | 9ee1e1b693ad7785e07f126ec725279fe605d621 (patch) | |
tree | 0b4f573f5a3a499beca7361b05758cfdd225c90f /winsup/cygwin/pinfo.cc | |
parent | 7886327fbf92e6ad8bd3f27ea9fa8bd54cc44bdd (diff) |
Cygwin: /proc/<PID>/status: simplify code generating signal info
The code generating the signal info in _pinfo::siginfo() and in
commune_process() are doing the same thing. Create a local static
function commune_process_siginfo() to have the code in one place
only. Remove a useless sigpending() call.
Fixes: 9a3c058f6612 ("Cygwin: /proc/<PID>/status: Fill SigPnd, SigBlk and SigIgn values with life")
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Diffstat (limited to 'winsup/cygwin/pinfo.cc')
-rw-r--r-- | winsup/cygwin/pinfo.cc | 42 |
1 files changed, 21 insertions, 21 deletions
diff --git a/winsup/cygwin/pinfo.cc b/winsup/cygwin/pinfo.cc index 586a4204d..ff10d9cf8 100644 --- a/winsup/cygwin/pinfo.cc +++ b/winsup/cygwin/pinfo.cc @@ -603,6 +603,19 @@ _pinfo::alive () return !!h; } +static commune_result +commune_process_siginfo () +{ + commune_result res = { 0 }; + + res.pnd = sig_send (myself, __SIGPENDINGALL, NULL); + res.blk = cygheap->compute_sigblkmask (); + for (int sig = 1; sig < NSIG; ++sig) + if (global_sigs[sig].sa_handler == SIG_IGN) + res.ign |= SIGTOMASK (sig); + return res; +} + DWORD commune_process (void *arg) { @@ -679,13 +692,7 @@ commune_process (void *arg) case PICOM_SIGINFO: { sigproc_printf ("processing PICOM_SIGINFO"); - commune_result cr; - sigpending (&cr.pnd); - cr.pnd = sig_send (myself, __SIGPENDINGALL, NULL); - cr.blk = cygheap->compute_sigblkmask (); - for (int sig = 1; sig < NSIG; ++sig) - if (global_sigs[sig].sa_handler == SIG_IGN) - cr.ign |= SIGTOMASK (sig); + commune_result cr = commune_process_siginfo (); if (!WritePipeOverlapped (tothem, &cr, sizeof cr, &nr, 1000L)) sigproc_printf ("WritePipeOverlapped siginfo failed, %E"); break; @@ -1026,24 +1033,17 @@ _pinfo::root (size_t& n) int _pinfo::siginfo (sigset_t &pnd, sigset_t &blk, sigset_t &ign) { + commune_result cr; + if (!pid) return -1; if (pid != myself->pid && !ISSTATE (this, PID_NOTCYGWIN)) - { - commune_result cr = commune_request (PICOM_SIGINFO); - pnd = cr.pnd; - blk = cr.blk; - ign = cr.ign; - } + cr = commune_request (PICOM_SIGINFO); else - { - pnd = sig_send (myself, __SIGPENDINGALL, NULL); - blk = cygheap->compute_sigblkmask (); - ign = 0; - for (int sig = 1; sig < NSIG; ++sig) - if (global_sigs[sig].sa_handler == SIG_IGN) - ign |= SIGTOMASK (sig); - } + cr = commune_process_siginfo (); + pnd = cr.pnd; + blk = cr.blk; + ign = cr.ign; return -1; } |