Updating branch refs/heads/master
         to 3db6c5ebd7161bc71354522f5703607902b9b2fd (commit)
       from 8b0228ac7c58f1ff5d861c8e38d92a5aa86e87b5 (commit)

commit 3db6c5ebd7161bc71354522f5703607902b9b2fd
Author: Harald Judt <h.j...@gmx.at>
Date:   Sat Aug 17 16:03:46 2013 +0200

    Refactor code for reading sysfs files.

 panel-plugin/xfce4-cpufreq-linux.c |  287 ++++++++++++++----------------------
 1 file changed, 108 insertions(+), 179 deletions(-)

diff --git a/panel-plugin/xfce4-cpufreq-linux.c 
b/panel-plugin/xfce4-cpufreq-linux.c
index 11a7ddb..9460806 100644
--- a/panel-plugin/xfce4-cpufreq-linux.c
+++ b/panel-plugin/xfce4-cpufreq-linux.c
@@ -34,11 +34,71 @@
 # define _(String) gettext (String)
 #endif
 
-static gboolean
+#define SYSFS_READ_STRING(file, contents, string)              \
+       if (contents = read_sysfs_file_contents (file)) {       \
+               g_free (string);                                                
                \
+               string = contents;                                              
                \
+       }
+
+#define SYSFS_READ_STRING_LIST(file, contents, list)                           
\
+       if (contents = read_sysfs_file_contents (file)) {                       
        \
+               gchar **tokens = NULL;                                          
                                \
+               gint i = 0;                                                     
                                                \
+               tokens = g_strsplit (contents, " ", 0);                         
                \
+               g_free (contents);                                              
                                        \
+               g_list_free_full (list, g_free);                                
                        \
+               while (tokens[i] != NULL) {                                     
                                \
+                       list = g_list_append (list, strdup (tokens[i]));        
        \
+                       i++;                                                    
                                                \
+               }                                                               
                                                        \
+               g_strfreev (tokens);                                            
                                \
+       }
+
+#define SYSFS_READ_INT(file, contents, intval)                 \
+       if (contents = read_sysfs_file_contents (file)) {       \
+               intval = atoi (contents);                                       
        \
+               g_free (contents);                                              
                \
+       }
+
+#define SYSFS_READ_INT_LIST(file, contents, list)                              
        \
+       if (contents = read_sysfs_file_contents (file)) {                       
        \
+               gchar **tokens = NULL;                                          
                                \
+               gint i = 0;                                                     
                                                \
+               tokens = g_strsplit (contents, " ", 0);                         
                \
+               g_free (contents);                                              
                                        \
+               g_list_free (list);                                             
                                        \
+               while (tokens[i] != NULL) {                                     
                                \
+                       gint value = atoi (tokens[i]);                          
                        \
+                       list = g_list_append (list, GINT_TO_POINTER (value));   
\
+                       i++;                                                    
                                                \
+               }                                                               
                                                        \
+               g_strfreev (tokens);                                            
                                \
+       }
+
+
+static inline gchar *
+read_sysfs_file_contents (const gchar *file)
+{
+       GError *error = NULL;
+       gchar *contents = NULL;
+
+       if (!g_file_test (file, G_FILE_TEST_EXISTS))
+               return NULL;
+
+       if (g_file_get_contents (file, &contents, NULL, &error)) {
+               g_strstrip (contents);
+               return contents;
+       } else {
+               g_debug ("Error reading %s: %s\n", file, error->message);
+               g_error_free (error);
+               return NULL;
+       }
+}
+
+static void
 cpufreq_cpu_parse_sysfs_init (gint cpu_number, CpuInfo *cpu)
 {
-       FILE    *file;
-       gchar   *filePath, *fileContent, **tokens;
+       gchar   *file, *contents;
        gboolean add_cpu = FALSE;
 
        if (cpu == NULL) {
@@ -48,198 +108,87 @@ cpufreq_cpu_parse_sysfs_init (gint cpu_number, CpuInfo 
*cpu)
 
        /* read available cpu freqs */
        if (cpuFreq->intel_pstate == NULL) {
-               filePath =
+               file =
                        g_strdup_printf ("/sys/devices/system/cpu/cpu%i/"
                                                         
"cpufreq/scaling_available_frequencies",
                                                         cpu_number);
-               if (!g_file_test (filePath, G_FILE_TEST_EXISTS))
-                       goto file_error;
-               file = fopen (filePath, "r");
-               if (file) {
-                       gint i = 0;
-
-                       fileContent = g_new (gchar, 255);
-                       fgets (fileContent, 255, file);
-                       fclose (file);
-
-                       fileContent = g_strchomp (fileContent);
-                       tokens = g_strsplit (fileContent, " ", 0);
-                       g_free (fileContent);
-
-                       while (tokens[i] != NULL) {
-                               gint freq = atoi (tokens[i]);
-                               cpu->available_freqs =
-                                       g_list_append (cpu->available_freqs,
-                                                                  
GINT_TO_POINTER(freq));
-                               i++;
-                       }
-                       g_strfreev (tokens);
-               }
-               g_free (filePath);
+               SYSFS_READ_INT_LIST (file, contents, cpu->available_freqs);
+               g_free (file);
        }
 
        /* read available cpu governors */
-       filePath = g_strdup_printf (
+       file = g_strdup_printf (
                
"/sys/devices/system/cpu/cpu%i/cpufreq/scaling_available_governors",
                cpu_number);
-       if (!g_file_test (filePath, G_FILE_TEST_EXISTS))
-               goto file_error;
-       file = fopen (filePath, "r");
-       if (file)
-       {
-               gint i = 0;
-
-               fileContent = g_new (gchar, 255);
-               fgets (fileContent, 255, file);
-               fclose (file);
-
-               fileContent = g_strchomp (fileContent);
-               tokens = g_strsplit (fileContent, " ", 0);
-               g_free (fileContent);
-
-               while (tokens[i] != NULL)
-               {
-                       cpu->available_governors = g_list_append (
-                                       cpu->available_governors,
-                                       g_strdup (tokens[i]));
-                       i++;
-               }
-               g_strfreev (tokens);
-       }
-       g_free (filePath);
+       SYSFS_READ_STRING_LIST (file, contents, cpu->available_governors);
+       g_free (file);
 
        /* read cpu driver */
-       filePath = g_strdup_printf (
+       file = g_strdup_printf (
                "/sys/devices/system/cpu/cpu%i/cpufreq/scaling_driver",
                cpu_number);
-       if (!g_file_test (filePath, G_FILE_TEST_EXISTS))
-               goto file_error;
-       file = fopen (filePath, "r");
-       if (file)
-       {
-               g_free (cpu->scaling_driver);
-               cpu->scaling_driver = g_new (gchar, 15);
-               fscanf (file, "%15s", cpu->scaling_driver);
-               fclose (file);
-       }
-       g_free (filePath);
+       SYSFS_READ_STRING (file, contents, cpu->scaling_driver);
+       g_free (file);
 
        /* read current cpu freq */
        if (cpuFreq->intel_pstate == NULL) {
-               filePath =
+               file =
                        g_strdup_printf ("/sys/devices/system/cpu/cpu%i/"
                                                         
"cpufreq/scaling_cur_freq",
                                                         cpu_number);
-               if (!g_file_test (filePath, G_FILE_TEST_EXISTS))
-                       goto file_error;
-               file = fopen (filePath, "r");
-               if (file) {
-                       fscanf (file, "%d", &cpu->cur_freq);
-                       fclose (file);
-               }
-               g_free (filePath);
+               SYSFS_READ_INT (file, contents, cpu->cur_freq);
+               g_free (file);
        }
 
        /* read current cpu governor */
-       filePath = g_strdup_printf (
+       file = g_strdup_printf (
                "/sys/devices/system/cpu/cpu%i/cpufreq/scaling_governor",
                cpu_number);
-       if (!g_file_test (filePath, G_FILE_TEST_EXISTS))
-               goto file_error;
-       file = fopen (filePath, "r");
-       if (file)
-       {
-               g_free (cpu->cur_governor);
-               cpu->cur_governor = g_new (gchar, 15);
-               fscanf (file, "%15s", cpu->cur_governor);
-               fclose (file);
-       }
-       g_free (filePath);
+       SYSFS_READ_STRING (file, contents, cpu->cur_governor);
+       g_free (file);
 
        /* read max cpu freq */
-       filePath = g_strdup_printf (
+       file = g_strdup_printf (
                "/sys/devices/system/cpu/cpu%i/cpufreq/scaling_max_freq",
                cpu_number);
-       if (!g_file_test (filePath, G_FILE_TEST_EXISTS))
-               goto file_error;
-       file = fopen (filePath, "r");
-       if (file)
-       {
-               fscanf (file, "%d", &cpu->max_freq);
-               fclose (file);
-       }
-       g_free (filePath);
+       SYSFS_READ_INT (file, contents, cpu->max_freq);
+       g_free (file);
 
        /* read min cpu freq */
-       filePath = g_strdup_printf (
+       file = g_strdup_printf (
                "/sys/devices/system/cpu/cpu%i/cpufreq/scaling_min_freq",
                cpu_number);
-       if (!g_file_test (filePath, G_FILE_TEST_EXISTS))
-               goto file_error;
-       file = fopen (filePath, "r");
-       if (file)
-       {
-               fscanf (file, "%d", &cpu->min_freq);
-               fclose (file);
-       }
-       g_free (filePath);
+       SYSFS_READ_INT (file, contents, cpu->min_freq);
+       g_free (file);
 
        if (add_cpu)
                g_ptr_array_add (cpuFreq->cpus, cpu);
-
-       return TRUE;
-
-file_error:
-       if (add_cpu && cpu != NULL)
-               cpuinfo_free (cpu);
-       g_free (filePath);
-       return FALSE;
 }
 
-static gboolean
+static void
 cpufreq_cpu_read_sysfs_current (gint cpu_number)
 {
        CpuInfo *cpu;
-       FILE    *file;
-       gchar   *filePath;
+       gchar   *file, *contents;
 
        cpu = g_ptr_array_index (cpuFreq->cpus, cpu_number);
 
        /* read current cpu freq */
        if (cpuFreq->intel_pstate == NULL) {
-               filePath =
+               file =
                        g_strdup_printf ("/sys/devices/system/cpu/cpu%i/"
                                                         
"cpufreq/scaling_cur_freq",
                                                         cpu_number);
-               if (!g_file_test (filePath, G_FILE_TEST_EXISTS))
-                       goto file_error;
-               file = fopen (filePath, "r");
-               if (file) {
-                       fscanf (file, "%d", &cpu->cur_freq);
-                       fclose (file);
-               }
-               g_free (filePath);
+               SYSFS_READ_INT (file, contents, cpu->cur_freq);
+               g_free (file);
        }
 
        /* read current cpu governor */
-       filePath = g_strdup_printf (
-               "/sys/devices/system/cpu/cpu%i/cpufreq/scaling_governor",
-               cpu_number);
-       if (!g_file_test (filePath, G_FILE_TEST_EXISTS))
-               goto file_error;
-       file = fopen (filePath, "r");
-       if (file)
-       {
-               fscanf (file, "%15s", cpu->cur_governor);
-               fclose (file);
-       }
-       g_free (filePath);
-
-       return TRUE;
-
-file_error:
-       g_free (filePath);
-       return FALSE;
+       file = g_strdup_printf ("/sys/devices/system/cpu/cpu%i/"
+                                                       
"cpufreq/scaling_governor",
+                                                       cpu_number);
+       SYSFS_READ_STRING (file, contents, cpu->cur_governor);
+       g_free (file);
 }
 
 static gboolean
@@ -402,53 +351,33 @@ cpufreq_cpu_read_sysfs ()
 gboolean
 cpufreq_intel_pstate_params (void)
 {
-       FILE    *file;
-       gchar   *filePath, *fileContent;
+       gchar   *file, *contents;
        IntelPState *ips;
 
        ips = g_slice_new0(IntelPState);
 
-       filePath =
+       if (!g_file_test ("/sys/devices/system/cpu/intel_pstate",
+                                         G_FILE_TEST_EXISTS))
+               return FALSE;
+
+       file =
                g_strdup ("/sys/devices/system/cpu/intel_pstate/min_perf_pct");
-       if (!g_file_test (filePath, G_FILE_TEST_EXISTS))
-               goto file_error;
-       file = fopen (filePath, "r");
-       if (file) {
-               fscanf (file, "%d", &ips->min_perf_pct);
-               fclose (file);
-       }
-       g_free (filePath);
+       SYSFS_READ_INT (file, contents, ips->min_perf_pct);
+       g_free (file);
 
-       filePath =
+       file =
                g_strdup ("/sys/devices/system/cpu/intel_pstate/max_perf_pct");
-       if (!g_file_test (filePath, G_FILE_TEST_EXISTS))
-               goto file_error;
-       file = fopen (filePath, "r");
-       if (file) {
-               fscanf (file, "%d", &ips->max_perf_pct);
-               fclose (file);
-       }
-       g_free (filePath);
+       SYSFS_READ_INT (file, contents, ips->max_perf_pct);
+       g_free (file);
 
-       filePath =
+       file =
                g_strdup ("/sys/devices/system/cpu/intel_pstate/no_turbo");
-       if (!g_file_test (filePath, G_FILE_TEST_EXISTS))
-               goto file_error;
-       file = fopen (filePath, "r");
-       if (file) {
-               fscanf (file, "%d", &ips->no_turbo);
-               fclose (file);
-       }
-       g_free (filePath);
+       SYSFS_READ_INT (file, contents, ips->no_turbo);
+       g_free (file);
 
        g_slice_free (IntelPState, cpuFreq->intel_pstate);
        cpuFreq->intel_pstate = ips;
        return TRUE;
-
-file_error:
-       g_slice_free (IntelPState, ips);
-       g_free (filePath);
-       return FALSE;
 }
 
 static gboolean
_______________________________________________
Xfce4-commits mailing list
Xfce4-commits@xfce.org
https://mail.xfce.org/mailman/listinfo/xfce4-commits

Reply via email to