@@ -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 ;
@@ -506,3 +546,36 @@ long Process_compare(const void* v1, const void* v2) {
506
546
return SPACESHIP_NUMBER (p1 -> pid , p2 -> pid );
507
547
}
508
548
}
549
+
550
+ void Process_mergeData (Process * p1 , const Process * p2 ) {
551
+ assert (p1 -> pl == p2 -> pl );
552
+
553
+ //TODO: handle thread (Process_isThread())
554
+
555
+ p1 -> percent_cpu += p2 -> percent_cpu ;
556
+ p1 -> percent_mem += p2 -> percent_mem ;
557
+ // keep COMM
558
+ p1 -> majflt += p2 -> majflt ;
559
+ p1 -> minflt += p2 -> minflt ;
560
+ p1 -> m_resident += p2 -> m_resident ;
561
+ p1 -> m_size += p2 -> m_size ;
562
+ // store min NICE
563
+ p1 -> nice = MINIMUM (p1 -> nice , p2 -> nice );
564
+ p1 -> nlwp += p2 -> nlwp ;
565
+ // keep PGRP
566
+ // keep PID
567
+ // keep PPID
568
+ p1 -> priority = MAXIMUM (p1 -> priority , p2 -> priority );
569
+ // keep PROCESSOR
570
+ // keep SESSION
571
+ p1 -> starttime_ctime = MINIMUM (p1 -> starttime_ctime , p2 -> starttime_ctime );
572
+ // keep STATE
573
+ // keep ST_UID
574
+ p1 -> time += p2 -> time ;
575
+ // keep TGID
576
+ // keep TPGID
577
+ // keep TTY_NR
578
+ // keep USER
579
+
580
+ p1 -> merged += p2 -> merged ;
581
+ }
0 commit comments