mirror of https://github.com/xzeldon/htop.git
Cleanup initialization of jiffies on the Linux platform
Small cleanups - add error handling, remove a local static variable and refactor LinuxProcess_adjustTime (also rename it, as its in LinuxProcessList.c not LinuxProcess.c) - and while there, move the related 'btime' global variable into LinuxProcessList.c so it can be made static. Resolves https://github.com/htop-dev/htop/issues/384
This commit is contained in:
parent
cf982f2928
commit
a3db2da4a7
|
@ -24,7 +24,6 @@ in the source distribution for its full text.
|
||||||
|
|
||||||
|
|
||||||
/* semi-global */
|
/* semi-global */
|
||||||
long long btime;
|
|
||||||
int pageSize;
|
int pageSize;
|
||||||
int pageSizeKB;
|
int pageSizeKB;
|
||||||
|
|
||||||
|
|
|
@ -191,8 +191,6 @@ static inline bool Process_isUserlandThread(const Process* this) {
|
||||||
return this->pid != this->tgid;
|
return this->pid != this->tgid;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern long long btime;
|
|
||||||
|
|
||||||
extern int pageSize;
|
extern int pageSize;
|
||||||
|
|
||||||
extern int pageSizeKB;
|
extern int pageSizeKB;
|
||||||
|
|
|
@ -63,6 +63,10 @@ in the source distribution for its full text.
|
||||||
# define O_PATH 010000000
|
# define O_PATH 010000000
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static long long btime;
|
||||||
|
|
||||||
|
static long jiffy;
|
||||||
|
|
||||||
static FILE* fopenat(openat_arg_t openatArg, const char* pathname, const char* mode) {
|
static FILE* fopenat(openat_arg_t openatArg, const char* pathname, const char* mode) {
|
||||||
assert(String_eq(mode, "r")); /* only currently supported mode */
|
assert(String_eq(mode, "r")); /* only currently supported mode */
|
||||||
|
|
||||||
|
@ -214,6 +218,11 @@ ProcessList* ProcessList_new(UsersTable* usersTable, Hashtable* pidMatchList, ui
|
||||||
CRT_fatalError("Cannot get pagesize by sysconf(_SC_PAGESIZE)");
|
CRT_fatalError("Cannot get pagesize by sysconf(_SC_PAGESIZE)");
|
||||||
pageSizeKB = pageSize / ONE_K;
|
pageSizeKB = pageSize / ONE_K;
|
||||||
|
|
||||||
|
// Initialize clock ticks
|
||||||
|
jiffy = sysconf(_SC_CLK_TCK);
|
||||||
|
if (jiffy == -1)
|
||||||
|
CRT_fatalError("Cannot get clock ticks by sysconf(_SC_CLK_TCK)");
|
||||||
|
|
||||||
// Test /proc/PID/smaps_rollup availability (faster to parse, Linux 4.14+)
|
// Test /proc/PID/smaps_rollup availability (faster to parse, Linux 4.14+)
|
||||||
this->haveSmapsRollup = (access(PROCDIR "/self/smaps_rollup", R_OK) == 0);
|
this->haveSmapsRollup = (access(PROCDIR "/self/smaps_rollup", R_OK) == 0);
|
||||||
|
|
||||||
|
@ -273,16 +282,7 @@ void ProcessList_delete(ProcessList* pl) {
|
||||||
free(this);
|
free(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline unsigned long long LinuxProcess_adjustTime(unsigned long long t) {
|
static inline unsigned long long LinuxProcessList_adjustTime(unsigned long long t) {
|
||||||
static long jiffy = -1;
|
|
||||||
if (jiffy == -1) {
|
|
||||||
errno = 0;
|
|
||||||
jiffy = sysconf(_SC_CLK_TCK);
|
|
||||||
if (errno || -1 == jiffy) {
|
|
||||||
jiffy = -1;
|
|
||||||
return t; // Assume 100Hz clock
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return t * 100 / jiffy;
|
return t * 100 / jiffy;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -335,13 +335,13 @@ static bool LinuxProcessList_readStatFile(Process* process, openat_arg_t procFd,
|
||||||
location += 1;
|
location += 1;
|
||||||
lp->cmajflt = strtoull(location, &location, 10);
|
lp->cmajflt = strtoull(location, &location, 10);
|
||||||
location += 1;
|
location += 1;
|
||||||
lp->utime = LinuxProcess_adjustTime(strtoull(location, &location, 10));
|
lp->utime = LinuxProcessList_adjustTime(strtoull(location, &location, 10));
|
||||||
location += 1;
|
location += 1;
|
||||||
lp->stime = LinuxProcess_adjustTime(strtoull(location, &location, 10));
|
lp->stime = LinuxProcessList_adjustTime(strtoull(location, &location, 10));
|
||||||
location += 1;
|
location += 1;
|
||||||
lp->cutime = LinuxProcess_adjustTime(strtoull(location, &location, 10));
|
lp->cutime = LinuxProcessList_adjustTime(strtoull(location, &location, 10));
|
||||||
location += 1;
|
location += 1;
|
||||||
lp->cstime = LinuxProcess_adjustTime(strtoull(location, &location, 10));
|
lp->cstime = LinuxProcessList_adjustTime(strtoull(location, &location, 10));
|
||||||
location += 1;
|
location += 1;
|
||||||
process->priority = strtol(location, &location, 10);
|
process->priority = strtol(location, &location, 10);
|
||||||
location += 1;
|
location += 1;
|
||||||
|
@ -351,7 +351,7 @@ static bool LinuxProcessList_readStatFile(Process* process, openat_arg_t procFd,
|
||||||
location += 1;
|
location += 1;
|
||||||
location = strchr(location, ' ') + 1;
|
location = strchr(location, ' ') + 1;
|
||||||
if (process->starttime_ctime == 0) {
|
if (process->starttime_ctime == 0) {
|
||||||
process->starttime_ctime = btime + LinuxProcess_adjustTime(strtoll(location, &location, 10)) / 100;
|
process->starttime_ctime = btime + LinuxProcessList_adjustTime(strtoll(location, &location, 10)) / 100;
|
||||||
} else {
|
} else {
|
||||||
location = strchr(location, ' ') + 1;
|
location = strchr(location, ' ') + 1;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue