diff options
author | David <dbphillipsnz@gmail.com> | 2014-09-27 13:03:09 +1200 |
---|---|---|
committer | David <dbphillipsnz@gmail.com> | 2014-09-27 13:03:09 +1200 |
commit | 432a446a7b3a6fa9ce8736bffbbe48daea578feb (patch) | |
tree | 12fc88b1b30f42b6932cd0a076dc3456868587d7 | |
parent | 54242903bd3c85e2f4bef5de10ff818480b17404 (diff) | |
download | paramano-432a446a7b3a6fa9ce8736bffbbe48daea578feb.tar.xz |
Fixed bug affecting CPUs with multiple cores
-rw-r--r-- | common.c | 11 | ||||
-rw-r--r-- | common.h | 1 | ||||
-rw-r--r-- | getfreq.c | 59 | ||||
-rw-r--r-- | getfreq.h | 2 | ||||
-rw-r--r-- | tray.c | 6 |
5 files changed, 54 insertions, 25 deletions
@@ -93,3 +93,14 @@ int get_int(const char* string) return atoi(first_num); } + + +/*********************************************************************** + * Replace occurrences of \n from end of string with \0 + **********************************************************************/ +void chomp(char* string) +{ + int i; + for (i = strlen(string)-1; (i >= 0 && string[i] == '\n'); i--) + string[i] = '\0'; +} @@ -26,6 +26,7 @@ int get_int_value_from_file(const char* filename); int get_int(const char* string); bool file_has_line(const char *filename, const char *line); FILE* check_for_file(char* path); +void chomp(char* string); // <ew> Stringification of line number #define STRING2(x) #x @@ -25,9 +25,12 @@ #include <string.h> #include <glib.h> -/* [CORE][FREQUENCY NUMBER] */ -char freqs[999][50][13]; -int total_freqs; +#define MAX_CORES 1000 +#define MAX_FREQS 50 +#define FREQ_LENGTH 14 + +char freqs[MAX_CORES][MAX_FREQS][FREQ_LENGTH]; +int total_freqs; // Number of freqs for core 0 /*********************************************************************** @@ -35,10 +38,14 @@ int total_freqs; **********************************************************************/ void gf_init() { - char freq_string[500]; + char freq_string[4096]; // POSIX suggested line length. Source of error for CPUs with a huge number of freqs + char *next_token; unsigned int i; - for(i = 0; i < gc_number(); i++) + memset(freqs, '\0', sizeof(freqs)); + + + for(i = 0; (i < gc_number() && i < MAX_CORES); i++) { memset(freq_string, '\0', sizeof(freq_string) ); @@ -49,21 +56,25 @@ void gf_init() continue; } - // freq_string is a space separated list of freqs so - // iterate over each frequency in freq_string - char* curr = &freq_string[0]; - char* end_of_curr = g_strstr_len(curr, strlen(curr), " "); - while(end_of_curr) - { - // TO DO : get rid of magic constants - memset(freqs[i][total_freqs], '\0', 13); // TO DO: get rid of magic constant 13 - memmove(freqs[i][total_freqs], curr, end_of_curr - curr); + *strchrnul(freq_string, '\n') = '\0'; - curr = end_of_curr+1; - end_of_curr = g_strstr_len(curr, strlen(curr), " "); + // freq_string is a space separated list of freqs + // Use strtok to find each + next_token = strtok(freq_string, " \n"); + total_freqs = 0; + do + { + chomp(next_token); + debug("Found frequency #%d (%s KHz)\n",freq,next_token); + strncpy(freqs[i][total_freqs], next_token, FREQ_LENGTH); total_freqs++; - } + } while((next_token = strtok(NULL, " ")) != NULL); } + + // Hit the limit of storage of cores' frequencies + if (i == MAX_CORES) + info("Unable to add more than %d cores\n", MAX_CORES); + debug("Found %d frequencies\n",total_freqs); } @@ -122,15 +133,19 @@ int gf_available(int core, char* out, int size) } /*********************************************************************** - * Populate `out` with a formatted, units-added freq label for freq + * Populate `out` with a formatted, units-added freq label for `freq` **********************************************************************/ char* gf_get_frequency_label(int freq) { char *string; - if(freq >= 1000000) // >= 1 million KHz (1GHz) - asprintf(&string, "%.2f GHz", ((float)freq/1000000) ); - else - asprintf(&string, "%.2d MHz", freq/1000); + if(freq >= 1000000000) // >= 1 billion KHz (1 THz) This, ladies and gentlement, is future-proofing ;) + asprintf(&string, "%.2f THz", (float)freq/1000000000 ); + else if(freq >= 1000000) // >= 1 million KHz (1 GHz) + asprintf(&string, "%.2f GHz", (float)freq/1000000 ); + else if (freq >= 1000) // >= 1 thousand KHz (1 MHz) + asprintf(&string, "%.2f MHz", (float)freq/1000 ); + else // < 1000 KHz (1 MHz) + asprintf(&string, "%.2f KHz", (float)freq); debug("Prepared freq label '%s' for freq %d\n",string,freq); @@ -23,7 +23,7 @@ void gf_init(); int gf_current(int core); -bool gf_available(int core, char* out, int size); +int gf_available(int core, char* out, int size); char* gf_get_frequency_label(int freq); char* gf_freqa(int core, int index); int gf_freqi(int core, int index); @@ -340,8 +340,10 @@ void tray_update_icon_percent() char* file; gulong max_frequency = gf_freqi(0, 0); gint adjusted_percent = 0; - // If no governor, set percentage to 0. This if statement fixes an FPE a few lines down - if (gg_number() == 0) + + // If max_frequency is 0, we don't want to divide by it, + // so give up, call it a day, and have a simple icon + if (max_frequency == 0) { adjusted_percent = 0; } else { |