#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 UNK_STR _("Unknown") |
#define UNK_STR _("Unknown") |
void update_fd_info | ( | int | pid, | |
GtkTreeView * | gtv, | |||
struct dirent ** | file_list, | |||
int | numfiles | |||
) |
Updates file descriptors information
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
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
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
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 }