diff options
author | Explorer09 <explorer09@gmail.com> | 2023-08-17 04:21:05 +0800 |
---|---|---|
committer | BenBE <BenBE@geshi.org> | 2023-08-18 12:52:28 +0200 |
commit | 076b913c7f876ba0489b9751043eeb61aa34680f (patch) | |
tree | 35173363985f959a0e77993b07c3b9fe09a2c1c6 /pcp | |
parent | 93d76fd37627a3594f52afda32092fa3858f28dc (diff) |
Compare all percentage fields with compareRealNumbers()
The SPACESHIP_NUMBER() macro does not work well with floating point
values that are possible to be NaNs. Change the compare logic of all
percentage fields of Process entries to use compareRealNumbers().
Signed-off-by: Kang-Che Sung <explorer09@gmail.com>
Diffstat (limited to 'pcp')
-rw-r--r-- | pcp/PCPDynamicColumn.c | 4 | ||||
-rw-r--r-- | pcp/PCPProcess.c | 16 |
2 files changed, 5 insertions, 15 deletions
diff --git a/pcp/PCPDynamicColumn.c b/pcp/PCPDynamicColumn.c index 23b896e6..2481d81d 100644 --- a/pcp/PCPDynamicColumn.c +++ b/pcp/PCPDynamicColumn.c @@ -338,9 +338,9 @@ int PCPDynamicColumn_compareByKey(const PCPProcess* p1, const PCPProcess* p2, Pr case PM_TYPE_U64: return SPACESHIP_NUMBER(atom2.ull, atom1.ull); case PM_TYPE_FLOAT: - return SPACESHIP_NUMBER(atom2.f, atom1.f); + return compareRealNumbers(atom2.f, atom1.f); case PM_TYPE_DOUBLE: - return SPACESHIP_NUMBER(atom2.d, atom1.d); + return compareRealNumbers(atom2.d, atom1.d); default: break; } diff --git a/pcp/PCPProcess.c b/pcp/PCPProcess.c index 2cb27814..eadc9eb4 100644 --- a/pcp/PCPProcess.c +++ b/pcp/PCPProcess.c @@ -199,16 +199,6 @@ static void PCPProcess_writeField(const Process* this, RichString* str, ProcessF RichString_appendWide(str, attr, buffer); } -/* Compares floating point values for ordering data entries. In this function, - NaN is considered "less than" any other floating point value (regardless of - sign), and two NaNs are considered "equal" regardless of payload. */ -static int compareRealNumbers(double a, double b) { - int result = isgreater(a, b) - isgreater(b, a); - if (result) - return result; - return !isNaN(a) - !isNaN(b); -} - static int PCPProcess_compareByKey(const Process* v1, const Process* v2, ProcessField key) { const PCPProcess* p1 = (const PCPProcess*)v1; const PCPProcess* p2 = (const PCPProcess*)v2; @@ -263,11 +253,11 @@ static int PCPProcess_compareByKey(const Process* v1, const Process* v2, Process case OOM: return SPACESHIP_NUMBER(p1->oom, p2->oom); case PERCENT_CPU_DELAY: - return SPACESHIP_NUMBER(p1->cpu_delay_percent, p2->cpu_delay_percent); + return compareRealNumbers(p1->cpu_delay_percent, p2->cpu_delay_percent); case PERCENT_IO_DELAY: - return SPACESHIP_NUMBER(p1->blkio_delay_percent, p2->blkio_delay_percent); + return compareRealNumbers(p1->blkio_delay_percent, p2->blkio_delay_percent); case PERCENT_SWAP_DELAY: - return SPACESHIP_NUMBER(p1->swapin_delay_percent, p2->swapin_delay_percent); + return compareRealNumbers(p1->swapin_delay_percent, p2->swapin_delay_percent); case CTXT: return SPACESHIP_NUMBER(p1->ctxt_diff, p2->ctxt_diff); case SECATTR: |