aboutsummaryrefslogtreecommitdiff
path: root/qlop.c
diff options
context:
space:
mode:
authorMike Frysinger <vapier@gentoo.org>2009-03-15 09:57:30 +0000
committerMike Frysinger <vapier@gentoo.org>2009-03-15 09:57:30 +0000
commit074722b51fdd9671db4df7569f219518014869c6 (patch)
treee227002d0cb14db0b7f7e79aad2d2318dfb609f8 /qlop.c
parentcheck for lenght typo (diff)
downloadportage-utils-074722b51fdd9671db4df7569f219518014869c6.tar.gz
portage-utils-074722b51fdd9671db4df7569f219518014869c6.tar.bz2
portage-utils-074722b51fdd9671db4df7569f219518014869c6.zip
discover HZ dynamically from elf notes on the stack #245393
Diffstat (limited to 'qlop.c')
-rw-r--r--qlop.c32
1 files changed, 28 insertions, 4 deletions
diff --git a/qlop.c b/qlop.c
index 0318f380..ab677f07 100644
--- a/qlop.c
+++ b/qlop.c
@@ -1,7 +1,7 @@
/*
* Copyright 2005-2007 Gentoo Foundation
* Distributed under the terms of the GNU General Public License v2
- * $Header: /var/cvsroot/gentoo-projects/portage-utils/qlop.c,v 1.41 2007/05/24 14:47:18 solar Exp $
+ * $Header: /var/cvsroot/gentoo-projects/portage-utils/qlop.c,v 1.42 2009/03/15 09:57:30 vapier Exp $
*
* Copyright 2005-2007 Ned Ludd - <solar@gentoo.org>
* Copyright 2005-2007 Mike Frysinger - <vapier@gentoo.org>
@@ -46,7 +46,7 @@ static const char *qlop_opts_help[] = {
"Read emerge logfile instead of " QLOP_DEFAULT_LOGFILE,
COMMON_OPTS_HELP
};
-static const char qlop_rcsid[] = "$Id: qlop.c,v 1.41 2007/05/24 14:47:18 solar Exp $";
+static const char qlop_rcsid[] = "$Id: qlop.c,v 1.42 2009/03/15 09:57:30 vapier Exp $";
#define qlop_usage(ret) usage(ret, QLOP_FLAGS, qlop_long_opts, qlop_opts_help, lookup_applet_idx("qlop"))
#define QLOP_LIST 0x01
@@ -295,6 +295,27 @@ void show_sync_history(const char *logfile)
void show_current_emerge(void);
#ifdef __linux__
+#include <elf.h>
+static unsigned long hz = 0;
+static void init_hz(void)
+{
+#ifdef HZ
+ hz = HZ;
+#endif
+ /* kernel pushes elf notes onto stack */
+ unsigned long *elf_note = (unsigned long *)environ;
+ while (!*elf_note++)
+ continue;
+ while (elf_note[0]) {
+ if (elf_note[0] == AT_CLKTCK) {
+ hz = elf_note[1];
+ break;
+ }
+ elf_note += 2;
+ }
+ if (!hz)
+ hz = 100;
+}
void show_current_emerge(void)
{
DIR *proc;
@@ -312,6 +333,9 @@ void show_current_emerge(void)
return;
}
+ if (!hz)
+ init_hz();
+
while ((de = readdir(proc)) != NULL) {
if ((pid = (pid_t)atol(de->d_name)) == 0)
@@ -352,14 +376,14 @@ void show_current_emerge(void)
sscanf(bufstat, "%lf", &uptime_secs);
/* figure out when this thing started and then show it */
- start_date = time(0) - (uptime_secs - (start_time / HZ));
+ start_date = time(0) - (uptime_secs - (start_time / hz));
printf(
" %s*%s %s%s%s\n"
" started: %s%s%s\n"
" elapsed: ", /*%s%llu%s seconds\n",*/
BOLD, NORM, BLUE, p, NORM,
GREEN, chop_ctime(start_date), NORM);
- print_seconds_for_earthlings(uptime_secs - (start_time / HZ));
+ print_seconds_for_earthlings(uptime_secs - (start_time / hz));
puts(NORM);
}
}