@@ -277,6 +277,11 @@ void Process_writeField(const Process* this, RichString* str, ProcessField field
277
277
baseattr = CRT_colors [PROCESS_THREAD_BASENAME ];
278
278
}
279
279
if (!this -> settings -> treeView || this -> indent == 0 ) {
280
+ if (this -> merged > 1 ) {
281
+ char merged [16 ];
282
+ xSnprintf (merged , sizeof (merged ), "[%u] " , this -> merged );
283
+ RichString_append (str , CRT_colors [PROCESS_SHADOW ], merged );
284
+ }
280
285
Process_writeCommand (this , attr , baseattr , str );
281
286
return ;
282
287
} else {
@@ -305,6 +310,11 @@ void Process_writeField(const Process* this, RichString* str, ProcessField field
305
310
const char * draw = CRT_treeStr [lastItem ? (this -> settings -> direction == 1 ? TREE_STR_BEND : TREE_STR_TEND ) : TREE_STR_RTEE ];
306
311
xSnprintf (buf , n , "%s%s " , draw , this -> showChildren ? CRT_treeStr [TREE_STR_SHUT ] : CRT_treeStr [TREE_STR_OPEN ] );
307
312
RichString_append (str , CRT_colors [PROCESS_TREE ], buffer );
313
+ if (this -> merged > 1 ) {
314
+ char merged [16 ];
315
+ xSnprintf (merged , sizeof (merged ), "[%u] " , this -> merged );
316
+ RichString_append (str , CRT_colors [PROCESS_SHADOW ], merged );
317
+ }
308
318
Process_writeCommand (this , attr , baseattr , str );
309
319
return ;
310
320
}
@@ -441,6 +451,36 @@ long Process_pidCompare(const void* v1, const void* v2) {
441
451
return (p1 -> pid - p2 -> pid );
442
452
}
443
453
454
+ static bool isTransitiveChildOf (const Process * child , const Process * parent ) {
455
+ assert (child -> pl == parent -> pl );
456
+
457
+ for (const Process * tChild = child ; tChild ; tChild = ProcessList_findProcess (parent -> pl , Process_getParentPid (tChild )))
458
+ if (Process_isChildOf (tChild , parent -> pid ))
459
+ return true;
460
+
461
+ return false;
462
+ }
463
+
464
+ int Process_sameApplication (const Process * v1 , const Process * v2 ) {
465
+ if (v1 -> session != v2 -> session )
466
+ return 0 ;
467
+
468
+ // we can compare pointers since the field user points to a hashtable entry
469
+ if (v1 -> user != v2 -> user )
470
+ return 0 ;
471
+
472
+ // TODO exe check
473
+
474
+
475
+ if (isTransitiveChildOf (v1 , v2 ))
476
+ return 2 ;
477
+
478
+ if (isTransitiveChildOf (v2 , v1 ))
479
+ return 1 ;
480
+
481
+ return 0 ;
482
+ }
483
+
444
484
long Process_compare (const void * v1 , const void * v2 ) {
445
485
const Process * p1 , * p2 ;
446
486
const Settings * settings = ((const Process * )v1 )-> settings ;
@@ -451,6 +491,7 @@ long Process_compare(const void* v1, const void* v2) {
451
491
p2 = (const Process * )v1 ;
452
492
p1 = (const Process * )v2 ;
453
493
}
494
+ assert (p1 -> pl == p2 -> pl );
454
495
switch (settings -> sortKey ) {
455
496
case PERCENT_CPU :
456
497
return (p2 -> percent_cpu > p1 -> percent_cpu ? 1 : -1 );
@@ -471,7 +512,7 @@ long Process_compare(const void* v1, const void* v2) {
471
512
case NLWP :
472
513
return (p1 -> nlwp - p2 -> nlwp );
473
514
case PGRP :
474
- return (p1 -> pgrp - p2 -> pgrp ) ;
515
+ return (long ) p1 -> pgrp - ( long ) p2 -> pgrp ;
475
516
case PID :
476
517
return (p1 -> pid - p2 -> pid );
477
518
case PPID :
@@ -481,7 +522,7 @@ long Process_compare(const void* v1, const void* v2) {
481
522
case PROCESSOR :
482
523
return (p1 -> processor - p2 -> processor );
483
524
case SESSION :
484
- return (p1 -> session - p2 -> session ) ;
525
+ return (long ) p1 -> session - ( long ) p2 -> session ;
485
526
case STARTTIME : {
486
527
if (p1 -> starttime_ctime == p2 -> starttime_ctime )
487
528
return (p1 -> pid - p2 -> pid );
@@ -506,3 +547,36 @@ long Process_compare(const void* v1, const void* v2) {
506
547
return (p1 -> pid - p2 -> pid );
507
548
}
508
549
}
550
+
551
+ void Process_mergeData (Process * p1 , const Process * p2 ) {
552
+ assert (p1 -> pl == p2 -> pl );
553
+
554
+ //TODO: handle thread (Process_isThread())
555
+
556
+ p1 -> percent_cpu += p2 -> percent_cpu ;
557
+ p1 -> percent_mem += p2 -> percent_mem ;
558
+ // keep COMM
559
+ p1 -> majflt += p2 -> majflt ;
560
+ p1 -> minflt += p2 -> minflt ;
561
+ p1 -> m_resident += p2 -> m_resident ;
562
+ p1 -> m_size += p2 -> m_size ;
563
+ // store min NICE
564
+ p1 -> nice = MINIMUM (p1 -> nice , p2 -> nice );
565
+ p1 -> nlwp += p2 -> nlwp ;
566
+ // keep PGRP
567
+ // keep PID
568
+ // keep PPID
569
+ p1 -> priority = MAXIMUM (p1 -> priority , p2 -> priority );
570
+ // keep PROCESSOR
571
+ // keep SESSION
572
+ p1 -> starttime_ctime = MINIMUM (p1 -> starttime_ctime , p2 -> starttime_ctime );
573
+ // keep STATE
574
+ // keep ST_UID
575
+ p1 -> time += p2 -> time ;
576
+ // keep TGID
577
+ // keep TPGID
578
+ // keep TTY_NR
579
+ // keep USER
580
+
581
+ p1 -> merged += p2 -> merged ;
582
+ }
0 commit comments