/home/fernape/Projects/lkmonitor/src/update.c

Go to the documentation of this file.
00001 
00002 /*
00003         lkmonitor (Linux Kernel Monitor)
00004 
00005         Application for monitoring and tuning a Linux kernel.
00006 
00007         Copyright (C) 2005-2008  Fernando ApesteguĂ­a
00008 
00009         This program is free software; you can redistribute it and/or
00010         modify it under the terms of the GNU General Public License
00011         as published by the Free Software Foundation; either version 2
00012         of the License, or (at your option) any later version.
00013 
00014         This program is distributed in the hope that it will be useful,
00015         but WITHOUT ANY WARRANTY; without even the implied warranty of
00016         MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00017         GNU General Public License for more details.
00018 
00019         You should have received a copy of the GNU General Public License
00020         along with this program; if not, write to the Free Software
00021         Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
00022 */
00023 
00024 /* 
00025  * Update data functions
00026  *      Show updated data to user
00027  */     
00028 
00029 #ifdef HAVE_CONFIG_H
00030 #  include <config.h>
00031 #endif
00032 
00033 #include <glib.h>
00034 
00035 #include <gtk/gtk.h>
00036 #include <signal.h>
00037 #include <string.h>
00038 #include <stdio.h>
00039 #include <stdlib.h>
00040 #include "processes.h"
00041 #include "lininfo.h"
00042 #include "support.h"
00043 #include "lkmonitor.h"
00044 #include "others.h"
00045 
00046 /* Some structures defined outside */
00047 extern GtkWidget *window1;
00048 extern struct mem_info mem;
00049 extern struct cpu_info cpu;
00050 extern struct dev_info devs;
00051 extern struct settings_info settings;
00052 extern struct stats_info stats;
00053 extern struct acpi_info acpi;
00054 extern struct cmd_ver cmdversion;
00055 extern struct channels_info cn_info;
00056 extern struct net_dev_info netinfo;
00057 extern struct fs_info fsinfo;
00058 extern struct modules_info modinfo;
00059 
00065 void
00066 update_mem ()
00067 {
00068 
00069   GtkLabel *widget;
00070   GtkProgressBar *progreso;
00071   gfloat total, free;
00072 
00073   get_mem_info (&mem);
00074         
00075   //Get Gtk thread lock
00076   gdk_threads_enter();
00077 
00078 
00079   widget = GTK_LABEL(lookup_widget (window1, "lbl_total"));
00080   gtk_label_set_text (widget, (gchar *) mem.total);
00081 
00082   widget = GTK_LABEL( lookup_widget (window1, "lbl_free"));
00083   gtk_label_set_text (widget, (gchar *) mem.free);
00084 
00085   widget = GTK_LABEL(lookup_widget (window1, "lbl_buffers"));
00086   gtk_label_set_text (widget, (gchar *) mem.buffers);
00087 
00088   widget = GTK_LABEL( lookup_widget (window1, "lbl_cached"));
00089   gtk_label_set_text (widget, (gchar *) mem.cached);
00090 
00091   widget = GTK_LABEL( lookup_widget (window1, "lbl_swap_cached"));
00092   gtk_label_set_text (widget, (gchar *) mem.swap_cached);
00093 
00094   widget = GTK_LABEL( lookup_widget (window1, "lbl_active"));
00095   gtk_label_set_text (widget, (gchar *) mem.active);
00096 
00097   widget = GTK_LABEL( lookup_widget (window1, "lbl_inactive"));
00098   gtk_label_set_text (widget, (gchar *) mem.inactive);
00099 
00100   widget = GTK_LABEL( lookup_widget (window1, "lbl_dirty"));
00101   gtk_label_set_text (widget, (gchar *) mem.dirty);
00102 
00103   widget = GTK_LABEL( lookup_widget (window1, "lbl_hp_total"));
00104   gtk_label_set_text (widget, (gchar *) mem.hugepages_total);
00105 
00106   widget = GTK_LABEL( lookup_widget (window1, "lbl_hp_free"));
00107   gtk_label_set_text (widget, (gchar *) mem.hugepages_free);
00108 
00109   widget = GTK_LABEL( lookup_widget (window1, "lbl_hp_size"));
00110   gtk_label_set_text (widget, (gchar *) mem.hugepages_size);
00111 
00112   widget = GTK_LABEL( lookup_widget (window1, "lbl_high_total"));
00113   gtk_label_set_text (widget, (gchar *) mem.high_total);
00114 
00115   widget = GTK_LABEL( lookup_widget (window1, "lbl_high_free"));
00116   gtk_label_set_text (widget, (gchar *) mem.high_free);
00117 
00118   widget = GTK_LABEL( lookup_widget (window1, "lbl_low_total"));
00119   gtk_label_set_text (widget, (gchar *) mem.low_total);
00120 
00121 
00122   widget = GTK_LABEL( lookup_widget (window1, "lbl_low_free"));
00123   gtk_label_set_text (widget, (gchar *) mem.low_free);
00124 
00125   widget = GTK_LABEL( lookup_widget (window1, "lbl_swap_total"));
00126   gtk_label_set_text (widget, (gchar *) mem.swap_total);
00127 
00128   widget = GTK_LABEL( lookup_widget (window1, "lbl_swap_free"));
00129   gtk_label_set_text (widget, (gchar *) mem.swap_free);
00130 
00131   /*Compute percentage of memory use*/
00132   total = atoi (strtok (mem.total, " "));
00133   free = atoi (strtok (mem.free, " "));
00134 
00135   g_assert(total!=0);
00136   
00137   progreso = GTK_PROGRESS_BAR(lookup_widget (window1, "pb_mem"));
00138   gtk_progress_bar_set_fraction (progreso, 
00139                                                         (gfloat) CLAMP(((total - free) / total),0,1));
00140 
00141 
00142   /*Compute percentage of swap use. Reuse variables.*/
00143 
00144 
00145   total = atoi (strtok (mem.swap_total, " "));
00146   free = atoi (strtok (mem.swap_free, " "));
00147   
00148   progreso = GTK_PROGRESS_BAR (lookup_widget (window1, "pb_swap"));
00149   
00150   if(total!=0){
00151     gtk_progress_bar_set_fraction (progreso, 
00152                                                         (gfloat) CLAMP(((total - free) / total),0,1));
00153           }
00154   else
00155     gtk_progress_bar_set_text(progreso, (gchar *)_("Not present"));
00156   
00157   gdk_threads_leave();
00158 }                               
00159 
00160 
00165 void
00166 update_cpu ()
00167 {
00168 
00169   get_cpu_info (&cpu);
00170 
00171   GtkLabel *widget;
00172 
00173   /*Not updated so, we don't need thread locking*/
00174         
00175   widget = GTK_LABEL( lookup_widget (window1, "lbl_processor"));
00176   gtk_label_set_text (widget, (gchar *) cpu.processor);
00177 
00178   widget = GTK_LABEL( lookup_widget (window1, "lbl_vendor"));
00179   gtk_label_set_text (widget, (gchar *) cpu.vendor_id);
00180 
00181   widget = GTK_LABEL( lookup_widget (window1, "lbl_family"));
00182   gtk_label_set_text (widget, (gchar *) cpu.cpu_family);
00183 
00184 
00185   widget = GTK_LABEL( lookup_widget (window1, "lbl_model"));
00186   gtk_label_set_text (widget, (gchar *) cpu.model);
00187 
00188   widget = GTK_LABEL(lookup_widget (window1, "lbl_model_name"));
00189   gtk_label_set_text (widget, (gchar *) cpu.model_name);
00190 
00191   widget = GTK_LABEL( lookup_widget (window1, "lbl_stepping"));
00192   gtk_label_set_text (widget, (gchar *) cpu.stepping);
00193 
00194   widget = GTK_LABEL( lookup_widget (window1, "lbl_Mhz"));
00195   gtk_label_set_text (widget, (gchar *) cpu.Mhz);
00196 
00197   widget = GTK_LABEL( lookup_widget (window1, "lbl_cache"));
00198   gtk_label_set_text (widget, (gchar *) cpu.cache);
00199 
00200   widget = GTK_LABEL( lookup_widget (window1, "lbl_fpu"));
00201   gtk_label_set_text (widget, (gchar *) cpu.fpu);
00202 
00203   widget = GTK_LABEL( lookup_widget (window1, "lbl_fpu_exception"));
00204   gtk_label_set_text (widget, (gchar *) cpu.fpu_exception);
00205 
00206   widget = GTK_LABEL( lookup_widget (window1, "lbl_cpu_id_level"));
00207   gtk_label_set_text (widget, (gchar *) cpu.cpuid_level);
00208 
00209   widget = GTK_LABEL( lookup_widget (window1, "lbl_wp"));
00210   gtk_label_set_text (widget, (gchar *) cpu.wp);
00211 
00212   widget = GTK_LABEL( lookup_widget (window1, "lbl_bogomips"));
00213   gtk_label_set_text (widget, (gchar *) cpu.bogomips);
00214 
00215   widget = GTK_LABEL( lookup_widget (window1, "lbl_flags"));
00216   gtk_label_set_text (widget, (gchar *) cpu.flags);
00217 
00218  
00219 }
00220 
00224 void update_cpu_mhz(void)
00225 {
00226         GtkLabel *mhz_label;
00227         char str[10];
00228         
00229         get_mhz_info(str);
00230         
00231         gdk_threads_enter();
00232         
00233         mhz_label=GTK_LABEL(lookup_widget(window1,"lbl_Mhz"));
00234         gtk_label_set_text(mhz_label,str);
00235         
00236         gdk_threads_leave();
00237 }
00238 
00242 void update_devs()
00243 {
00244         if(get_devs_info(&devs)==-1){
00245                 /*File doesn't exist. Don't do anything*/
00246                 return;
00247         }
00248         
00249         GtkListStore *model;
00250         GtkTreeView *gtv;
00251         GtkTreeIter iter;
00252 
00253         /* IMPORTANT:
00254                 We should not lock with gdk_threads_enter because this function is 
00255                 called from a callback and callbacks are already running inside a gdk
00256                 lock.
00257                 In addition, this function is called from main thread before the collector
00258                 thread is created, so we don't need to prevent the access from the other
00259                 thread.
00260         */
00261 
00262         /* We want the model of the GtkTreeView for char devices */
00263         gtv=GTK_TREE_VIEW(lookup_widget(window1,"gtv_char"));
00264         model=GTK_LIST_STORE(gtk_tree_view_get_model(gtv));
00265 
00266         gtk_tree_view_set_model(gtv,NULL);
00267         gtk_list_store_clear(model);
00268         lkmonitor_fill_tv(model,gtv,iter,devs.characters->str,TV_DEVS);
00269         gtk_tree_view_set_model(gtv,GTK_TREE_MODEL(model));
00270 
00271         /* We want the model of the GtkTreeView for block devices */
00272         gtv=GTK_TREE_VIEW(lookup_widget(window1,"gtv_block"));
00273         model=GTK_LIST_STORE(gtk_tree_view_get_model(gtv));
00274         gtk_tree_view_set_model(gtv,NULL);
00275         gtk_list_store_clear(model);
00276         lkmonitor_fill_tv(model,gtv,iter,devs.blocks->str,TV_DEVS);
00277         gtk_tree_view_set_model(gtv,GTK_TREE_MODEL(model));
00278 
00279 }
00280 
00284 void update_settings()
00285 {
00286         GtkSpinButton *spb;
00287         GtkLabel *lbl;
00288         GtkEntry *ent;
00289         gchar str[10]; /* For numeric conversion. */
00290         
00291         if(get_settings_info(&settings)==1){
00292                 /* I leave this section just in case. Should the code in get_settings_info
00293                         doesn't find the date, default values are set. We can safely update
00294                         the gtk widgets.
00295                 */
00296         }
00297 
00298         /* IMPORTANT:
00299                 We should not lock with gdk_threads_enter because this function is 
00300                 called from a callback and callbacks are already running inside a gdk
00301                 lock.
00302                 In addition, this function is called from main thread before the collector
00303                 thread is created, so we don't need to prevent the access from the other
00304                 thread.
00305         */
00306         
00307         /* Identification */
00308         ent=GTK_ENTRY(lookup_widget(window1,"ent_hostname"));
00309         gtk_entry_set_text(ent,settings.host->str);
00310         
00311         ent=GTK_ENTRY(lookup_widget(window1,"ent_domainname"));
00312         gtk_entry_set_text(ent,settings.domain->str);
00313         
00314         
00315         /* threads */
00316         spb=GTK_SPIN_BUTTON(lookup_widget(window1,"spb_maxthreads"));
00317         gtk_spin_button_set_value(spb,(gdouble)settings.threads);
00318         
00319         /* files */
00320         spb=GTK_SPIN_BUTTON(lookup_widget(window1,"spb_fdmax"));
00321         gtk_spin_button_set_value(spb,(gdouble)settings.fdmax);
00322         
00323         lbl=GTK_LABEL(lookup_widget(window1,"lbl_inmax"));
00324         sprintf(str,"%d",settings.inmax);
00325         gtk_label_set_text(lbl,str);
00326         
00327         lbl=GTK_LABEL(lookup_widget(window1,"lbl_fda"));
00328         sprintf(str,"%d",settings.fdasig);
00329         gtk_label_set_text(lbl,str);
00330         
00331         lbl=GTK_LABEL(lookup_widget(window1,"lbl_ufd"));
00332         sprintf(str,"%d",settings.fdfreed);
00333         gtk_label_set_text(lbl,str);
00334         
00335         lbl=GTK_LABEL(lookup_widget(window1,"lbl_ina"));
00336         sprintf(str,"%d",settings.inasig);
00337         gtk_label_set_text(lbl,str);
00338         
00339         /* RT POSIX Signals */
00340         spb=GTK_SPIN_BUTTON(lookup_widget(window1,"spb_mq"));
00341         gtk_spin_button_set_value(spb,(gdouble)settings.posix_mq);
00342         
00343         spb=GTK_SPIN_BUTTON(lookup_widget(window1,"spb_max_mpq"));
00344         gtk_spin_button_set_value(spb,(gdouble)settings.posix_mpq);
00345         
00346         spb=GTK_SPIN_BUTTON(lookup_widget(window1,"spb_max_ms"));
00347         gtk_spin_button_set_value(spb,(gdouble)settings.posix_ms);
00348         
00349         /* Shared Memory */
00350         spb=GTK_SPIN_BUTTON(lookup_widget(window1,"spb_max_pages"));
00351         gtk_spin_button_set_value(spb,(gdouble)settings.page_max);
00352         
00353         spb=GTK_SPIN_BUTTON(lookup_widget(window1,"spb_max_segs"));
00354         gtk_spin_button_set_value(spb,(gdouble)settings.seg_max);
00355         
00356         spb=GTK_SPIN_BUTTON(lookup_widget(window1,"spb_seg_size"));
00357         gtk_spin_button_set_value(spb,(gdouble)settings.seg_size);
00358         
00359         /* Semaphores */
00360         
00361         spb=GTK_SPIN_BUTTON(lookup_widget(window1,"spb_sem_per_id"));
00362         gtk_spin_button_set_value(spb,(gdouble)settings.max_seminset);
00363         
00364         spb=GTK_SPIN_BUTTON(lookup_widget(window1,"spb_sem_val"));
00365         gtk_spin_button_set_value(spb,(gdouble)settings.max_semsys);
00366         
00367         spb=GTK_SPIN_BUTTON(lookup_widget(window1,"spb_ops"));
00368         gtk_spin_button_set_value(spb,(gdouble)settings.max_opcall);
00369         
00370         spb=GTK_SPIN_BUTTON(lookup_widget(window1,"spb_sem_id"));
00371         gtk_spin_button_set_value(spb,(gdouble)settings.max_semsets);
00372         
00373         
00374 }
00375 
00379 void update_misc()
00380 {
00381         GtkLabel *lbl;
00382         GtkProgressBar *pb;
00383         gfloat total,free;
00384         static float old_total,old_use;
00385         float use;
00386         gchar percent[4];
00387         gchar user[10];
00388         gchar nice[10];
00389         gchar system[10];
00390         gchar idle[10];
00391         gchar iowait[10];
00392         gchar irq[10];
00393         gchar softirq[10];
00394         int ret_stats, ret_acpi;        
00395 
00396 
00397         ret_acpi = get_acpi_info(&acpi);
00398         
00399         ret_stats = get_stats_info(&stats);
00400         sscanf(stats.cpu->str,"%s %s %s %s %s %s %s",user,nice,system,idle,iowait,\
00401                                                                                                         irq,softirq);
00402         gdk_threads_enter();
00403         
00404   if(ret_stats!=-1){
00405         lbl=GTK_LABEL(lookup_widget(window1,"lbl_user"));
00406         gtk_label_set_text(lbl,user);
00407         lbl=GTK_LABEL(lookup_widget(window1,"lbl_nice"));
00408         gtk_label_set_text(lbl,nice);
00409         lbl=GTK_LABEL(lookup_widget(window1,"lbl_system"));
00410         gtk_label_set_text(lbl,system);
00411         lbl=GTK_LABEL(lookup_widget(window1,"lbl_idle"));
00412         gtk_label_set_text(lbl,idle);
00413         lbl=GTK_LABEL(lookup_widget(window1,"lbl_iowait"));
00414         gtk_label_set_text(lbl,iowait);
00415         lbl=GTK_LABEL(lookup_widget(window1,"lbl_irq"));
00416         gtk_label_set_text(lbl,irq);
00417         lbl=GTK_LABEL(lookup_widget(window1,"lbl_softirq"));
00418         gtk_label_set_text(lbl,softirq);
00419         
00420         lbl=GTK_LABEL(lookup_widget(window1,"lbl_context"));
00421         gtk_label_set_text(lbl,stats.ctxt->str);
00422         
00423         total=atof(user)+atof(nice)+atof(system)+atof(idle)+atof(iowait)+
00424                         atof(irq)+atof(softirq);
00425                         
00426         free=atof(idle)+atof(iowait)+atof(irq)+atof(softirq);
00427         use=total-free;
00428                         
00429         pb=GTK_PROGRESS_BAR(lookup_widget(window1,"pb_cpu"));
00430         gtk_progress_bar_set_fraction(pb,CLAMP((use-old_use)/(total-old_total),0,1));
00431         sprintf(percent,"%.0f%s",CLAMP((use-old_use),0,100),"%");
00432         gtk_progress_bar_set_text(pb,percent);
00433         
00434         old_use=use;
00435         old_total=total;
00436 
00437         }
00438 
00439         /*Update ACPI*/
00440 
00441   if(ret_acpi != -1){
00442 
00443         lbl=GTK_LABEL(lookup_widget(window1,"lbl_cap"));
00444         gtk_label_set_text(lbl,acpi.battery.cap->str);
00445         lbl=GTK_LABEL(lookup_widget(window1,"lbl_last_cap"));
00446         gtk_label_set_text(lbl,acpi.battery.last_cap->str);
00447         lbl=GTK_LABEL(lookup_widget(window1,"lbl_cap_warning"));
00448         gtk_label_set_text(lbl,acpi.battery.cap_warning->str);
00449         lbl=GTK_LABEL(lookup_widget(window1,"lbl_cap_low"));
00450         gtk_label_set_text(lbl,acpi.battery.cap_low->str);
00451         lbl=GTK_LABEL(lookup_widget(window1,"lbl_batt_type"));
00452         gtk_label_set_text(lbl,acpi.battery.type->str);
00453         
00454         if(strcmp(acpi.temp->str,"")!=0){
00455                 total=atof(acpi.temp_critical->str);
00456                 free=atof(acpi.temp->str);
00457         
00458                 pb=GTK_PROGRESS_BAR(lookup_widget(window1,"pb_temp"));
00459                 gtk_progress_bar_set_fraction(pb,free/total);
00460                 gtk_progress_bar_set_text(pb,acpi.temp->str);
00461         }else{
00462                 pb=GTK_PROGRESS_BAR(lookup_widget(window1,"pb_temp"));
00463                 gtk_progress_bar_set_text(pb,_("Unknown"));
00464         }
00465 
00466         if(strcmp(acpi.battery.rem->str,"")!=0){
00467                 total=atof(acpi.battery.cap->str);
00468                 free=atof(acpi.battery.rem->str);
00469         
00470                 pb=GTK_PROGRESS_BAR(lookup_widget(window1,"pb_batt"));
00471                 gtk_progress_bar_set_fraction(pb,free/total);
00472                 gtk_progress_bar_set_text(pb,acpi.battery.rem->str);
00473         }else{
00474                 pb=GTK_PROGRESS_BAR(lookup_widget(window1,"pb_batt"));
00475                 gtk_progress_bar_set_text(pb,_("Unknown"));
00476         }
00477   
00478  }  
00479         
00480   gdk_threads_leave();
00481 }
00482 
00483 
00486 static void update_process_list()
00487 {
00488         static GSList *pidlist;
00489         int numfiles,i,j,p,pidtemp,dato;
00490         gboolean found;
00491         gchar cmdline[100];
00492         char path[20];
00493         struct dirent **proclist;
00494         struct lnode *mynode;
00495         FILE *fstatus;
00496         GtkTreeIter iter;
00497         GtkListStore *model;
00498         GtkTreeView *gtv;
00499         
00500         gdk_threads_enter();
00501         /*Get the GtkTreeView reference and associated objects*/
00502         gtv=GTK_TREE_VIEW(lookup_widget(window1,"gtv_processes"));
00503         model=GTK_LIST_STORE(gtk_tree_view_get_model(gtv));
00504         
00505         if ((numfiles=get_proc_list(&proclist))<0){
00506                 g_warning("Error while scaning /proc");
00507         }
00508         else{
00509                 for(i=0;i<numfiles;i++){
00510                         mynode=g_malloc(sizeof(struct lnode));
00511                         mynode->pid=atoi(proclist[i]->d_name);
00512                         if(g_slist_find_custom(pidlist,(gpointer)(mynode),list_com)==NULL){
00513                                 /*The element is not found, so we need to attacht
00514                                 the pid to the list */
00515                                 /*Get the process command*/
00516                                 sprintf(path,"/proc/%s/status",proclist[i]->d_name);
00517                                 fstatus=fopen(path,"r");
00518                                 fscanf(fstatus,"Name: %[^\n]",cmdline);
00519                                 mynode->cmdname=g_string_new(cmdline);
00520                                 pidlist=g_slist_append(pidlist,mynode);
00521                                 gtk_list_store_append(model,&iter);
00522                                 gtk_list_store_set(model,&iter,0,mynode->pid,1,cmdline,-1);
00523                                 fclose(fstatus);
00524                         }else{
00525                                 /* Free the node */
00526                                 g_free(mynode);
00527                         }
00528                         
00529                 }
00530                 /*
00531                 Now we should delete the process that are no more.
00532                 */
00533                 
00534                 /*Initialize the iter*/
00535                 
00536                 if(gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model),&iter)==FALSE)
00537                         g_warning("Problem while getting iter first.\n");
00538                 
00539                 
00540                 for(i=0;i<g_slist_length(pidlist);i++){
00541                         dato=0;
00542                         found=FALSE;
00543                         mynode=g_slist_nth_data(pidlist,i);
00544                         pidtemp=mynode->pid;
00545                         for (j=0;(j<numfiles && found==FALSE);j++){
00546                                 if ((p=atoi(proclist[j]->d_name))==pidtemp){
00547                                         found=TRUE;  //The pid is still in the system
00548                                 }
00549                         }
00550                         if (found==FALSE){
00551                                 //We traverse all the list and the pid was not found. Delete it
00552                                 pidlist=g_slist_remove(pidlist,(gpointer)mynode);
00553                                 g_string_free(mynode->cmdname,TRUE);
00554                                 g_free(mynode);
00555                                 gtk_list_store_remove(model,&iter);
00556                                 g_print("Deleted %d process\n",pidtemp);
00557                         }else{
00558                                 gtk_tree_model_iter_next(GTK_TREE_MODEL(model),&iter);
00559                         }
00560                 }               
00561         }
00562 
00563         
00564         gdk_threads_leave();
00565 
00566         /* Clean up */
00567 
00568         /*We need to free dirent structures allocated by scandir()*/
00569         for(i=0;i<numfiles;i++)
00570                 free(proclist[i]);
00571         
00572         /*Free the list itself*/
00573         free(proclist);
00574         
00575 }
00576 
00577 
00580 void update_process()
00581 {
00582   GtkLabel *lbl;
00583   GString *text;
00584   float one,five,fifteen;
00585   int pid,ret;
00586   char executing[15];   /*big enough to read that value*/
00587   
00588 
00589         /* First the process list */
00590   update_process_list();
00591 
00592   /*Now we want to update the load average information*/
00593   ret = get_loadavg_info(&cmdversion);  
00594 
00595   sscanf(cmdversion.loadavg->str,"%f %f %f %s %d",&one,&five,&fifteen, executing,&pid);
00596   text=g_string_new("");
00597   if(ret != -1)
00598         g_string_printf(text,"%.2f %.2f %.2f",one,five,fifteen);
00599 
00600   gdk_threads_enter();
00601     
00602   lbl=GTK_LABEL(lookup_widget(window1,"lbl_load"));
00603   gtk_label_set_text(lbl,text->str);
00604 
00605   lbl=GTK_LABEL(lookup_widget(window1,"lbl_entities"));
00606   gtk_label_set_text(lbl,executing);
00607 
00608   gdk_threads_leave();
00609 
00610 }
00611 
00614 void update_cmd_ver()
00615 {
00616   GtkLabel *lbl;
00617 
00618         /* Get the information */
00619   if(get_cmd_ver_info(&cmdversion)==-1){
00620                 /* We don't need to do anything. The cmdversion structure
00621                         has the default values.
00622                 */
00623   }
00624 
00625   gdk_threads_enter();
00626 
00627   lbl=GTK_LABEL(lookup_widget(window1,"lbl_cmd"));
00628   gtk_label_set_text(lbl,cmdversion.cmd->str);
00629 
00630   lbl=GTK_LABEL(lookup_widget(window1,"lbl_version"));
00631   gtk_label_set_text(lbl,cmdversion.version->str);
00632 
00633   gdk_threads_leave();
00634 
00635 }
00636 
00637 
00640 void update_channels()
00641 {
00642 
00643 /* IMPORTANT:
00644                 We should not lock with gdk_threads_enter because this function is 
00645                 called from a callback and callbacks are already running inside a gdk
00646                 lock.
00647                 In addition, this function is called from main thread before the collector
00648                 thread is created, so we don't need to prevent the access from the other
00649                 thread.
00650 */
00651         
00652         GtkTextView *gtextv;
00653         GtkTextBuffer *gtbuffer;
00654 
00655         /* Getting information */
00656    if(get_channels_info(&cn_info)==-1){
00657                 /* Values after calling get_channels info are safe
00658                         We don't need to do anything here.
00659                 */
00660         }
00661    
00662 
00663         gtextv=GTK_TEXT_VIEW(lookup_widget(window1, "gtextv_ioports"));
00664         gtbuffer=gtk_text_view_get_buffer(gtextv);
00665         gtk_text_buffer_set_text(gtbuffer,cn_info.ioports->str,cn_info.ioports->len);
00666         
00667         gtextv=GTK_TEXT_VIEW(lookup_widget(window1, "gtextv_iomem"));
00668         gtbuffer=gtk_text_view_get_buffer(gtextv);
00669         gtk_text_buffer_set_text(gtbuffer,cn_info.iomem->str,cn_info.iomem->len);
00670         
00671         gtextv=GTK_TEXT_VIEW(lookup_widget(window1, "gtextv_dma"));
00672         gtbuffer=gtk_text_view_get_buffer(gtextv);
00673         gtk_text_buffer_set_text(gtbuffer,cn_info.dma->str,cn_info.dma->len);
00674    
00675 }
00676 
00679 void update_net_info()
00680 {
00681   GtkComboBox *gcb_netdevs;
00682   GtkLabel *lbl;
00683   int ret;
00684  
00685         /* Get device list */
00686   gdk_threads_enter();
00687   gcb_netdevs=GTK_COMBO_BOX(lookup_widget(window1,"cb_net_devs"));
00688   gdk_threads_leave();
00689 
00690 if(GTK_WIDGET_IS_SENSITIVE(gcb_netdevs)){
00691   /* Get info for the active device */ 
00692   ret = get_net_info(&netinfo,gtk_combo_box_get_active(gcb_netdevs));
00693   
00694  if(ret != -1){
00695   gdk_threads_enter();
00696 
00697   /* Show in the window... */  
00698   
00699   /* Bytes */
00700   lbl=GTK_LABEL(lookup_widget(window1,"lbl_r_bytes"));
00701   gtk_label_set_text(lbl,(gchar *)lkmonitor_itoa(netinfo.bytes[0]));
00702   lbl=GTK_LABEL(lookup_widget(window1,"lbl_t_bytes"));
00703   gtk_label_set_text(lbl,(gchar *)lkmonitor_itoa(netinfo.bytes[1]));
00704 
00705   /* Packets */
00706   lbl=GTK_LABEL(lookup_widget(window1,"lbl_r_packets"));
00707   gtk_label_set_text(lbl,(gchar *)lkmonitor_itoa(netinfo.packets[0]));
00708   lbl=GTK_LABEL(lookup_widget(window1,"lbl_t_packets"));
00709   gtk_label_set_text(lbl,(gchar *)lkmonitor_itoa(netinfo.packets[1]));
00710 
00711   /* Errors */
00712   lbl=GTK_LABEL(lookup_widget(window1,"lbl_r_errors"));
00713   gtk_label_set_text(lbl,(gchar *)lkmonitor_itoa(netinfo.errs[0]));
00714   lbl=GTK_LABEL(lookup_widget(window1,"lbl_t_errors"));
00715   gtk_label_set_text(lbl,(gchar *)lkmonitor_itoa(netinfo.errs[1]));
00716 
00717   /* Drop */
00718   lbl=GTK_LABEL(lookup_widget(window1,"lbl_r_drop"));
00719   gtk_label_set_text(lbl,(gchar *)lkmonitor_itoa(netinfo.drop[0]));
00720   lbl=GTK_LABEL(lookup_widget(window1,"lbl_t_drop"));
00721   gtk_label_set_text(lbl,(gchar *)lkmonitor_itoa(netinfo.drop[1]));
00722   
00723   /* Fifo */
00724   lbl=GTK_LABEL(lookup_widget(window1,"lbl_r_fifo"));
00725   gtk_label_set_text(lbl,(gchar *)lkmonitor_itoa(netinfo.fifo[0]));
00726   lbl=GTK_LABEL(lookup_widget(window1,"lbl_t_fifo"));
00727   gtk_label_set_text(lbl,(gchar *)lkmonitor_itoa(netinfo.fifo[1]));
00728 
00729   /* Compressed */
00730   lbl=GTK_LABEL(lookup_widget(window1,"lbl_r_compressed"));
00731   gtk_label_set_text(lbl,(gchar *)lkmonitor_itoa(netinfo.compressed[0]));
00732   lbl=GTK_LABEL(lookup_widget(window1,"lbl_t_compressed"));
00733   gtk_label_set_text(lbl,(gchar *)lkmonitor_itoa(netinfo.compressed[1]));
00734 
00735 
00736   /* Receiving specific data */
00737   lbl=GTK_LABEL(lookup_widget(window1,"lbl_r_frame"));
00738   gtk_label_set_text(lbl,(gchar *)lkmonitor_itoa(netinfo.r_frame));
00739   lbl=GTK_LABEL(lookup_widget(window1,"lbl_r_multicast"));
00740   gtk_label_set_text(lbl,(gchar *)lkmonitor_itoa(netinfo.r_multicast));
00741 
00742   /* Transmiting specific data */
00743   lbl=GTK_LABEL(lookup_widget(window1,"lbl_t_colls"));
00744   gtk_label_set_text(lbl,(gchar *)lkmonitor_itoa(netinfo.t_colls));
00745   lbl=GTK_LABEL(lookup_widget(window1,"lbl_t_carrier"));
00746   gtk_label_set_text(lbl,(gchar *)lkmonitor_itoa(netinfo.t_carrier));
00747 
00748   gdk_threads_leave();
00749 
00750  }
00751 
00752 }
00753 
00754 }
00755 
00756 
00759 void update_fs_info()
00760 {
00761 
00762   GtkTextBuffer *gtbuffer;
00763   GtkTextView *gtextv;
00764   int ret;
00765 
00766   /* Get information */
00767   ret = get_fs_info(&fsinfo);
00768 
00769   if(ret == -1){
00770         /* Return values in fsinfo are safe. Don't need do anything here*/
00771   }
00772 
00773   gdk_threads_enter();
00774 
00775   /* Show in the window*/
00776 
00777   gtextv=GTK_TEXT_VIEW(lookup_widget(window1,"gtextv_fs"));
00778   gtbuffer=gtk_text_view_get_buffer(gtextv);
00779   gtk_text_buffer_set_text(gtbuffer,fsinfo.devs->str,fsinfo.devs->len);
00780   
00781 
00782   gtextv=GTK_TEXT_VIEW(lookup_widget(window1,"gtextv_pfs"));
00783   gtbuffer=gtk_text_view_get_buffer(gtextv);
00784   gtk_text_buffer_set_text(gtbuffer,fsinfo.nodevs->str,fsinfo.nodevs->len);
00785 
00786   gdk_threads_leave();
00787 
00788   
00789 }
00790 
00791 
00792 
00795 void update_modules_info()
00796 {
00797 
00798         GtkListStore *model;
00799         GtkTreeView *gtv;
00800         GtkTreeIter iter;
00801         int ret;
00802 
00803         /* Get information */
00804         ret = get_mod_info(&modinfo);
00805 
00806         /* IMPORTANT:
00807                 We should not lock with gdk_threads_enter because this function is 
00808                 called from a callback and callbacks are already running inside a gdk
00809                 lock.
00810                 In addition, this function is called from main thread before the collector
00811                 thread is created, so we don't need to prevent the access from the other
00812                 thread.
00813         */
00814 
00815   if(ret != -1){
00816         /* We want the model of the GtkTreeView */
00817         gtv=GTK_TREE_VIEW(lookup_widget(window1,"gtv_modules"));
00818         model=GTK_LIST_STORE(gtk_tree_view_get_model(gtv));
00819 
00820         gtk_tree_view_set_model(gtv,NULL);
00821         gtk_list_store_clear(model);
00822         lkmonitor_fill_tv(model,gtv,iter,modinfo.contents->str,TV_MODS);
00823         gtk_tree_view_set_model(gtv,GTK_TREE_MODEL(model));
00824   }
00825 
00826 }

Generated on Tue Apr 1 22:52:52 2008 for lkmonitor by  doxygen 1.5.1