/home/fernape/Projects/lkmonitor/src/procupdate.c File Reference

#include <glib.h>
#include <gtk/gtk.h>
#include <gnome.h>
#include <dirent.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include "lkmonitor.h"
#include "procinfo.h"
#include "support.h"

Go to the source code of this file.

Defines

#define UNK_STR   _("Unknown")
#define UNK_STR   _("Unknown")

Functions

void update_memory_maps (GtkTreeView *gtv, char *maps)
void update_fd_info (int pid, GtkTreeView *gtv, struct dirent **file_list, int numfiles)
void update_mm_details (char *mmregion, GtkWindow *window, int pid)
void update_process_window (int pid, char *name, GtkWindow *window)


Define Documentation

#define UNK_STR   _("Unknown")

#define UNK_STR   _("Unknown")


Function Documentation

void update_fd_info ( int  pid,
GtkTreeView *  gtv,
struct dirent **  file_list,
int  numfiles 
)

Updates file descriptors information

Parameters:
pid The PID of the process we want to query
gtv The GtkTreeView containing the information
file_list dirent structure double pointer
numfiles Number of opened file descriptors

Definition at line 299 of file procupdate.c.

References UNK_STR.

Referenced by update_process_window().

00300 {
00301 
00302 #define UNK_STR _("Unknown")
00303         int i;
00304         GtkTreeIter iter;
00305         GtkListStore *model;
00306         GString *path;
00307         GString *type;
00308         GString *object;
00309         struct stat file_info;
00310 
00311         /* Initialize the GStrings */
00312    path=g_string_new("");
00313    type=g_string_new("");
00314    object=g_string_new("");
00315 
00316         /* Take the model */
00317         model=GTK_LIST_STORE(gtk_tree_view_get_model(gtv)); 
00318 
00319         /* For every file, get some information */
00320         for(i=0;i<numfiles;i++){
00321                 g_string_printf(path,"/proc/%d/fd/%s",pid,file_list[i]->d_name);
00322                 if(stat(path->str,&file_info)){
00323                         /* Put here default values */
00324                         g_string_printf(type,"%s",UNK_STR);
00325                         g_string_printf(object,"%s",UNK_STR);
00326                 }else{
00327                         /* We got information for the file */
00328                         get_type_by_fd(type,object,file_info.st_mode,path->str);
00329                 }
00330 
00331                 gtk_list_store_append(model,&iter);
00332                 gtk_list_store_set(model,&iter,0,file_list[i]->d_name,1,type->str,2,object->str,-1);
00333 
00334         }
00335 
00336 
00337         /* Free the dirent data structures and the list itself 
00338          * only in case the list has been filled some time before
00339          */
00340         if(numfiles!=-1){
00341                 int i;
00342                 for(i=0;i<numfiles;i++)
00343                         free(file_list[i]);
00344 
00345                 free(file_list);
00346         }
00347 
00348         /* Freeing GStrings */
00349         g_string_free(path,TRUE);
00350         g_string_free(type,TRUE);
00351         g_string_free(object,TRUE);
00352 
00353 }

void update_memory_maps ( GtkTreeView *  gtv,
char *  maps 
)

Update memory maps section

Parameters:
gtv TreeView containing the memory maps
maps Updated memroy maps

Definition at line 195 of file procupdate.c.

Referenced by update_process_window().

00196 {
00197 
00198   GtkTreeIter iter;
00199   GtkListStore *model;
00200   char *pointer;
00201   //char address[24],flags[4],size[10],dev[8],inode[16],object[200];
00202   /* --FIXME: Sizes for teh variables... */
00203   char address[100],flags[100],size[100],dev[100],inode[100],object[200];
00204 
00205   model=GTK_LIST_STORE(gtk_tree_view_get_model(gtv)); 
00206   
00207   pointer=maps;
00208 
00209   while(*pointer!='\0'){
00210         gtk_list_store_append(model,&iter);
00211         sscanf(pointer,"%s %s %s %s %s %s",address,flags,size,dev,inode,object);
00212         gtk_list_store_set(model,&iter,0,address,1,flags,2,size,3,dev,4,
00213                                 inode,5,object,-1);
00214         pointer=strchr(pointer,'\n')+1;
00215   }
00216 
00217 }

void update_mm_details ( char *  mmregion,
GtkWindow *  window,
int  pid 
)

Update details of the memory regions

Parameters:
mmregion The mmregion we want to update details for
window The main window
pid The PID of the process

Definition at line 360 of file procupdate.c.

References get_mm_details(), lookup_widget(), mm_details::priv_clean, mm_details::priv_dirty, mm_details::rss, mm_details::sh_clean, mm_details::sh_dirty, and mm_details::size.

Referenced by on_tv_maps_row_activated().

00361 {
00362         struct mm_details details;
00363         GtkLabel *lbl;
00364         GString *gs=g_string_new("");
00365 
00366         get_mm_details(pid,&details,mmregion);
00367 
00368         /* Update the widgets */
00369         lbl=GTK_LABEL(lookup_widget(GTK_WIDGET(window),"lbl_size"));
00370         gtk_label_set_text(lbl,details.size);
00371         lbl=GTK_LABEL(lookup_widget(GTK_WIDGET(window),"lbl_rss"));
00372         gtk_label_set_text(lbl,details.rss);
00373         lbl=GTK_LABEL(lookup_widget(GTK_WIDGET(window),"lbl_shared"));
00374         g_string_printf(gs,"%s / %s",details.sh_clean,details.sh_dirty);
00375         gtk_label_set_text(lbl,gs->str);
00376         lbl=GTK_LABEL(lookup_widget(GTK_WIDGET(window),"lbl_private"));
00377         g_string_printf(gs,"%s / %s",details.priv_clean,details.priv_dirty);
00378         gtk_label_set_text(lbl,gs->str);
00379 
00380 
00381         /* Cleaning up */
00382         g_string_free(gs,TRUE);
00383 }

void update_process_window ( int  pid,
char *  name,
GtkWindow *  window 
)

Update the process window

Parameters:
pid The PID of the process
name The name of the process
window The main window

Definition at line 390 of file procupdate.c.

References procinfo::cmdline, procinfo::data, procinfo::env, procinfo::exe, get_process_info(), procinfo::lib, lkmonitor_itoa(), procinfo::locked, lookup_widget(), procinfo::maps, procinfo::rss, procinfo::size, procinfo::sleepavg, procinfo::stack, procinfo::state, procinfo::threads, update_fd_info(), and update_memory_maps().

Referenced by on_gtv_processes_row_activated().

00391 {
00392         g_assert(pid>0 && name!=NULL && window!=NULL);
00393 
00394   struct procinfo pi;
00395   struct dirent **file_list;
00396   int numfiles;
00397 
00398   /* Construct the GtkTreeView for memory maps */
00399   treeviews_construct(window);
00400   gtktextbuffers_construct(window);
00401   
00402   /* Put the window title */
00403   {
00404         /* Construct the title */
00405         GString *title=g_string_new("");
00406         g_string_printf(title,"%s (PID: %d)",name,pid);
00407 
00408         gtk_window_set_title(window,title->str);
00409 
00410         /* Free things in this block */
00411         g_string_free(title,TRUE);
00412   }
00413 
00414   /* Get Process information */
00415   get_process_info(pid,&pi,&file_list,&numfiles);
00416   /* Display data */
00417 
00418   /*
00419    * NOTICE: This is inside the global gdk lock cause this is call from a
00420    * callback associated to a double click event.
00421    * So we don't need gdk_threads_enter/gdk_threads_leave
00422   */
00423 
00424   /* Command line */
00425   {
00426         GtkLabel *lbl;
00427         lbl=GTK_LABEL(lookup_widget(GTK_WIDGET(window),"lbl_cmdline"));
00428         gtk_label_set_text(lbl,pi.cmdline->str);
00429   }
00430 
00431   /* Environment variables */
00432   {
00433         GtkTextBuffer *gtb;
00434         GtkTextView *gtv;
00435         gtv=GTK_TEXT_VIEW(lookup_widget(GTK_WIDGET(window),"textv_environ"));
00436         gtb=gtk_text_view_get_buffer(gtv);
00437         gtk_text_buffer_set_text(gtb,pi.env->str,pi.env->len);
00438   }
00439 
00440   /* Memory maps */
00441   {
00442         GtkTreeView *gtv_mmaps;
00443         gtv_mmaps=GTK_TREE_VIEW(lookup_widget(GTK_WIDGET(window),"tv_maps"));
00444         update_memory_maps(gtv_mmaps,pi.maps->str);
00445   }
00446 
00447         /* Opened files */
00448         {
00449                 GtkTreeView *gtv_fd;
00450                 GtkLabel *lbl;
00451                 gtv_fd=GTK_TREE_VIEW(lookup_widget(GTK_WIDGET(window),"tv_files"));
00452                 update_fd_info(pid,gtv_fd,file_list,numfiles);
00453 
00454                 lbl=GTK_LABEL(lookup_widget(GTK_WIDGET(window),"lbl_files"));
00455                 if(numfiles!=-1)
00456                         gtk_label_set_text(lbl,(gchar *)lkmonitor_itoa(numfiles));
00457                 else
00458                         gtk_label_set_text(lbl,"No info.");
00459                 /* 
00460                  * The file_list structure and associated data are
00461                  * freed in the update_fd_info function
00462                 */
00463         }
00464 
00465         /* VM info and other status file bits... */
00466         {
00467                 GtkLabel *lbl;
00468 
00469                 lbl=GTK_LABEL(lookup_widget(GTK_WIDGET(window),"lbl_vmsize"));
00470                 gtk_label_set_text(lbl,pi.size);
00471                 lbl=GTK_LABEL(lookup_widget(GTK_WIDGET(window),"lbl_vmlocked"));
00472                 gtk_label_set_text(lbl,pi.locked);
00473                 lbl=GTK_LABEL(lookup_widget(GTK_WIDGET(window),"lbl_vmrss"));
00474                 gtk_label_set_text(lbl,pi.rss);
00475                 lbl=GTK_LABEL(lookup_widget(GTK_WIDGET(window),"lbl_vmdata"));
00476                 gtk_label_set_text(lbl,pi.data);
00477                 lbl=GTK_LABEL(lookup_widget(GTK_WIDGET(window),"lbl_vmstack"));
00478                 gtk_label_set_text(lbl,pi.stack);
00479                 lbl=GTK_LABEL(lookup_widget(GTK_WIDGET(window),"lbl_vmexecutable"));
00480                 gtk_label_set_text(lbl,pi.exe);
00481                 lbl=GTK_LABEL(lookup_widget(GTK_WIDGET(window),"lbl_vmlibraries"));
00482                 gtk_label_set_text(lbl,pi.lib);
00483                 lbl=GTK_LABEL(lookup_widget(GTK_WIDGET(window),"lbl_state"));
00484                 gtk_label_set_text(lbl,pi.state);
00485                 lbl=GTK_LABEL(lookup_widget(GTK_WIDGET(window),"lbl_sleepavg"));
00486                 gtk_label_set_text(lbl,pi.sleepavg);
00487                 lbl=GTK_LABEL(lookup_widget(GTK_WIDGET(window),"lbl_threads"));
00488                 gtk_label_set_text(lbl,pi.threads);
00489         
00490         }
00491 
00492 }


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