diff options
author | Nathan Scott <nathans@redhat.com> | 2021-10-05 13:20:13 +1100 |
---|---|---|
committer | Nathan Scott <nathans@redhat.com> | 2021-10-05 15:53:18 +1100 |
commit | 8ac8542b6e710fde88aa444f8379a4ddfdfce6d3 (patch) | |
tree | fa86211c84bdede4d93866fe5c418ded41d3c44a | |
parent | f75a8bc3a1131151181d6794000b10063400221e (diff) |
Handle interrupted sampling from within libpcp PDU transfers
This situation can arise if pcp-htop screen is resized right
at the same time sampling from pmcd(1) is happening. Have a
couple more goes at it before giving up entirely; once there
is no data available though we cannot proceed into accessing
the sample result data structure (segv will result) so a new
short-circuit guard is added there also.
-rw-r--r-- | pcp/PCPMetric.c | 5 | ||||
-rw-r--r-- | pcp/PCPProcessList.c | 3 |
2 files changed, 6 insertions, 2 deletions
diff --git a/pcp/PCPMetric.c b/pcp/PCPMetric.c index d1afc801..f6d4c97b 100644 --- a/pcp/PCPMetric.c +++ b/pcp/PCPMetric.c @@ -164,7 +164,10 @@ bool PCPMetric_fetch(struct timeval* timestamp) { pmFreeResult(pcp->result); pcp->result = NULL; } - int sts = pmFetch(pcp->totalMetrics, pcp->fetch, &pcp->result); + int sts, count = 0; + do { + sts = pmFetch(pcp->totalMetrics, pcp->fetch, &pcp->result); + } while (sts == PM_ERR_IPC && ++count < 3); if (sts < 0) { if (pmDebugOptions.appl0) fprintf(stderr, "Error: cannot fetch metric values: %s\n", diff --git a/pcp/PCPProcessList.c b/pcp/PCPProcessList.c index e324e337..554e43d4 100644 --- a/pcp/PCPProcessList.c +++ b/pcp/PCPProcessList.c @@ -680,7 +680,8 @@ void ProcessList_goThroughEntries(ProcessList* super, bool pauseProcessUpdate) { PCPMetric_enable(PCP_PROC_SMAPS_SWAPPSS, smaps_flag && enabled); struct timeval timestamp; - PCPMetric_fetch(×tamp); + if (PCPMetric_fetch(×tamp) != true) + return; double sample = this->timestamp; this->timestamp = pmtimevalToReal(×tamp); |