Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions Macros.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,10 @@ in the source distribution for its full text.
#define SPACESHIP_NUMBER(a, b) (((a) > (b)) - ((a) < (b)))
#endif

#ifndef SPACESHIP_NUMBER_NA
#define SPACESHIP_NUMBER_NA(a, b, na) (((a) == (na)) ? (((b) == (na)) ? 0 : -1) : (((b) == (na)) ? 1 : SPACESHIP_NUMBER(a, b)))
#endif

#ifndef SPACESHIP_NULLSTR
#define SPACESHIP_NULLSTR(a, b) strcmp((a) ? (a) : "", (b) ? (b) : "")
#endif
Expand Down
12 changes: 8 additions & 4 deletions linux/LinuxProcess.c
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,10 @@ Process* LinuxProcess_new(const Machine* host) {
LinuxProcess* this = xCalloc(1, sizeof(LinuxProcess));
Object_setClass(this, Class(LinuxProcess));
Process_init(&this->super, host);
this->m_pss = ULLONG_MAX;
this->m_swap = ULLONG_MAX;
this->m_psswp = ULLONG_MAX;
this->m_epss = ULLONG_MAX;
return (Process*)this;
}

Expand Down Expand Up @@ -379,13 +383,13 @@ static int LinuxProcess_compareByKey(const Process* v1, const Process* v2, Proce
case M_PRIV:
return SPACESHIP_NUMBER(p1->m_priv, p2->m_priv);
case M_PSS:
return SPACESHIP_NUMBER(p1->m_pss, p2->m_pss);
return SPACESHIP_NUMBER_NA(p1->m_pss, p2->m_pss, ULLONG_MAX);
case M_SWAP:
return SPACESHIP_NUMBER(p1->m_swap, p2->m_swap);
return SPACESHIP_NUMBER_NA(p1->m_swap, p2->m_swap, ULLONG_MAX);
case M_PSSWP:
return SPACESHIP_NUMBER(p1->m_psswp, p2->m_psswp);
return SPACESHIP_NUMBER_NA(p1->m_psswp, p2->m_psswp, ULLONG_MAX);
case M_EPSS:
return SPACESHIP_NUMBER(p1->m_epss, p2->m_epss);
return SPACESHIP_NUMBER_NA(p1->m_epss, p2->m_epss, ULLONG_MAX);
case UTIME:
return SPACESHIP_NUMBER(p1->utime, p2->utime);
case CUTIME:
Expand Down
8 changes: 4 additions & 4 deletions linux/LinuxProcess.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,10 @@ typedef struct LinuxProcess_ {
unsigned long long int cstime;
long m_share;
long m_priv;
long m_pss;
long m_swap;
long m_psswp;
long m_epss;
unsigned long long m_pss;
unsigned long long m_swap;
unsigned long long m_psswp;
unsigned long long m_epss;
long m_trs;
long m_drs;
long m_lrs;
Expand Down
26 changes: 22 additions & 4 deletions linux/LinuxProcessTable.c
Original file line number Diff line number Diff line change
Expand Up @@ -878,8 +878,13 @@ static bool LinuxProcessTable_readSmapsFile(LinuxProcess* process, openat_arg_t
//http://elixir.free-electrons.com/linux/v4.10/source/fs/proc/task_mmu.c#L719
//kernel will return data in chunks of size PAGE_SIZE or less.
FILE* fp = fopenat(procFd, haveSmapsRollup ? "smaps_rollup" : "smaps", "r");
if (!fp)
if (!fp) {
process->m_pss = ULLONG_MAX;
process->m_swap = ULLONG_MAX;
process->m_psswp = ULLONG_MAX;
process->m_epss = ULLONG_MAX;
return false;
}

process->m_pss = 0;
process->m_swap = 0;
Expand All @@ -891,21 +896,34 @@ static bool LinuxProcessTable_readSmapsFile(LinuxProcess* process, openat_arg_t
if (!strchr(buffer, '\n')) {
// Partial line, skip to end of this line
if (!skipEndOfLine(fp)) {
process->m_pss = ULLONG_MAX;
process->m_swap = ULLONG_MAX;
process->m_psswp = ULLONG_MAX;
process->m_epss = ULLONG_MAX;
fclose(fp);
return false;
}

}

if (String_startsWith(buffer, "Pss:")) {
process->m_pss += strtol(buffer + 4, NULL, 10);
process->m_pss += strtoull(buffer + 4, NULL, 10);
} else if (String_startsWith(buffer, "Swap:")) {
process->m_swap += strtol(buffer + 5, NULL, 10);
process->m_swap += strtoull(buffer + 5, NULL, 10);
} else if (String_startsWith(buffer, "SwapPss:")) {
process->m_psswp += strtol(buffer + 8, NULL, 10);
process->m_psswp += strtoull(buffer + 8, NULL, 10);
}
}

if (ferror(fp)) {
process->m_pss = ULLONG_MAX;
process->m_swap = ULLONG_MAX;
process->m_psswp = ULLONG_MAX;
process->m_epss = ULLONG_MAX;
fclose(fp);
return false;
}

process->m_epss = process->m_pss + process->m_psswp;

fclose(fp);
Expand Down
10 changes: 7 additions & 3 deletions pcp/PCPProcess.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ in the source distribution for its full text.

#include "pcp/PCPProcess.h"

#include <limits.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
Expand Down Expand Up @@ -97,6 +98,9 @@ Process* PCPProcess_new(const Machine* host) {
PCPProcess* this = xCalloc(1, sizeof(PCPProcess));
Object_setClass(this, Class(PCPProcess));
Process_init(&this->super, host);
this->m_pss = ULLONG_MAX;
this->m_swap = ULLONG_MAX;
this->m_psswp = ULLONG_MAX;
return (Process*)this;
}

Expand Down Expand Up @@ -229,11 +233,11 @@ static int PCPProcess_compareByKey(const Process* v1, const Process* v2, Process
case M_PRIV:
return SPACESHIP_NUMBER(p1->m_priv, p2->m_priv);
case M_PSS:
return SPACESHIP_NUMBER(p1->m_pss, p2->m_pss);
return SPACESHIP_NUMBER_NA(p1->m_pss, p2->m_pss, ULLONG_MAX);
case M_SWAP:
return SPACESHIP_NUMBER(p1->m_swap, p2->m_swap);
return SPACESHIP_NUMBER_NA(p1->m_swap, p2->m_swap, ULLONG_MAX);
case M_PSSWP:
return SPACESHIP_NUMBER(p1->m_psswp, p2->m_psswp);
return SPACESHIP_NUMBER_NA(p1->m_psswp, p2->m_psswp, ULLONG_MAX);
case UTIME:
return SPACESHIP_NUMBER(p1->utime, p2->utime);
case CUTIME:
Expand Down
6 changes: 3 additions & 3 deletions pcp/PCPProcess.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,9 @@ typedef struct PCPProcess_ {
unsigned long long int cstime;
long m_share;
long m_priv;
long m_pss;
long m_swap;
long m_psswp;
unsigned long long m_pss;
unsigned long long m_swap;
unsigned long long m_psswp;
long m_trs;
long m_drs;
long m_lrs;
Expand Down
6 changes: 3 additions & 3 deletions pcp/PCPProcessTable.c
Original file line number Diff line number Diff line change
Expand Up @@ -212,9 +212,9 @@ static void PCPProcessTable_updateMemory(PCPProcess* pp, int pid, int offset) {
}

static void PCPProcessTable_updateSmaps(PCPProcess* pp, pid_t pid, int offset) {
pp->m_pss = Metric_instance_u64(PCP_PROC_SMAPS_PSS, pid, offset, 0);
pp->m_swap = Metric_instance_u64(PCP_PROC_SMAPS_SWAP, pid, offset, 0);
pp->m_psswp = Metric_instance_u64(PCP_PROC_SMAPS_SWAPPSS, pid, offset, 0);
pp->m_pss = Metric_instance_u64(PCP_PROC_SMAPS_PSS, pid, offset, ULLONG_MAX);
pp->m_swap = Metric_instance_u64(PCP_PROC_SMAPS_SWAP, pid, offset, ULLONG_MAX);
pp->m_psswp = Metric_instance_u64(PCP_PROC_SMAPS_SWAPPSS, pid, offset, ULLONG_MAX);
}

static void PCPProcessTable_readOomData(PCPProcess* pp, int pid, int offset) {
Expand Down
Loading