89
return PROCMAN_RCMP(infoa->vmsize, infob->vmsize);
92
return PROCMAN_RCMP(infoa->memres, infob->memres);
95
return PROCMAN_RCMP(infoa->memwritable, infob->memwritable);
98
return PROCMAN_RCMP(infoa->memshared, infob->memshared);
101
return PROCMAN_RCMP(infoa->memxserver, infob->memxserver);
103
88
case COL_CPU_TIME:
104
89
return PROCMAN_RCMP(infoa->cpu_time_last, infob->cpu_time_last);
319
300
G_TYPE_STRING, /* Process Name */
320
301
G_TYPE_STRING, /* User */
321
302
G_TYPE_STRING, /* Status */
322
G_TYPE_STRING, /* VM Size */
323
G_TYPE_STRING, /* Resident Memory */
324
G_TYPE_STRING, /* Writable Memory */
325
G_TYPE_STRING, /* Shared Memory */
326
G_TYPE_STRING, /* X Server Memory */
303
G_TYPE_ULONG, /* VM Size */
304
G_TYPE_ULONG, /* Resident Memory */
305
G_TYPE_ULONG, /* Writable Memory */
306
G_TYPE_ULONG, /* Shared Memory */
307
G_TYPE_ULONG, /* X Server Memory */
327
308
G_TYPE_UINT, /* % CPU */
328
309
G_TYPE_STRING, /* CPU time */
329
310
G_TYPE_STRING, /* Started */
331
312
G_TYPE_UINT, /* ID */
332
313
G_TYPE_STRING, /* Security Context */
333
314
G_TYPE_STRING, /* Arguments */
334
G_TYPE_STRING, /* Memory */
315
G_TYPE_ULONG, /* Memory */
335
316
GDK_TYPE_PIXBUF, /* Icon */
336
317
G_TYPE_POINTER, /* ProcInfo */
337
318
G_TYPE_STRING /* Sexy tooltip */
373
354
for (i = COL_USER; i <= COL_MEM; i++) {
374
cell_renderer = gtk_cell_renderer_text_new ();
356
GtkCellRenderer *cell;
357
GtkTreeViewColumn *col;
359
cell = gtk_cell_renderer_text_new();
360
col = gtk_tree_view_column_new();
361
gtk_tree_view_column_pack_start(col, cell, TRUE);
362
gtk_tree_view_column_set_title(col, _(titles[i]));
363
gtk_tree_view_column_set_resizable(col, TRUE);
364
gtk_tree_view_column_set_sort_column_id(col, i);
365
gtk_tree_view_column_set_reorderable(col, TRUE);
366
gtk_tree_view_append_column(GTK_TREE_VIEW(proctree), col);
372
case COL_MEMWRITABLE:
376
gtk_tree_view_column_set_cell_data_func(col, cell,
377
&procman::size_cell_data_func,
383
gtk_tree_view_column_set_attributes(col, cell, "text", i, NULL);
386
398
case COL_CPU_TIME:
388
g_object_set(G_OBJECT(cell_renderer),
400
g_object_set(G_OBJECT(cell), "xalign", 1.0f, NULL);
393
column = gtk_tree_view_column_new ();
394
gtk_tree_view_column_pack_start (column, cell_renderer, FALSE);
395
gtk_tree_view_column_set_attributes (column, cell_renderer,
398
gtk_tree_view_column_set_title (column, _(titles[i]));
399
gtk_tree_view_column_set_sort_column_id (column, i);
400
gtk_tree_view_column_set_resizable (column, TRUE);
404
gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
405
gtk_tree_view_column_set_min_width(column, 150);
407
gtk_tree_view_column_set_sizing(col, GTK_TREE_VIEW_COLUMN_FIXED);
408
gtk_tree_view_column_set_min_width(col, 150);
408
411
gtk_tree_view_column_set_min_width(column, 20);
412
gtk_tree_view_append_column (GTK_TREE_VIEW (proctree), column);
415
416
gtk_container_add (GTK_CONTAINER (scrolled), proctree);
650
645
GtkTreeModel *model;
651
646
model = gtk_tree_view_get_model(GTK_TREE_VIEW(procdata->tree));
653
gchar *vmsize, *memres, *memwritable, *memshared, *memxserver,
654
*cpu_time, *start_time, *mem;
656
vmsize = SI_gnome_vfs_format_file_size_for_display (info->vmsize);
657
memres = SI_gnome_vfs_format_file_size_for_display (info->memres);
658
memwritable = SI_gnome_vfs_format_file_size_for_display (info->memwritable);
659
memshared = SI_gnome_vfs_format_file_size_for_display (info->memshared);
660
memxserver = SI_gnome_vfs_format_file_size_for_display (info->memxserver);
661
mem = SI_gnome_vfs_format_file_size_for_display(info->mem);
648
gchar *cpu_time, *start_time;
663
650
// expects centiseconds
664
651
cpu_time = format_duration_for_display(100 * info->cpu_time_last / procdata->frequency);
670
657
gtk_tree_store_set(GTK_TREE_STORE(model), &info->node,
671
658
COL_STATUS, info->status,
672
659
COL_USER, info->user,
675
COL_MEMWRITABLE, memwritable,
676
COL_MEMSHARED, memshared,
677
COL_MEMXSERVER, memxserver,
660
COL_VMSIZE, info->vmsize,
661
COL_MEMRES, info->memres,
662
COL_MEMWRITABLE, info->memwritable,
663
COL_MEMSHARED, info->memshared,
664
COL_MEMXSERVER, info->memxserver,
678
665
COL_CPU, guint(info->pcpu),
679
666
COL_CPU_TIME, cpu_time,
680
667
COL_START_TIME, start_time,
681
668
COL_NICE, gint(info->nice),
685
672
/* FIXME: We don't bother updating COL_SECURITYCONTEXT as it can never change.
686
673
even on fork ? */
689
g_free (memwritable);
692
674
g_free (cpu_time);
693
675
g_free(start_time);
700
insert_info_to_tree (ProcInfo *info, ProcData *procdata)
681
insert_info_to_tree (ProcInfo *info, ProcData *procdata, bool forced = false)
702
683
GtkTreeModel *model;
706
687
if (procdata->config.show_tree) {
708
ProcInfo *parent = ProcInfo::find(info->ppid);
689
ProcInfo *parent = 0;
692
parent = ProcInfo::find(info->ppid);
711
695
GtkTreePath *parent_node = gtk_tree_model_get_path(model, &parent->node);
797
783
info->pcpu = (proctime.rtime - info->cpu_time_last) * 100 / total_time;
798
784
info->pcpu = MIN(info->pcpu, 100);
786
if (procdata->config.solaris_mode)
787
info->pcpu /= procdata->config.num_cpus;
800
789
info->cpu_time_last = proctime.rtime;
801
790
info->nice = procuid.nice;
802
791
info->ppid = procuid.ppid;
882
// pid_list == ProcInfo::all + addition
885
if (procdata->config.show_tree) {
892
887
// insert process in the tree. walk through the addition list
893
888
// (new process + process that have a new parent). This loop
894
889
// handles the dependencies because we cannot insert a process
899
894
for (ProcList::iterator it(addition.begin()); it != addition.end(); ++it)
900
895
in_tree.erase((*it)->pid);
904
898
while (not addition.empty()) {
905
899
procman_debug("looking for %d parents", int(addition.size()));
906
900
ProcList::iterator it(addition.begin());
908
902
while (it != addition.end()) {
909
procman_debug("looking for %d's parent", int((*it)->pid));
903
procman_debug("looking for %d's parent with ppid %d",
904
int((*it)->pid), int((*it)->ppid));
907
// inserts the process in the treeview if :
909
// - its parent is already in tree
910
// - its parent is unreachable
912
// rounds == 2 means that addition contains processes with
913
// unreachable parents
915
// FIXME: this is broken if the unreachable parent becomes active
916
// i.e. it gets active or changes ower
917
// so we just clear the tree on __each__ update
918
// see proctable_update_list (ProcData * const procdata)
910
921
if ((*it)->ppid == 0 or in_tree.find((*it)->ppid) != in_tree.end()) {
911
922
insert_info_to_tree(*it, procdata);
912
923
in_tree.insert((*it)->pid);
913
924
it = addition.erase(it);
928
ProcInfo *parent = ProcInfo::find((*it)->ppid);
929
// if the parent is unreachable
931
// or std::find(addition.begin(), addition.end(), parent) == addition.end()) {
932
insert_info_to_tree(*it, procdata, true);
933
in_tree.insert((*it)->pid);
934
it = addition.erase(it);
922
g_assert(rounds <= 2);
943
// don't care of the tree
944
for (ProcList::iterator it(addition.begin()); it != addition.end(); ++it)
945
insert_info_to_tree(*it, procdata);
925
949
for (ProcInfo::Iterator it(ProcInfo::begin()); it != ProcInfo::end(); ++it)
926
950
update_info_mutable_cols(it->second);