update.c

Go to the documentation of this file.
00001 /*
00002 lkmonitor (Linux Kernel Monitor)
00003 
00004 Application for monitoring and tuning a Linux kernel.
00005 
00006 Copyright (C) 2005-2006  Fernando ApesteguĂ­a
00007 
00008 This program is free software; you can redistribute it and/or
00009 modify it under the terms of the GNU General Public License
00010 as published by the Free Software Foundation; either version 2
00011 of the License, or (at your option) any later version.
00012 
00013 This program is distributed in the hope that it will be useful,
00014 but WITHOUT ANY WARRANTY; without even the implied warranty of
00015 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00016 GNU General Public License for more details.
00017 
00018 You should have received a copy of the GNU General Public License
00019 along with this program; if not, write to the Free Software
00020 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
00021 */
00022 
00025 #ifdef HAVE_CONFIG_H
00026 #  include <config.h>
00027 #endif
00028 
00029 #include <glib.h>
00030 
00031 #include <gtk/gtk.h>
00032 #include <signal.h>
00033 #include "lininfo.h"
00034 #include "support.h"
00035 #include "lkmonitor.h"
00036 #include <string.h>
00037 #include <stdio.h>
00038 #include <stdlib.h>
00039 
00040 /* Some structures defined outside */
00041 extern GtkWidget *window1;
00042 extern struct mem_info mem;
00043 extern struct cpu_info cpu;
00044 extern struct dev_info devs;
00045 extern struct settings_info settings;
00046 extern struct stats_info stats;
00047 extern struct acpi_info acpi;
00048 
00054 void
00055 update_mem ()
00056 {
00057 
00058   GtkLabel *widget;
00059   GtkProgressBar *progreso;
00060   gfloat total, free;
00061 
00062   get_mem_info (&mem);
00063         
00064   //Get Gtk thread lock
00065   gdk_threads_enter();
00066 
00067 
00068   widget = GTK_LABEL(lookup_widget (window1, "lbl_total"));
00069   gtk_label_set_text (widget, (gchar *) mem.total);
00070 
00071   widget = GTK_LABEL( lookup_widget (window1, "lbl_free"));
00072   gtk_label_set_text (widget, (gchar *) mem.free);
00073 
00074   widget = GTK_LABEL(lookup_widget (window1, "lbl_buffers"));
00075   gtk_label_set_text (widget, (gchar *) mem.buffers);
00076 
00077   widget = GTK_LABEL( lookup_widget (window1, "lbl_cached"));
00078   gtk_label_set_text (widget, (gchar *) mem.cached);
00079 
00080   widget = GTK_LABEL( lookup_widget (window1, "lbl_swap_cached"));
00081   gtk_label_set_text (widget, (gchar *) mem.swap_cached);
00082 
00083   widget = GTK_LABEL( lookup_widget (window1, "lbl_active"));
00084   gtk_label_set_text (widget, (gchar *) mem.active);
00085 
00086   widget = GTK_LABEL( lookup_widget (window1, "lbl_inactive"));
00087   gtk_label_set_text (widget, (gchar *) mem.inactive);
00088 
00089   widget = GTK_LABEL( lookup_widget (window1, "lbl_dirty"));
00090   gtk_label_set_text (widget, (gchar *) mem.dirty);
00091 
00092   widget = GTK_LABEL( lookup_widget (window1, "lbl_hp_total"));
00093   gtk_label_set_text (widget, (gchar *) mem.hugepages_total);
00094 
00095   widget = GTK_LABEL( lookup_widget (window1, "lbl_hp_free"));
00096   gtk_label_set_text (widget, (gchar *) mem.hugepages_free);
00097 
00098   widget = GTK_LABEL( lookup_widget (window1, "lbl_hp_size"));
00099   gtk_label_set_text (widget, (gchar *) mem.hugepages_size);
00100 
00101   widget = GTK_LABEL( lookup_widget (window1, "lbl_high_total"));
00102   gtk_label_set_text (widget, (gchar *) mem.high_total);
00103 
00104   widget = GTK_LABEL( lookup_widget (window1, "lbl_high_free"));
00105   gtk_label_set_text (widget, (gchar *) mem.high_free);
00106 
00107   widget = GTK_LABEL( lookup_widget (window1, "lbl_low_total"));
00108   gtk_label_set_text (widget, (gchar *) mem.low_total);
00109 
00110 
00111   widget = GTK_LABEL( lookup_widget (window1, "lbl_low_free"));
00112   gtk_label_set_text (widget, (gchar *) mem.low_free);
00113 
00114   widget = GTK_LABEL( lookup_widget (window1, "lbl_swap_total"));
00115   gtk_label_set_text (widget, (gchar *) mem.swap_total);
00116 
00117   widget = GTK_LABEL( lookup_widget (window1, "lbl_swap_free"));
00118   gtk_label_set_text (widget, (gchar *) mem.swap_free);
00119 
00120   /*Compute percentage of memory use*/
00121   total = atoi (strtok (mem.total, " "));
00122   free = atoi (strtok (mem.free, " "));
00123 
00124   g_assert(total!=0);
00125   
00126   progreso = GTK_PROGRESS_BAR(lookup_widget (window1, "pb_mem"));
00127   gtk_progress_bar_set_fraction (progreso, 
00128                                                         (gfloat) CLAMP(((total - free) / total),0,1));
00129 
00130 
00131   /*Compute percentage of swap use. Reuse variables.*/
00132 
00133 
00134   total = atoi (strtok (mem.swap_total, " "));
00135   free = atoi (strtok (mem.swap_free, " "));
00136   
00137   progreso = GTK_PROGRESS_BAR (lookup_widget (window1, "pb_swap"));
00138   
00139   if(total!=0){
00140     gtk_progress_bar_set_fraction (progreso, 
00141                                                         (gfloat) CLAMP(((total - free) / total),0,1));
00142           }
00143   else
00144     gtk_progress_bar_set_text(progreso, (gchar *)_("Not present"));
00145   
00146   gdk_threads_leave();
00147 }                               
00148 
00149 
00154 void
00155 update_cpu ()
00156 {
00157 
00158   get_cpu_info (&cpu);
00159 
00160   GtkLabel *widget;
00161 
00162   /*Not updated so, we don't need thread locking*/
00163         
00164   widget = GTK_LABEL( lookup_widget (window1, "lbl_processor"));
00165   gtk_label_set_text (widget, (gchar *) cpu.processor);
00166 
00167   widget = GTK_LABEL( lookup_widget (window1, "lbl_vendor"));
00168   gtk_label_set_text (widget, (gchar *) cpu.vendor_id);
00169 
00170   widget = GTK_LABEL( lookup_widget (window1, "lbl_family"));
00171   gtk_label_set_text (widget, (gchar *) cpu.cpu_family);
00172 
00173 
00174   widget = GTK_LABEL( lookup_widget (window1, "lbl_model"));
00175   gtk_label_set_text (widget, (gchar *) cpu.model);
00176 
00177   widget = GTK_LABEL(lookup_widget (window1, "lbl_model_name"));
00178   gtk_label_set_text (widget, (gchar *) cpu.model_name);
00179 
00180   widget = GTK_LABEL( lookup_widget (window1, "lbl_stepping"));
00181   gtk_label_set_text (widget, (gchar *) cpu.stepping);
00182 
00183   widget = GTK_LABEL( lookup_widget (window1, "lbl_Mhz"));
00184   gtk_label_set_text (widget, (gchar *) cpu.Mhz);
00185 
00186   widget = GTK_LABEL( lookup_widget (window1, "lbl_cache"));
00187   gtk_label_set_text (widget, (gchar *) cpu.cache);
00188 
00189   widget = GTK_LABEL( lookup_widget (window1, "lbl_fpu"));
00190   gtk_label_set_text (widget, (gchar *) cpu.fpu);
00191 
00192   widget = GTK_LABEL( lookup_widget (window1, "lbl_fpu_exception"));
00193   gtk_label_set_text (widget, (gchar *) cpu.fpu_exception);
00194 
00195   widget = GTK_LABEL( lookup_widget (window1, "lbl_cpu_id_level"));
00196   gtk_label_set_text (widget, (gchar *) cpu.cpuid_level);
00197 
00198   widget = GTK_LABEL( lookup_widget (window1, "lbl_wp"));
00199   gtk_label_set_text (widget, (gchar *) cpu.wp);
00200 
00201   widget = GTK_LABEL( lookup_widget (window1, "lbl_bogomips"));
00202   gtk_label_set_text (widget, (gchar *) cpu.bogomips);
00203 
00204   widget = GTK_LABEL( lookup_widget (window1, "lbl_flags"));
00205   gtk_label_set_text (widget, (gchar *) cpu.flags);
00206 
00207  
00208 }
00209 
00213 void update_cpu_mhz(void)
00214 {
00215         GtkLabel *mhz_label;
00216         char str[10];
00217         
00218         get_mhz_info(str);
00219         
00220         gdk_threads_enter();
00221         
00222         mhz_label=GTK_LABEL(lookup_widget(window1,"lbl_Mhz"));
00223         gtk_label_set_text(mhz_label,str);
00224         
00225         gdk_threads_leave();
00226 }
00227 
00231 void update_devs()
00232 {
00233   get_devs_info(&devs);
00234         
00235         GtkListStore *model;
00236         GtkTreeView *gtv;
00237         GtkTreeIter iter;
00238 
00239         /* IMPORTANT:
00240                 We should not lock with gdk_threads_enter because this function is 
00241                 called from a callback and callbacks are already running inside a gdk
00242                 lock.
00243                 In addition, this function is called from main thread before the collector
00244                 thread is created, so we don't need to prevent the access from the other
00245                 thread.
00246         */
00247 
00248 /* We want the model of the GtkTreeView for char devices */
00249 gtv=GTK_TREE_VIEW(lookup_widget(window1,"gtv_char"));
00250 model=GTK_LIST_STORE(gtk_tree_view_get_model(gtv));
00251 
00252         gtk_tree_view_set_model(gtv,NULL);
00253         gtk_list_store_clear(model);
00254         lkmonitor_fill_tv(model,gtv,iter,devs.characters->str);
00255         gtk_tree_view_set_model(gtv,GTK_TREE_MODEL(model));
00256 
00257 /* We want the model of the GtkTreeView for block devices */
00258 gtv=GTK_TREE_VIEW(lookup_widget(window1,"gtv_block"));
00259 model=GTK_LIST_STORE(gtk_tree_view_get_model(gtv));
00260 gtk_tree_view_set_model(gtv,NULL);
00261         gtk_list_store_clear(model);
00262 lkmonitor_fill_tv(model,gtv,iter,devs.blocks->str);
00263         gtk_tree_view_set_model(gtv,GTK_TREE_MODEL(model));
00264 
00265 }
00266 
00270 void update_settings()
00271 {
00272         GtkSpinButton *spb;
00273         GtkLabel *lbl;
00274         GtkEntry *ent;
00275         gchar str[10]; /* For numeric conversion. */
00276         
00277         get_settings_info(&settings);
00278 
00279         /* IMPORTANT:
00280                 We should not lock with gdk_threads_enter because this function is 
00281                 called from a callback and callbacks are already running inside a gdk
00282                 lock.
00283                 In addition, this function is called from main thread before the collector
00284                 thread is created, so we don't need to prevent the access from the other
00285                 thread.
00286         */
00287         
00288         /* Identification */
00289         ent=GTK_ENTRY(lookup_widget(window1,"ent_hostname"));
00290         gtk_entry_set_text(ent,settings.host->str);
00291         
00292         ent=GTK_ENTRY(lookup_widget(window1,"ent_domainname"));
00293         gtk_entry_set_text(ent,settings.domain->str);
00294         
00295         
00296         /* threads */
00297         spb=GTK_SPIN_BUTTON(lookup_widget(window1,"spb_maxthreads"));
00298         gtk_spin_button_set_value(spb,(gdouble)settings.threads);
00299         
00300         /* files */
00301         spb=GTK_SPIN_BUTTON(lookup_widget(window1,"spb_fdmax"));
00302         gtk_spin_button_set_value(spb,(gdouble)settings.fdmax);
00303         
00304         lbl=GTK_LABEL(lookup_widget(window1,"lbl_inmax"));
00305         sprintf(str,"%d",settings.inmax);
00306         gtk_label_set_text(lbl,str);
00307         
00308         lbl=GTK_LABEL(lookup_widget(window1,"lbl_fda"));
00309         sprintf(str,"%d",settings.fdasig);
00310         gtk_label_set_text(lbl,str);
00311         
00312         lbl=GTK_LABEL(lookup_widget(window1,"lbl_ufd"));
00313         sprintf(str,"%d",settings.fdfreed);
00314         gtk_label_set_text(lbl,str);
00315         
00316         lbl=GTK_LABEL(lookup_widget(window1,"lbl_ina"));
00317         sprintf(str,"%d",settings.inasig);
00318         gtk_label_set_text(lbl,str);
00319         
00320         /* RT POSIX Signals */
00321         spb=GTK_SPIN_BUTTON(lookup_widget(window1,"spb_mq"));
00322         gtk_spin_button_set_value(spb,(gdouble)settings.posix_mq);
00323         
00324         spb=GTK_SPIN_BUTTON(lookup_widget(window1,"spb_max_mpq"));
00325         gtk_spin_button_set_value(spb,(gdouble)settings.posix_mpq);
00326         
00327         spb=GTK_SPIN_BUTTON(lookup_widget(window1,"spb_max_ms"));
00328         gtk_spin_button_set_value(spb,(gdouble)settings.posix_ms);
00329         
00330         /* Shared Memory */
00331         spb=GTK_SPIN_BUTTON(lookup_widget(window1,"spb_max_pages"));
00332         gtk_spin_button_set_value(spb,(gdouble)settings.page_max);
00333         
00334         spb=GTK_SPIN_BUTTON(lookup_widget(window1,"spb_max_segs"));
00335         gtk_spin_button_set_value(spb,(gdouble)settings.seg_max);
00336         
00337         spb=GTK_SPIN_BUTTON(lookup_widget(window1,"spb_seg_size"));
00338         gtk_spin_button_set_value(spb,(gdouble)settings.seg_size);
00339         
00340         /* Semaphores */
00341         
00342         spb=GTK_SPIN_BUTTON(lookup_widget(window1,"spb_sem_per_id"));
00343         gtk_spin_button_set_value(spb,(gdouble)settings.max_seminset);
00344         
00345         spb=GTK_SPIN_BUTTON(lookup_widget(window1,"spb_sem_val"));
00346         gtk_spin_button_set_value(spb,(gdouble)settings.max_semsys);
00347         
00348         spb=GTK_SPIN_BUTTON(lookup_widget(window1,"spb_ops"));
00349         gtk_spin_button_set_value(spb,(gdouble)settings.max_opcall);
00350         
00351         spb=GTK_SPIN_BUTTON(lookup_widget(window1,"spb_sem_id"));
00352         gtk_spin_button_set_value(spb,(gdouble)settings.max_semsets);
00353         
00354         
00355 }
00356 
00360 void update_misc()
00361 {
00362         GtkLabel *lbl;
00363         GtkProgressBar *pb;
00364         gfloat total,free;
00365         static float old_total,old_use;
00366         float use;
00367         gchar percent[4];
00368         gchar user[10];
00369         gchar nice[10];
00370         gchar system[10];
00371         gchar idle[10];
00372         gchar iowait[10];
00373         gchar irq[10];
00374         gchar softirq[10];
00375 
00376 get_acpi_info(&acpi);
00377         
00378   get_stats_info(&stats);
00379   sscanf(stats.cpu->str,"%s %s %s %s %s %s %s",user,nice,system,idle,iowait,\
00380                                                                                                         irq,softirq);
00381         gdk_threads_enter();
00382         
00383         lbl=GTK_LABEL(lookup_widget(window1,"lbl_user"));
00384         gtk_label_set_text(lbl,user);
00385         lbl=GTK_LABEL(lookup_widget(window1,"lbl_nice"));
00386         gtk_label_set_text(lbl,nice);
00387         lbl=GTK_LABEL(lookup_widget(window1,"lbl_system"));
00388         gtk_label_set_text(lbl,system);
00389         lbl=GTK_LABEL(lookup_widget(window1,"lbl_idle"));
00390         gtk_label_set_text(lbl,idle);
00391         lbl=GTK_LABEL(lookup_widget(window1,"lbl_iowait"));
00392         gtk_label_set_text(lbl,iowait);
00393         lbl=GTK_LABEL(lookup_widget(window1,"lbl_irq"));
00394         gtk_label_set_text(lbl,irq);
00395         lbl=GTK_LABEL(lookup_widget(window1,"lbl_softirq"));
00396         gtk_label_set_text(lbl,softirq);
00397         
00398         lbl=GTK_LABEL(lookup_widget(window1,"lbl_context"));
00399         gtk_label_set_text(lbl,stats.ctxt->str);
00400         
00401         total=atof(user)+atof(nice)+atof(system)+atof(idle)+atof(iowait)+
00402                         atof(irq)+atof(softirq);
00403                         
00404         free=atof(idle)+atof(iowait)+atof(irq)+atof(softirq);
00405         use=total-free;
00406                         
00407         pb=GTK_PROGRESS_BAR(lookup_widget(window1,"pb_cpu"));
00408         gtk_progress_bar_set_fraction(pb,CLAMP((use-old_use)/(total-old_total),0,1));
00409         sprintf(percent,"%.0f%s",CLAMP((use-old_use),0,100),"%");
00410         gtk_progress_bar_set_text(pb,percent);
00411         
00412         old_use=use;
00413         old_total=total;
00414         
00415         /*Update ACPI*/
00416         
00417         lbl=GTK_LABEL(lookup_widget(window1,"lbl_cap"));
00418         gtk_label_set_text(lbl,acpi.battery.cap->str);
00419         lbl=GTK_LABEL(lookup_widget(window1,"lbl_last_cap"));
00420         gtk_label_set_text(lbl,acpi.battery.last_cap->str);
00421         lbl=GTK_LABEL(lookup_widget(window1,"lbl_cap_warning"));
00422         gtk_label_set_text(lbl,acpi.battery.cap_warning->str);
00423         lbl=GTK_LABEL(lookup_widget(window1,"lbl_cap_low"));
00424         gtk_label_set_text(lbl,acpi.battery.cap_low->str);
00425         lbl=GTK_LABEL(lookup_widget(window1,"lbl_batt_type"));
00426         gtk_label_set_text(lbl,acpi.battery.type->str);
00427         
00428         if(strcmp(acpi.temp->str,_("Unknown"))!=0){
00429                 total=atof(acpi.temp_critical->str);
00430                 free=atof(acpi.temp->str);
00431         
00432                 pb=GTK_PROGRESS_BAR(lookup_widget(window1,"pb_temp"));
00433                 gtk_progress_bar_set_fraction(pb,free/total);
00434                 gtk_progress_bar_set_text(pb,acpi.temp->str);
00435         }else{
00436                 pb=GTK_PROGRESS_BAR(lookup_widget(window1,"pb_temp"));
00437                 gtk_progress_bar_set_text(pb,_("Unknown"));
00438         }
00439 
00440         if(strcmp(acpi.battery.rem->str,_("Unknown"))!=0){
00441                 total=atof(acpi.battery.cap->str);
00442                 free=atof(acpi.battery.rem->str);
00443         
00444                 pb=GTK_PROGRESS_BAR(lookup_widget(window1,"pb_batt"));
00445                 gtk_progress_bar_set_fraction(pb,free/total);
00446                 gtk_progress_bar_set_text(pb,acpi.battery.rem->str);
00447         }else{
00448                 pb=GTK_PROGRESS_BAR(lookup_widget(window1,"pb_batt"));
00449                 gtk_progress_bar_set_text(pb,_("Unknown"));
00450         }
00451   
00452   
00453         
00454   gdk_threads_leave();
00455 }

Generated on Sat Dec 2 11:27:51 2006 for lkmonitor by  doxygen 1.5.1