From d841dce48a30a5747d5046a49bd1fae17bde0580 Mon Sep 17 00:00:00 2001 From: Philip Kovacs Date: Tue, 8 Nov 2005 23:03:25 +0000 Subject: [PATCH] use unsigned long not int for cpu% calcs. fixes bug# 1351686. patch bu boojit git-svn-id: https://conky.svn.sourceforge.net/svnroot/conky/trunk/conky@375 7f574dfc-610e-0410-a909-a81674777703 --- README | 130 ++++++++++++++++++---------------------------------- src/conky.h | 10 ++-- src/top.c | 30 ++++++------ 3 files changed, 64 insertions(+), 106 deletions(-) diff --git a/README b/README index 5ee6eb8f..a6cc2757 100644 --- a/README +++ b/README @@ -4,16 +4,16 @@ conky(1) conky(1) NAME conky - A system monitor for X originally based on the torsmo code, but - more kickass. It just keeps on given'er. Yeah. + more kickass. It just keeps on given’er. Yeah. SYNOPSIS conky [options] DESCRIPTION Conky is a system monitor for X originally based on the torsmo code. - Since it's original conception, Conky has changed a fair bit from it's + Since it’s original conception, Conky has changed a fair bit from it’s predecessor. Conky can display just about anything, either on your - root desktop or in it's own window. Conky has many built-in objects, + root desktop or in it’s own window. Conky has many built-in objects, as well as the ability to execute programs and scripts, then display the output from stdout. @@ -28,11 +28,11 @@ COMPILING libraries installed. This should be a package along the lines of "libx11-dev or xorg-x11-dev". - Gentoo users -- Conky is in Gentoo's Portage... simply use "emerge app- + Gentoo users -- Conky is in Gentoo’s Portage... simply use "emerge app- admin/conky" for installation. There is also usually an up-to-date - ebuild within Conky's package or in CVS. + ebuild within Conky’s package or in CVS. - Debian,etc. users -- Conky will be in Debian's repositories soon (by + Debian,etc. users -- Conky will be in Debian’s repositories soon (by mid-September, hopefully), and then Ubuntu shortly thereafter. Until then, "dpkg -i" the .deb package to install. @@ -43,7 +43,7 @@ COMPILING ./configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --datadir=/usr/share --sysconfdir=/etc - --localstatedir=/var/lib --enable-xft --enable-seti --enable-dou- + --localstatedir=/var/lib --enable-xft --enable-seti --enable-dou‐ ble-buffer --enable-own-window --enable-proc-uptime --enable-mpd --enable-mldonkey --enable-x11 --enable-portmon @@ -53,14 +53,14 @@ COMPILING src/conky - Conky probably doesn't compile with compilers other than gcc and icc. - It doesn't compile with C89 compiler and not even with pure C99. It - uses a few things that might not exist: strdup(), strcasecmp(), strn- + Conky probably doesn’t compile with compilers other than gcc and icc. + It doesn’t compile with C89 compiler and not even with pure C99. It + uses a few things that might not exist: strdup(), strcasecmp(), strn‐ casecmp(), optarg variable with getopt() and long long (not in C89). - Crashes in file system statistics stuff when compiled with icc, I don't + Crashes in file system statistics stuff when compiled with icc, I don’t know exactly why. - You can disable 'drawing to own window' feature in case you don't need + You can disable ’drawing to own window’ feature in case you don’t need it by passing --disable-own-window to configure -script. @@ -71,14 +71,14 @@ YOU SHOULD KNOW rest of Conky. If you do use them, please do not complain about memory or CPU usage, - unless you think something's seriously wrong (mem leak, etc.). + unless you think something’s seriously wrong (mem leak, etc.). An easy way to force Conky to reload your ~/.conkyrc: "killall -SIGUSR1 conky". Saves you the trouble of having to kill and then restart. IMPORTANT: For previous Conky users, Conky 1.3 no longer supports the metar stuff. mdsplib was causing way too many problems. Hopefully - there'll be a better solution in Conky 2.x... + there’ll be a better solution in Conky 2.x... OPTIONS Command line options override configurations defined in configuration @@ -113,7 +113,7 @@ OPTIONS -t TEXT - Text to render, remember single quotes, like -t ' $uptime ' + Text to render, remember single quotes, like -t ’ $uptime ’ -u SECONDS @@ -135,14 +135,14 @@ OPTIONS CONFIGURATION SETTINGS Default configuration file is $HOME/.conkyrc (can be changed from conky.c among other things). See conkyrc.sample. If installing from - Debian package, this should be in /usr/share/doc/conky/examples ("gun- + Debian package, this should be in /usr/share/doc/conky/examples ("gun‐ zip conkyrc.sample.gz" to get conkyrc.sample). You might want to copy it to $HOME/.conkyrc and then start modifying it. Other configs can be found at http://conky.sf.net alignment - Aligned position on screen, may be top_left, top_right, bot- + Aligned position on screen, may be top_left, top_right, bot‐ tom_left, bottom_right, or none @@ -172,7 +172,7 @@ CONFIGURATION SETTINGS default_shade_color - Default shading color and border's shading color + Default shading color and border’s shading color default_outline_color @@ -180,8 +180,8 @@ CONFIGURATION SETTINGS double_buffer - Use the Xdbe extension? (eliminates flicker) It is highly recom- - mended to use own window with this one so double buffer won't be + Use the Xdbe extension? (eliminates flicker) It is highly recom‐ + mended to use own window with this one so double buffer won’t be so big. @@ -311,7 +311,7 @@ CONFIGURATION SETTINGS VARIABLES Colors are parsed using XParsecolor(), there might be a list of them: /usr/X11R6/lib/X11/rgb.txt. Also, http://sedition.com/perl/rgb.html - [http://sedition.com/perl/rgb.html]. Color can be also in #rrggbb for- + [http://sedition.com/perl/rgb.html]. Color can be also in #rrggbb for‐ mat (hex). Note that when displaying bytes, power is 1024 and not 1000 so 1M really means 1024*1024 bytes and not 1000*1000. @@ -387,7 +387,7 @@ VARIABLES cpubar (cpu number) (height),(width) - Bar that shows CPU usage, height is bar's height in pixels. See + Bar that shows CPU usage, height is bar’s height in pixels. See $cpu for more info on SMP. @@ -424,8 +424,8 @@ VARIABLES exec command - Executes a shell command and displays the output in conky. warn- - ing: this takes a lot more resources than other variables. I'd + Executes a shell command and displays the output in conky. warn‐ + ing: this takes a lot more resources than other variables. I’d recommend coding wanted behaviour in C and posting a patch. @@ -440,7 +440,7 @@ VARIABLES execi interval command - Same as exec but with specific interval. Interval can't be less + Same as exec but with specific interval. Interval can’t be less than update_interval in configuration. See also $texeci @@ -497,7 +497,7 @@ VARIABLES head logfile lines (interval) Displays first N lines of supplied text text file. If interval - is not supplied, Conky assumes 2x Conky's interval. Max of 30 + is not supplied, Conky assumes 2x Conky’s interval. Max of 30 lines can be displayed, or until the text buffer is filled. @@ -542,7 +542,7 @@ VARIABLES i8k_left_fan_rpm If running the i8k kernel driver for Inspiron laptops, displays - the left fan's rate of rotation, in revolutions per minute as + the left fan’s rate of rotation, in revolutions per minute as listed in /proc/i8k. Beware, some laptops i8k reports these fans in reverse order. @@ -556,7 +556,7 @@ VARIABLES i8k_right_fan_rpm If running the i8k kernel driver for Inspiron laptops, displays - the right fan's rate of rotation, in revolutions per minute as + the right fan’s rate of rotation, in revolutions per minute as listed in /proc/i8k. Beware, some laptops i8k reports these fans in reverse order. @@ -628,46 +628,6 @@ VARIABLES Percentage of memory in use - ml_upload_counter - total session upload in mb - - - ml_download_counter - total session download in mb - - - ml_nshared_files - number of shared files - - - ml_shared_counter - total session shared in mb, buggy in some mldonkey versions - - - ml_tcp_upload_rate - tcp upload rate in kb/s - - - ml_tcp_download_rate - tcp download rate in kb/s - - - ml_udp_upload_rate - udp upload rate in kb/s - - - ml_udp_download_rate - udp download rate in kb/s - - - ml_ndownloaded_files - number of completed files - - - ml_ndownloading_files - number of downloading files - - mpd_artist Artist in current MPD song must be enabled at compile @@ -677,7 +637,7 @@ VARIABLES mpd_bar (height),(width) - Bar of mpd's progress + Bar of mpd’s progress mpd_bitrate @@ -693,19 +653,19 @@ VARIABLES mpd_vol - MPD's volume + MPD’s volume mpd_elapsed - Song's elapsed time + Song’s elapsed time mpd_length - Song's length + Song’s length mpd_percent - Percent of song's progress + Percent of song’s progress mpd_random @@ -798,7 +758,7 @@ VARIABLES Examples: - ${tcp_portmon 6881 6889 count} - displays the number of connec- + ${tcp_portmon 6881 6889 count} - displays the number of connec‐ tions in the bittorrent port range ${tcp_portmon 22 22 rip 0} - displays the remote host ip of the @@ -817,7 +777,7 @@ VARIABLES name of the fifteenth connection in the range of all ports Note that port monitor variables which share the same port range - actually refer to the same monitor, so many references to a sin- + actually refer to the same monitor, so many references to a sin‐ gle port range for different items and different indexes all use the same monitor internally. In other words, the program avoids creating redundant monitors. @@ -825,7 +785,7 @@ VARIABLES texeci interval command Runs a command at an interval inside a thread and displays the output. Same as $execi, except the command is run inside a - thread. Use this if you have a slow script to keep Conky updat- + thread. Use this if you have a slow script to keep Conky updat‐ ing. You should make the interval slightly longer then the time it takes your script to execute. For example, if you have a script that take 5 seconds to execute, you should make the @@ -838,18 +798,18 @@ VARIABLES tail logfile lines (interval) Displays last N lines of supplied text text file. If interval is - not supplied, Conky assumes 2x Conky's interval. Max of 30 lines + not supplied, Conky assumes 2x Conky’s interval. Max of 30 lines can be displayed, or until the text buffer is filled. time (format) - Local time, see man strftime to get more information about for- + Local time, see man strftime to get more information about for‐ mat totaldown net Total download, overflows at 4 GB on Linux with 32-bit arch and - there doesn't seem to be a way to know how many times it has + there doesn’t seem to be a way to know how many times it has already done that before conky has started. @@ -912,7 +872,7 @@ VARIABLES EXAMPLES - conky -t '${time %D %H:%m}' -o -u 30 + conky -t ’${time %D %H:%m}’ -o -u 30 Start Conky in its own window with date and clock as text and 30 sec update interval. @@ -923,9 +883,9 @@ FILES ~/.conkyrc default configuration file BUGS - Drawing to root or some other desktop window directly doesn't work with - all window managers. Especially doesn't work well with Gnome and it has - been reported that it doesn't work with KDE either. Nautilus can be + Drawing to root or some other desktop window directly doesn’t work with + all window managers. Especially doesn’t work well with Gnome and it has + been reported that it doesn’t work with KDE either. Nautilus can be disabled from drawing to desktop with program gconf-editor. Uncheck show_desktop in /apps/nautilus/preferences/. There is -w switch in Conky to set some specific window id. You might find xwininfo -tree @@ -935,13 +895,13 @@ BUGS SEE ALSO http://conky.sourceforge.net [http://conky.sourceforge.net] - http://www.sourceforge.net/projects/conky [http://www.source- + http://www.sourceforge.net/projects/conky [http://www.source‐ forge.net/projects/conky] #conky on irc.freenode.net AUTHORS - The Conky dev team. What's up now! + The Conky dev team. What’s up now! diff --git a/src/conky.h b/src/conky.h index fb80dcd5..f8b63560 100644 --- a/src/conky.h +++ b/src/conky.h @@ -340,11 +340,11 @@ struct process { pid_t pid; char *name; float amount; - unsigned int user_time; - unsigned int total; - unsigned int kernel_time; - unsigned int previous_user_time; - unsigned int previous_kernel_time; + unsigned long user_time; + unsigned long total; + unsigned long kernel_time; + unsigned long previous_user_time; + unsigned long previous_kernel_time; unsigned int vsize; unsigned int rss; unsigned int time_stamp; diff --git a/src/top.c b/src/top.c index af87e222..09d39c5c 100644 --- a/src/top.c +++ b/src/top.c @@ -10,7 +10,7 @@ static regex_t *exclusion_expression = 0; static unsigned int g_time = 0; -static int previous_total = 0; +static unsigned long previous_total = 0; static struct process *first_process = 0; static struct process *find_process(pid_t pid) @@ -63,8 +63,8 @@ static int calculate_cpu(struct process *); static void process_cleanup(void); static void delete_process(struct process *); /*inline void draw_processes(void);*/ -static int calc_cpu_total(void); -static void calc_cpu_each(int); +static unsigned long calc_cpu_total(void); +static void calc_cpu_each(unsigned long); /******************************************/ @@ -81,7 +81,7 @@ static int process_parse_stat(struct process *process) cur = &info; char line[BUFFER_LEN], filename[BUFFER_LEN], procname[BUFFER_LEN]; int ps; - int user_time, kernel_time; + unsigned long user_time, kernel_time; int rc; char *r, *q; char deparenthesised_name[BUFFER_LEN]; @@ -112,7 +112,7 @@ static int process_parse_stat(struct process *process) * Extract cpu times from data in /proc filesystem */ rc = sscanf(line, - "%*s %s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %d %d %*s %*s %*s %d %*s %*s %*s %d %d", + "%*s %s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %lu %lu %*s %*s %*s %d %*s %*s %*s %d %d", procname, &process->user_time, &process->kernel_time, &nice_val, &process->vsize, &process->rss); if (rc < 5) @@ -166,9 +166,9 @@ static int process_parse_stat(struct process *process) process->totalmem = ((float) process->rss / cur->memmax) / 10; - if (process->previous_user_time == INT_MAX) + if (process->previous_user_time == ULONG_MAX) process->previous_user_time = process->user_time; - if (process->previous_kernel_time == INT_MAX) + if (process->previous_kernel_time == ULONG_MAX) process->previous_kernel_time = process->kernel_time; /* store the difference of the user_time */ @@ -319,27 +319,25 @@ static void delete_process(struct process *p) /* Calculate cpu total */ /******************************************/ -static int calc_cpu_total() +static unsigned long calc_cpu_total() { - int total, t; + unsigned long total, t; int rc; int ps; char line[BUFFER_LEN]; - int cpu, nice, system, idle; + unsigned long cpu, nice, system, idle; ps = open("/proc/stat", O_RDONLY); rc = read(ps, line, sizeof(line)); close(ps); if (rc < 0) return 0; - sscanf(line, "%*s %d %d %d %d", &cpu, &nice, &system, &idle); + sscanf(line, "%*s %lu %lu %lu %lu", &cpu, &nice, &system, &idle); total = cpu + nice + system + idle; t = total - previous_total; previous_total = total; - if (t < 0) - t = 0; return t; } @@ -348,7 +346,7 @@ static int calc_cpu_total() /* Calculate each processes cpu */ /******************************************/ -inline static void calc_cpu_each(int total) +inline static void calc_cpu_each(unsigned long total) { struct process *p = first_process; while (p) { @@ -404,8 +402,8 @@ inline void process_find_top(struct process **cpu, struct process **mem) sorttmp = malloc(sizeof(struct process) * sorttmp_size); assert(sorttmp != NULL); } - int total; - unsigned int i, j; + unsigned long total; + unsigned long i, j; total = calc_cpu_total(); /* calculate the total of the processor */