Package: htop Version: 1.0.3-1 Severity: wishlist Tags: patch Dear Maintainer,
It would be nice if htop had the possibility to output the time elapsed since the start of a process (as "ps -o etime" does). Attached is a patch that implements this feature. It is probably not optimal, but it is a proof of concept that it is possible. Cheers, -- Stéphane -- System Information: Debian Release: 8.0 APT prefers testing APT policy: (990, 'testing'), (500, 'unstable'), (1, 'experimental') Architecture: amd64 (x86_64) Foreign Architectures: i386 Kernel: Linux 3.16.0-4-amd64 (SMP w/8 CPU cores) Locale: LANG=fr_FR.UTF-8, LC_CTYPE=fr_FR.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/dash Init: systemd (via /run/systemd/system) Versions of packages htop depends on: ii libc6 2.19-17 ii libncursesw5 5.9+20140913-1+b1 ii libtinfo5 5.9+20140913-1+b1 htop recommends no packages. Versions of packages htop suggests: ii ltrace 0.7.3-4 ii strace 4.9-2 -- no debconf information
>From 16694355e1a4116584975ea08e9a7f2207842bd7 Mon Sep 17 00:00:00 2001 From: Stephane Glondu <st...@glondu.net> Date: Wed, 15 Apr 2015 11:12:12 +0200 Subject: [PATCH] Add ELAPSED --- Process.c | 8 ++++++++ Process.h | 2 ++ ProcessList.c | 5 +++++ 3 files changed, 15 insertions(+) diff --git a/Process.c b/Process.c index 4efd854..173e04a 100644 --- a/Process.c +++ b/Process.c @@ -85,6 +85,7 @@ typedef enum ProcessField_ { OOM, #endif IO_PRIORITY, + ELAPSED, LAST_PROCESSFIELD } ProcessField; @@ -115,6 +116,7 @@ typedef struct Process_ { float percent_mem; char* user; + unsigned long long int etime; unsigned long long int utime; unsigned long long int stime; unsigned long long int cutime; @@ -221,6 +223,7 @@ const char *Process_fieldNames[] = { "OOM", #endif "IO_PRIORITY", + "ELAPSED", "*** report bug! ***" }; @@ -278,6 +281,7 @@ const char *Process_fieldTitles[] = { " OOM ", #endif "IO ", + " ELAPSED ", "*** report bug! ***" }; @@ -568,6 +572,7 @@ static void Process_writeField(Process* this, RichString* str, ProcessField fiel } break; } + case ELAPSED: Process_printTime(str, this->etime); return; case UTIME: Process_printTime(str, this->utime); return; case STIME: Process_printTime(str, this->stime); return; case CUTIME: Process_printTime(str, this->cutime); return; @@ -680,6 +685,7 @@ Process* Process_new(struct ProcessList_ *pl) { this->showChildren = true; this->show = true; this->updated = false; + this->etime = 0; this->utime = 0; this->stime = 0; this->comm = NULL; @@ -845,6 +851,8 @@ int Process_compare(const void* v1, const void* v2) { return (p2->percent_cpu > p1->percent_cpu ? 1 : -1); case PERCENT_MEM: return (p2->m_resident - p1->m_resident); + case ELAPSED: + return (p2->etime - p1->etime); case UTIME: return (p2->utime - p1->utime); case STIME: diff --git a/Process.h b/Process.h index 19083fd..56dfa0d 100644 --- a/Process.h +++ b/Process.h @@ -64,6 +64,7 @@ typedef enum ProcessField_ { OOM, #endif IO_PRIORITY, + ELAPSED, LAST_PROCESSFIELD } ProcessField; @@ -94,6 +95,7 @@ typedef struct Process_ { float percent_mem; char* user; + unsigned long long int etime; unsigned long long int utime; unsigned long long int stime; unsigned long long int cutime; diff --git a/ProcessList.c b/ProcessList.c index d362115..f374581 100644 --- a/ProcessList.c +++ b/ProcessList.c @@ -722,6 +722,8 @@ static bool ProcessList_readCmdlineFile(Process* process, const char* dirname, c } +static double jiffy = 0.0; + static bool ProcessList_processEntries(ProcessList* this, const char* dirname, Process* parent, double period, struct timeval tv) { DIR* dir; struct dirent* entry; @@ -798,6 +800,9 @@ static bool ProcessList_processEntries(ProcessList* this, const char* dirname, P if (isnan(process->percent_cpu)) process->percent_cpu = 0.0; process->percent_mem = (process->m_resident * PAGE_SIZE_KB) / (double)(this->totalMem) * 100.0; + if(jiffy == 0.0) jiffy = sysconf(_SC_CLK_TCK); + process->etime = difftime(time(NULL), process->starttime_ctime) * jiffy; + if(!existingProcess) { if (! ProcessList_statProcessDir(process, dirname, name, curTime)) -- 2.1.4