diff --git a/Process.c b/Process.c index 46082173..b1412d95 100644 --- a/Process.c +++ b/Process.c @@ -495,7 +495,6 @@ long Process_pidCompare(const void* v1, const void* v2) { long Process_compare(const void* v1, const void* v2) { const Process *p1, *p2; const Settings *settings = ((const Process*)v1)->settings; - int r; if (Settings_getActiveDirection(settings) == 1) { p1 = (const Process*)v1; @@ -507,7 +506,19 @@ long Process_compare(const void* v1, const void* v2) { ProcessField key = Settings_getActiveSortKey(settings); - switch (key) { + long result = Process_compareByKey(p1, p2, key); + + // Implement tie-breaker (needed to make tree mode more stable) + if (!result) + result = SPACESHIP_NUMBER(p1->pid, p2->pid); + + return result; +} + +long Process_compareByKey_Base(const Process* p1, const Process* p2, ProcessField key) { + int r; + + switch ((int) key) { case PERCENT_CPU: case PERCENT_NORM_CPU: return SPACESHIP_NUMBER(p2->percent_cpu, p1->percent_cpu); @@ -557,6 +568,6 @@ long Process_compare(const void* v1, const void* v2) { case USER: return SPACESHIP_NULLSTR(p1->user, p2->user); default: - return Process_compareByKey(p1, p2, key); + return SPACESHIP_NUMBER(p1->pid, p2->pid); } } diff --git a/Process.h b/Process.h index 9e800891..b58135ed 100644 --- a/Process.h +++ b/Process.h @@ -142,7 +142,7 @@ typedef struct ProcessClass_ { #define As_Process(this_) ((const ProcessClass*)((this_)->super.klass)) #define Process_getCommand(this_) (As_Process(this_)->getCommandStr ? As_Process(this_)->getCommandStr((const Process*)(this_)) : ((const Process*)(this_))->comm) -#define Process_compareByKey(p1_, p2_, key_) (As_Process(p1_)->compareByKey ? (As_Process(p1_)->compareByKey(p1_, p2_, key_)) : SPACESHIP_NUMBER(p1->pid, p2->pid)) +#define Process_compareByKey(p1_, p2_, key_) (As_Process(p1_)->compareByKey ? (As_Process(p1_)->compareByKey(p1_, p2_, key_)) : Process_compareByKey_Base(p1_, p2_, key_)) static inline pid_t Process_getParentPid(const Process* this) { return this->tgid == this->pid ? this->ppid : this->tgid; @@ -199,4 +199,6 @@ bool Process_sendSignal(Process* this, Arg sgn); long Process_pidCompare(const void* v1, const void* v2); +long Process_compareByKey_Base(const Process* p1, const Process* p2, ProcessField key); + #endif diff --git a/darwin/DarwinProcess.c b/darwin/DarwinProcess.c index 38e2a234..c463193b 100644 --- a/darwin/DarwinProcess.c +++ b/darwin/DarwinProcess.c @@ -92,7 +92,7 @@ static long DarwinProcess_compareByKey(const Process* v1, const Process* v2, Pro case TRANSLATED: return SPACESHIP_NUMBER(p1->translated, p2->translated); default: - return SPACESHIP_NUMBER(v1->pid, v2->pid); + return Process_compareByKey_Base(v1, v2, key); } } diff --git a/dragonflybsd/DragonFlyBSDProcess.c b/dragonflybsd/DragonFlyBSDProcess.c index 1f08530f..32ca12fd 100644 --- a/dragonflybsd/DragonFlyBSDProcess.c +++ b/dragonflybsd/DragonFlyBSDProcess.c @@ -120,7 +120,7 @@ long DragonFlyBSDProcess_compareByKey(const Process* v1, const Process* v2, Proc case JAIL: return SPACESHIP_NULLSTR(p1->jname, p2->jname); default: - return SPACESHIP_NULLSTR(v1->pid, v2->pid); + return Process_compareByKey_Base(v1, v2, key); } } diff --git a/freebsd/FreeBSDProcess.c b/freebsd/FreeBSDProcess.c index cebf6908..a7c079c0 100644 --- a/freebsd/FreeBSDProcess.c +++ b/freebsd/FreeBSDProcess.c @@ -121,7 +121,7 @@ static long FreeBSDProcess_compareByKey(const Process* v1, const Process* v2, Pr case TTY_NR: return SPACESHIP_NULLSTR(p1->ttyPath, p2->ttyPath); default: - return SPACESHIP_NUMBER(v1->pid, v2->pid); + return Process_compareByKey_Base(v1, v2, key); } } diff --git a/linux/LinuxProcess.c b/linux/LinuxProcess.c index 9e184b64..72955c8f 100644 --- a/linux/LinuxProcess.c +++ b/linux/LinuxProcess.c @@ -857,7 +857,7 @@ static long LinuxProcess_compareByKey(const Process* v1, const Process* v2, Proc case CWD: return SPACESHIP_NULLSTR(p1->cwd, p2->cwd); default: - return SPACESHIP_NUMBER(v1->pid, v2->pid); + return Process_compareByKey_Base(v1, v2, key); } } diff --git a/openbsd/OpenBSDProcess.c b/openbsd/OpenBSDProcess.c index 532093f1..9756f9bb 100644 --- a/openbsd/OpenBSDProcess.c +++ b/openbsd/OpenBSDProcess.c @@ -222,7 +222,7 @@ static long OpenBSDProcess_compareByKey(const Process* v1, const Process* v2, Pr switch ((int) key) { // add OpenBSD-specific fields here default: - return SPACESHIP_NUMBER(v1->pid, v2->pid); + return Process_compareByKey_Base(v1, v2, key); } } diff --git a/solaris/SolarisProcess.c b/solaris/SolarisProcess.c index e6c49936..f6470a3c 100644 --- a/solaris/SolarisProcess.c +++ b/solaris/SolarisProcess.c @@ -142,7 +142,7 @@ long SolarisProcess_compareByKey(const void* v1, const void* v2, ProcessField ke case LWPID: return SPACESHIP_NUMBER(p1->lwpid, p2->lwpid); default: - return SPACESHIP_NUMBER(v1->pid, v2->pid); + return Process_compareByKey_Base(v1, v2, key); } }