Compare commits

...

5 Commits

Author SHA1 Message Date
Benoît Dejean
e1b9c9599b Released 2.22.3.
svn path=/branches/gnome-2-22/; revision=2761
2008-06-30 21:46:51 +00:00
Benoît Dejean
41df52e5c4 Handle new /sys/block/.../stat format for linux >= 2.6.25.
Closes #539360.

svn path=/branches/gnome-2-22/; revision=2754
2008-06-22 09:20:59 +00:00
Benoît Dejean
2ec06b3d60 Bumped version number to 2.22.3.
svn path=/branches/gnome-2-22/; revision=2753
2008-06-22 09:09:57 +00:00
Benoît Dejean
e1d6e713fc Released 2.22.2
svn path=/branches/gnome-2-22/; revision=2745
2008-05-23 21:54:03 +00:00
Benoît Dejean
1634698050 Fixed parsing of big /proc/stat for uptime.
Closes #529946.

svn path=/branches/gnome-2-22/; revision=2742
2008-04-29 17:57:01 +00:00
4 changed files with 66 additions and 16 deletions

11
NEWS
View File

@@ -1,3 +1,14 @@
30 June 2008: Overview of changes in 2.22.3
===========================================
* linux:
- Fixed glibtop_get_fsusage with kernel >= 2.6.25.
Closes #539360.
24 May 2008: Overview of changes in 2.22.2
==========================================
* linux:
- fixed parsing of huge /proc/stat.
04 April 2008: Overview of changes in 2.22.1 04 April 2008: Overview of changes in 2.22.1
============================================ ============================================
* Fixed compilation/dist for !linux. * Fixed compilation/dist for !linux.

View File

@@ -4,7 +4,7 @@ dnl
m4_define([libgtop_major_version], [2]) m4_define([libgtop_major_version], [2])
m4_define([libgtop_minor_version], [22]) m4_define([libgtop_minor_version], [22])
m4_define([libgtop_micro_version], [1]) m4_define([libgtop_micro_version], [3])
m4_define([libgtop_version], [libgtop_major_version.libgtop_minor_version.libgtop_micro_version]) m4_define([libgtop_version], [libgtop_major_version.libgtop_minor_version.libgtop_micro_version])
dnl increment if the interface has additions, changes, removals. dnl increment if the interface has additions, changes, removals.

View File

@@ -59,9 +59,35 @@ get_partition(const char *mountpoint)
} }
/*
Bug #539360.
/sys/.../stat format is partially defined in
linux/Documentation/block/stat.txt (looks outdated). Before linux
2.5.25, /sys/block/%s/stat and /sys/block/%s/%s/stat were not the
same, but the following commit changed the latter to have the same
format and broke compatibility.
Commit 34e8beac92c27d292938065f8375842d2840767c
Author: Jerome Marchand <jmarchan@redhat.com>
Date: Fri Feb 8 11:04:55 2008 +0100
Enhanced partition statistics: sysfs
Reports enhanced partition statistics in sysfs.
Signed-off-by: Jerome Marchand <jmarchan@redhat.com>
fs/partitions/check.c | 22 +++++++++++++++++++---
1 files changed, 19 insertions(+), 3 deletions(-)
*/
static void static void
get_sys_path(const char *device, char **stat_path, const char **parse_format) get_sys_path(glibtop* server, const char *device, char **stat_path, const char **parse_format)
{ {
const char* linux_2_6_25_format = "%*llu %*llu %llu %*llu"
"%*llu %*llu %llu %*llu";
if(g_str_has_prefix(device, "hd") || g_str_has_prefix(device, "sd")) if(g_str_has_prefix(device, "hd") || g_str_has_prefix(device, "sd"))
{ {
char *prefix; char *prefix;
@@ -79,12 +105,18 @@ get_sys_path(const char *device, char **stat_path, const char **parse_format)
g_free(prefix); g_free(prefix);
*stat_path = path; *stat_path = path;
*parse_format = "%*llu %llu %*llu %llu"; if (server->os_version_code < LINUX_VERSION_CODE(2, 6, 25))
*parse_format = "%*llu %llu %*llu %llu";
else
*parse_format = linux_2_6_25_format;
} }
else else
{ {
*stat_path = g_strdup_printf("/sys/block/%s/stat", device); *stat_path = g_strdup_printf("/sys/block/%s/stat", device);
*parse_format = "%*llu %*llu %llu %*llu %*llu %*llu %llu"; if (server->os_version_code < LINUX_VERSION_CODE(2, 6, 25))
*parse_format = "%*llu %*llu %llu %*llu %*llu %*llu %llu";
else
*parse_format = linux_2_6_25_format;
} }
} }
@@ -101,7 +133,7 @@ static void linux_2_6_0(glibtop *server, glibtop_fsusage *buf, const char *path)
device = get_partition(path); device = get_partition(path);
if(!device) return; if(!device) return;
get_sys_path(device, &filename, &format); get_sys_path(server, device, &filename, &format);
g_free(device); g_free(device);
ret = try_file_to_buffer(buffer, sizeof buffer, filename); ret = try_file_to_buffer(buffer, sizeof buffer, filename);

View File

@@ -119,20 +119,27 @@ file_to_buffer(glibtop *server, char *buffer, size_t bufsiz, const char *filenam
static unsigned long static unsigned long
read_boot_time(glibtop *server) read_boot_time(glibtop *server)
{ {
char buffer[BUFSIZ]; char* line = NULL;
char *btime; size_t size = 0;
FILE* stat;
unsigned long btime = 0;
file_to_buffer(server, buffer, sizeof buffer, "/proc/stat"); if (!(stat = fopen("/proc/stat", "r"))) {
glibtop_error_io_r(server, "fopen(\"/proc/stat\")");
btime = strstr(buffer, "btime"); goto out;
if (!btime) {
glibtop_warn_io_r(server, "cannot find btime in /proc/stat");
return 0UL;
} }
btime = skip_token(btime); while (getline(&line, &size, stat) != -1) {
return strtoul(btime, NULL, 10); if (!strncmp(line, "btime", 5)) {
btime = strtoul(skip_token(line), NULL, 10);
break;
}
}
free(line);
fclose(stat);
out:
return btime;
} }