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]

Reply via email to