Since I have the same bug and it has caused me to run out of battery once,...
It looks as if gkrellm is using the wrong sysfs files in the bad case. /sys/class/power_supply/BAT0/energy_full does not exist on my system and therefore things shouldn't have worked before suspend either. Which seems to imply that logs don't quite match actual behaviour. But after looking at src/sysdeps/linux.c, this looks more like a case of sysfs files being changed across suspend. I haven't caught it in the act yet, though. Bad case: ---<snip>--- Mon Mar 19 10:59:45 2012 --- GKrellM 2.3.5 --- Mon Mar 19 10:59:45 2012 sysfs_power_setup() entry Mon Mar 19 10:59:45 2012 setup_sysfs_power_entry: checking /sys/class/power_supply/BAT0/type Mon Mar 19 10:59:45 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/type = Battery Mon Mar 19 10:59:45 2012 setup_sysfs_battery: /sys/class/power_supply/BAT0 Mon Mar 19 10:59:45 2012 setup_sysfs_battery: /sys/class/power_supply/BAT0/energy_full, /sys/class/power_supply/BAT0/energy_now Mon Mar 19 10:59:45 2012 setup_sysfs_power_entry: checking /sys/class/power_supply/AC/type Mon Mar 19 10:59:45 2012 read_sysfs_entry: /sys/class/power_supply/AC/type = Mains Mon Mar 19 10:59:45 2012 setup_sysfs_ac_power: /sys/class/power_supply/AC Mon Mar 19 10:59:45 2012 read_sysfs_entry: /sys/class/power_supply/AC/online = 1 Mon Mar 19 10:59:45 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/present = 1 Mon Mar 19 10:59:45 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/energy_full = 35010000 Mon Mar 19 10:59:45 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/energy_now = 34040000 Mon Mar 19 10:59:45 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/status = Unknown Mon Mar 19 10:59:46 2012 read_sysfs_entry: /sys/class/power_supply/AC/online = 1 Mon Mar 19 10:59:46 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/present = 1 Mon Mar 19 10:59:46 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/energy_full = 35010000 Mon Mar 19 10:59:46 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/energy_now = 34040000 Mon Mar 19 10:59:46 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/status = Unknown Mon Mar 19 10:59:51 2012 read_sysfs_entry: /sys/class/power_supply/AC/online = 1 Mon Mar 19 10:59:51 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/present = 1 Mon Mar 19 10:59:51 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/energy_full = 35010000 Mon Mar 19 10:59:51 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/energy_now = 34040000 Mon Mar 19 10:59:51 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/status = Unknown Mon Mar 19 10:59:56 2012 read_sysfs_entry: /sys/class/power_supply/AC/online = 1 Mon Mar 19 10:59:56 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/present = 1 Mon Mar 19 10:59:56 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/energy_full = 35010000 Mon Mar 19 10:59:56 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/energy_now = 34040000 Mon Mar 19 10:59:56 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/status = Unknown Mon Mar 19 11:00:01 2012 read_sysfs_entry: /sys/class/power_supply/AC/online = 1 Mon Mar 19 11:00:01 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/present = 1 Mon Mar 19 11:00:01 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/energy_full = 35010000 Mon Mar 19 11:00:01 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/energy_now = 34040000 Mon Mar 19 11:00:01 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/status = Unknown Mon Mar 19 11:00:12 2012 read_sysfs_entry: /sys/class/power_supply/AC/online = 1 Mon Mar 19 11:00:12 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/present = 1 Mon Mar 19 11:00:12 2012 read_sysfs_entry: cannot read /sys/class/power_supply/BAT0/energy_full Mon Mar 19 11:00:12 2012 read_sysfs_entry: cannot read /sys/class/power_supply/BAT0/energy_now Mon Mar 19 11:00:12 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/status = Unknown Mon Mar 19 11:00:17 2012 read_sysfs_entry: /sys/class/power_supply/AC/online = 1 Mon Mar 19 11:00:17 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/present = 1 Mon Mar 19 11:00:17 2012 read_sysfs_entry: cannot read /sys/class/power_supply/BAT0/energy_full Mon Mar 19 11:00:17 2012 read_sysfs_entry: cannot read /sys/class/power_supply/BAT0/energy_now Mon Mar 19 11:00:17 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/status = Unknown ---<snap>--- Good case: ---<snip>--- Mon Mar 19 11:02:14 2012 --- GKrellM 2.3.5 --- Mon Mar 19 11:02:14 2012 sysfs_power_setup() entry Mon Mar 19 11:02:14 2012 setup_sysfs_power_entry: checking /sys/class/power_supply/BAT0/type Mon Mar 19 11:02:14 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/type = Battery Mon Mar 19 11:02:14 2012 setup_sysfs_battery: /sys/class/power_supply/BAT0 Mon Mar 19 11:02:14 2012 setup_sysfs_battery: /sys/class/power_supply/BAT0/charge_full, /sys/class/power_supply/BAT0/charge_now Mon Mar 19 11:02:14 2012 setup_sysfs_power_entry: checking /sys/class/power_supply/AC/type Mon Mar 19 11:02:14 2012 read_sysfs_entry: /sys/class/power_supply/AC/type = Mains Mon Mar 19 11:02:14 2012 setup_sysfs_ac_power: /sys/class/power_supply/AC Mon Mar 19 11:02:14 2012 read_sysfs_entry: /sys/class/power_supply/AC/online = 1 Mon Mar 19 11:02:14 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/present = 1 Mon Mar 19 11:02:14 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/charge_full = 3501000 Mon Mar 19 11:02:14 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/charge_now = 3404000 Mon Mar 19 11:02:14 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/status = Unknown Mon Mar 19 11:02:14 2012 read_sysfs_entry: /sys/class/power_supply/AC/online = 1 Mon Mar 19 11:02:14 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/present = 1 Mon Mar 19 11:02:14 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/charge_full = 3501000 Mon Mar 19 11:02:14 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/charge_now = 3404000 Mon Mar 19 11:02:14 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/status = Unknown Mon Mar 19 11:02:19 2012 read_sysfs_entry: /sys/class/power_supply/AC/online = 1 Mon Mar 19 11:02:19 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/present = 1 Mon Mar 19 11:02:19 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/charge_full = 3501000 Mon Mar 19 11:02:19 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/charge_now = 3404000 Mon Mar 19 11:02:19 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/status = Unknown Mon Mar 19 11:02:24 2012 read_sysfs_entry: /sys/class/power_supply/AC/online = 1 Mon Mar 19 11:02:24 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/present = 1 Mon Mar 19 11:02:24 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/charge_full = 3501000 Mon Mar 19 11:02:24 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/charge_now = 3404000 Mon Mar 19 11:02:24 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/status = Unknown Mon Mar 19 11:02:29 2012 read_sysfs_entry: /sys/class/power_supply/AC/online = 1 Mon Mar 19 11:02:29 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/present = 1 Mon Mar 19 11:02:29 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/charge_full = 3501000 Mon Mar 19 11:02:29 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/charge_now = 3404000 Mon Mar 19 11:02:29 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/status = Unknown Mon Mar 19 11:02:34 2012 read_sysfs_entry: /sys/class/power_supply/AC/online = 1 Mon Mar 19 11:02:34 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/present = 1 Mon Mar 19 11:02:34 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/charge_full = 3501000 Mon Mar 19 11:02:34 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/charge_now = 3404000 Mon Mar 19 11:02:34 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/status = Unknown Mon Mar 19 11:02:47 2012 read_sysfs_entry: /sys/class/power_supply/AC/online = 1 Mon Mar 19 11:02:47 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/present = 1 Mon Mar 19 11:02:47 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/charge_full = 3501000 Mon Mar 19 11:02:47 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/charge_now = 3404000 Mon Mar 19 11:02:47 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/status = Unknown Mon Mar 19 11:02:51 2012 read_sysfs_entry: /sys/class/power_supply/AC/online = 1 Mon Mar 19 11:02:51 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/present = 1 Mon Mar 19 11:02:51 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/charge_full = 3501000 Mon Mar 19 11:02:51 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/charge_now = 3404000 Mon Mar 19 11:02:51 2012 read_sysfs_entry: /sys/class/power_supply/BAT0/status = Unknown ---<snap>--- Oh, and while looking at the code, I noticed some opportuniries for improvement. Here is an example patch. Deliberate breaks the coding style, in order to force actual reading of the patch. I didn't even bother compiling it, after all. ;) Subject: [PATCH] Simplify setup_sysfs_battery Three copies of the same code are Plain Wrong(tm). Signed-off-by: Joern Engel <[email protected]> --- src/sysdeps/linux.c | 98 ++++++++++++++++++++++----------------------------- 1 files changed, 42 insertions(+), 56 deletions(-) diff --git a/src/sysdeps/linux.c b/src/sysdeps/linux.c index e4ff625..5a40499 100644 --- a/src/sysdeps/linux.c +++ b/src/sysdeps/linux.c @@ -1964,6 +1964,34 @@ setup_sysfs_ac_power (gchar const *sysdir) return TRUE; } +static int __setup_sysfs_battery(gchar const *sysdir, gchar const *flavor, + gchar **ret_sys_charge_full, gchar **ret_sys_charge_now) +{ + gchar *sys_charge_full; + gchar *sys_charge_now; + gint units; + + units = CHGUNITS_uWH; + sys_charge_full = g_strconcat(sysdir, "/", flavor, "_full", NULL); + if (access(sys_charge_full, F_OK | R_OK)) { + g_free(sys_charge_full); + sys_charge_full = g_strconcat(sysdir, "/", flavor, + "_full_design", NULL); + if (access(sys_charge_full, F_OK | R_OK)) { + gfree(sys_charge_full); + return -EINVAL; + } + } + sys_charge_now = g_strconcat(sysdir, "/", flavor, "_now", NULL); + if (access(sys_charge_now, F_OK | R_OK)) { + gfree(sys_charge_now); + return -EINVAL; + } + *ret_sys_charge_full = sys_charge_full; + *ret_sys_charge_now = sys_charge_now; + return 0; +} + static gboolean setup_sysfs_battery (gchar const *sysdir) { @@ -1971,7 +1999,7 @@ setup_sysfs_battery (gchar const *sysdir) gchar *sys_charge_full = NULL, *sys_charge_now = NULL; gint units; - gboolean retval = FALSE; + int err; /* * There are three flavors of reporting: 'energy', 'charge', and @@ -1982,56 +2010,22 @@ setup_sysfs_battery (gchar const *sysdir) if (_GK.debug_level & DEBUG_BATTERY) g_debug ("setup_sysfs_battery: %s\n", sysdir); units = CHGUNITS_uWH; - sys_charge_full = g_strconcat (sysdir, "/energy_full", NULL); - if (access (sys_charge_full, F_OK | R_OK)) - { - g_free (sys_charge_full); - sys_charge_full = g_strconcat (sysdir, "/energy_full_design", NULL); - if (access (sys_charge_full, F_OK | R_OK)) - { - goto try_charge; /* Look down */ - } - } - sys_charge_now = g_strconcat (sysdir, "/energy_now", NULL); - if (!access (sys_charge_now, F_OK | R_OK)) - goto done; /* Look down */ - -try_charge: - if (sys_charge_full) g_free (sys_charge_full), sys_charge_full = NULL; - if (sys_charge_now) g_free (sys_charge_now), sys_charge_now = NULL; + err = __setup_sysfs_battery(sysdir, "energy", &sys_charge_full, + &sys_charge_now); + if (!err) + goto done; units = CHGUNITS_uAH; - sys_charge_full = g_strconcat (sysdir, "/charge_full", NULL); - if (access (sys_charge_full, F_OK | R_OK)) - { - g_free (sys_charge_full); - sys_charge_full = g_strconcat (sysdir, "/charge_full_design", NULL); - if (access (sys_charge_full, F_OK | R_OK)) - { - goto try_capacity; /* Look down */ - } - } - sys_charge_now = g_strconcat (sysdir, "/charge_now", NULL); - if (!access (sys_charge_now, F_OK | R_OK)) - goto done; /* Look down */ - -try_capacity: - if (sys_charge_full) g_free (sys_charge_full), sys_charge_full = NULL; - if (sys_charge_now) g_free (sys_charge_now), sys_charge_now = NULL; + err = __setup_sysfs_battery(sysdir, "charge", &sys_charge_full, + &sys_charge_now); + if (!err) + goto done; - /* This one's a little simpler... */ units = CHGUNITS_PERCENT; - /* - * FIXME: I have no idea if 'capacity_full' actually shows up, since - * 'capacity' always defines "full" as always 100% - */ - sys_charge_full = g_strconcat (sysdir, "/capacity_full", NULL); - if (access (sys_charge_full, F_OK | R_OK)) - goto ackphft; /* Look down */ - - sys_charge_now = g_strconcat (sysdir, "/capacity_now", NULL); - if (access (sys_charge_now, F_OK | R_OK)) - goto ackphft; /* Look down */ + err = __setup_sysfs_battery(sysdir, "capacity", &sys_charge_full, + &sys_charge_now); + if (err) + return FALSE; done: sp = g_new0 (syspower, 1); @@ -2047,15 +2041,7 @@ done: if (_GK.debug_level & DEBUG_BATTERY) g_debug ("setup_sysfs_battery: %s, %s\n", sys_charge_full, sys_charge_now); - retval = TRUE; - - if (0) - { -ackphft: - if (sys_charge_full) g_free (sys_charge_full); - if (sys_charge_now) g_free (sys_charge_now); - } - return retval; + return TRUE; } static gboolean -- 1.7.9 -- To UNSUBSCRIBE, email to [email protected] with a subject of "unsubscribe". Trouble? Contact [email protected]

