| Hisham Muhammad | d6231ba | 2006-03-04 18:16:49 +0000 | [diff] [blame] | 1 | /* |
| 2 | htop - Process.c |
| Hisham Muhammad | b1b3f57 | 2015-03-21 16:52:54 -0300 | [diff] [blame] | 3 | (C) 2004-2015 Hisham H. Muhammad |
| Nathan Scott | 500fb28 | 2020-08-20 09:35:24 +1000 | [diff] [blame] | 4 | (C) 2020 Red Hat, Inc. All Rights Reserved. |
| Daniel Lange | 079c2ab | 2020-10-05 09:51:32 +0200 | [diff] [blame] | 5 | Released under the GNU GPLv2, see the COPYING file |
| Hisham Muhammad | d6231ba | 2006-03-04 18:16:49 +0000 | [diff] [blame] | 6 | in the source distribution for its full text. |
| 7 | */ |
| 8 | |
| Benny Baumann | 0f52629 | 2020-09-19 13:55:23 +0200 | [diff] [blame] | 9 | #include "config.h" // IWYU pragma: keep |
| Hisham Muhammad | 272e2d9 | 2015-03-16 23:01:48 -0300 | [diff] [blame] | 10 | |
| Benny Baumann | 0f52629 | 2020-09-19 13:55:23 +0200 | [diff] [blame] | 11 | #include "Process.h" |
| 12 | |
| 13 | #include <assert.h> |
| 14 | #include <limits.h> |
| 15 | #include <math.h> |
| 16 | #include <signal.h> |
| 17 | #include <stdbool.h> |
| 18 | #include <stdio.h> |
| 19 | #include <stdlib.h> |
| Benny Baumann | 0f52629 | 2020-09-19 13:55:23 +0200 | [diff] [blame] | 20 | #include <time.h> |
| 21 | #include <unistd.h> |
| 22 | #include <sys/resource.h> |
| Explorer09 | 3512971 | 2018-12-30 12:18:27 +0800 | [diff] [blame] | 23 | |
| Hisham Muhammad | d6231ba | 2006-03-04 18:16:49 +0000 | [diff] [blame] | 24 | #include "CRT.h" |
| Christian Göttsche | 7cf5277 | 2020-11-18 14:26:30 +0100 | [diff] [blame] | 25 | #include "Macros.h" |
| Hisham Muhammad | b4f6b11 | 2014-11-27 20:10:23 -0200 | [diff] [blame] | 26 | #include "Platform.h" |
| Christian Göttsche | 7cf5277 | 2020-11-18 14:26:30 +0100 | [diff] [blame] | 27 | #include "ProcessList.h" |
| Benny Baumann | 0f52629 | 2020-09-19 13:55:23 +0200 | [diff] [blame] | 28 | #include "RichString.h" |
| 29 | #include "Settings.h" |
| Benny Baumann | 872e542 | 2020-10-14 20:21:09 +0200 | [diff] [blame] | 30 | #include "XUtils.h" |
| Hisham Muhammad | d6231ba | 2006-03-04 18:16:49 +0000 | [diff] [blame] | 31 | |
| Benny Baumann | 0f52629 | 2020-09-19 13:55:23 +0200 | [diff] [blame] | 32 | #if defined(MAJOR_IN_MKDEV) |
| Kang-Che Sung (宋岡哲) | c01f40e | 2018-02-26 21:15:05 +0800 | [diff] [blame] | 33 | #include <sys/mkdev.h> |
| Wataru Ashihara | 41754e5 | 2018-12-15 22:06:00 +0900 | [diff] [blame] | 34 | #elif defined(MAJOR_IN_SYSMACROS) |
| Kang-Che Sung (宋岡哲) | c01f40e | 2018-02-26 21:15:05 +0800 | [diff] [blame] | 35 | #include <sys/sysmacros.h> |
| 36 | #endif |
| Hisham Muhammad | d6231ba | 2006-03-04 18:16:49 +0000 | [diff] [blame] | 37 | |
| Benny Baumann | 0f52629 | 2020-09-19 13:55:23 +0200 | [diff] [blame] | 38 | |
| Christian Göttsche | 42073ba | 2020-11-04 17:46:04 +0100 | [diff] [blame] | 39 | static uid_t Process_getuid = (uid_t)-1; |
| Hisham Muhammad | eb2803c | 2006-07-12 01:35:59 +0000 | [diff] [blame] | 40 | |
| Christian Göttsche | 9f68c8d | 2020-12-15 19:44:52 +0100 | [diff] [blame] | 41 | int Process_pidDigits = 7; |
| Hisham Muhammad | 9428010 | 2015-08-20 00:32:47 -0300 | [diff] [blame] | 42 | |
| 43 | void Process_setupColumnWidths() { |
| 44 | int maxPid = Platform_getMaxPid(); |
| Benny Baumann | 4586951 | 2020-11-01 01:09:51 +0100 | [diff] [blame] | 45 | if (maxPid == -1) |
| 46 | return; |
| 47 | |
| Christian Göttsche | 9f68c8d | 2020-12-15 19:44:52 +0100 | [diff] [blame] | 48 | Process_pidDigits = ceil(log10(maxPid)); |
| 49 | assert(Process_pidDigits <= PROCESS_MAX_PID_DIGITS); |
| Hisham Muhammad | 9428010 | 2015-08-20 00:32:47 -0300 | [diff] [blame] | 50 | } |
| 51 | |
| Christian Göttsche | b41e4d9 | 2021-04-14 20:16:16 +0200 | [diff] [blame^] | 52 | void Process_printBytes(RichString* str, unsigned long long number, bool coloring) { |
| 53 | char buffer[16]; |
| Hisham Muhammad | d6231ba | 2006-03-04 18:16:49 +0000 | [diff] [blame] | 54 | int len; |
| Daniel Flanagan | dd33444 | 2019-10-31 11:39:12 -0500 | [diff] [blame] | 55 | |
| Christian Göttsche | fdaa15b | 2021-01-27 15:11:48 +0100 | [diff] [blame] | 56 | int largeNumberColor = coloring ? CRT_colors[LARGE_NUMBER] : CRT_colors[PROCESS]; |
| 57 | int processMegabytesColor = coloring ? CRT_colors[PROCESS_MEGABYTES] : CRT_colors[PROCESS]; |
| 58 | int processGigabytesColor = coloring ? CRT_colors[PROCESS_GIGABYTES] : CRT_colors[PROCESS]; |
| 59 | int shadowColor = coloring ? CRT_colors[PROCESS_SHADOW] : CRT_colors[PROCESS]; |
| Hisham Muhammad | a939cdf | 2014-04-24 15:00:09 -0300 | [diff] [blame] | 60 | int processColor = CRT_colors[PROCESS]; |
| Daniel Flanagan | dd33444 | 2019-10-31 11:39:12 -0500 | [diff] [blame] | 61 | |
| Christian Göttsche | fdaa15b | 2021-01-27 15:11:48 +0100 | [diff] [blame] | 62 | if (number == ULLONG_MAX) { |
| 63 | //Invalid number |
| 64 | RichString_appendAscii(str, shadowColor, " N/A "); |
| Christian Göttsche | b41e4d9 | 2021-04-14 20:16:16 +0200 | [diff] [blame^] | 65 | return; |
| 66 | } |
| 67 | |
| 68 | number /= ONE_K; |
| 69 | |
| 70 | if (number < 1000) { |
| Benny Baumann | 40441dc | 2020-09-13 23:50:24 +0200 | [diff] [blame] | 71 | //Plain number, no markings |
| Daniel Lange | 7899ae2 | 2020-11-28 17:57:51 +0100 | [diff] [blame] | 72 | len = xSnprintf(buffer, sizeof(buffer), "%5llu ", number); |
| Christian Göttsche | 157086e | 2020-12-04 14:44:57 +0100 | [diff] [blame] | 73 | RichString_appendnAscii(str, processColor, buffer, len); |
| Benny Baumann | 40441dc | 2020-09-13 23:50:24 +0200 | [diff] [blame] | 74 | } else if (number < 100000) { |
| 75 | //2 digit MB, 3 digit KB |
| Daniel Lange | 7899ae2 | 2020-11-28 17:57:51 +0100 | [diff] [blame] | 76 | len = xSnprintf(buffer, sizeof(buffer), "%2llu", number/1000); |
| Christian Göttsche | 157086e | 2020-12-04 14:44:57 +0100 | [diff] [blame] | 77 | RichString_appendnAscii(str, processMegabytesColor, buffer, len); |
| Hisham Muhammad | d6231ba | 2006-03-04 18:16:49 +0000 | [diff] [blame] | 78 | number %= 1000; |
| Daniel Lange | 7899ae2 | 2020-11-28 17:57:51 +0100 | [diff] [blame] | 79 | len = xSnprintf(buffer, sizeof(buffer), "%03llu ", number); |
| Christian Göttsche | 157086e | 2020-12-04 14:44:57 +0100 | [diff] [blame] | 80 | RichString_appendnAscii(str, processColor, buffer, len); |
| Benny Baumann | 40441dc | 2020-09-13 23:50:24 +0200 | [diff] [blame] | 81 | } else if (number < 1000 * ONE_K) { |
| 82 | //3 digit MB |
| 83 | number /= ONE_K; |
| Daniel Lange | 7899ae2 | 2020-11-28 17:57:51 +0100 | [diff] [blame] | 84 | len = xSnprintf(buffer, sizeof(buffer), "%4lluM ", number); |
| Christian Göttsche | 157086e | 2020-12-04 14:44:57 +0100 | [diff] [blame] | 85 | RichString_appendnAscii(str, processMegabytesColor, buffer, len); |
| Benny Baumann | 40441dc | 2020-09-13 23:50:24 +0200 | [diff] [blame] | 86 | } else if (number < 10000 * ONE_K) { |
| 87 | //1 digit GB, 3 digit MB |
| 88 | number /= ONE_K; |
| Daniel Lange | 7899ae2 | 2020-11-28 17:57:51 +0100 | [diff] [blame] | 89 | len = xSnprintf(buffer, sizeof(buffer), "%1llu", number/1000); |
| Christian Göttsche | 157086e | 2020-12-04 14:44:57 +0100 | [diff] [blame] | 90 | RichString_appendnAscii(str, processGigabytesColor, buffer, len); |
| Benny Baumann | 40441dc | 2020-09-13 23:50:24 +0200 | [diff] [blame] | 91 | number %= 1000; |
| Daniel Lange | 7899ae2 | 2020-11-28 17:57:51 +0100 | [diff] [blame] | 92 | len = xSnprintf(buffer, sizeof(buffer), "%03lluM ", number); |
| Christian Göttsche | 157086e | 2020-12-04 14:44:57 +0100 | [diff] [blame] | 93 | RichString_appendnAscii(str, processMegabytesColor, buffer, len); |
| Benny Baumann | e0e5997 | 2020-09-20 19:54:53 +0200 | [diff] [blame] | 94 | } else if (number < 100000 * ONE_K) { |
| Benny Baumann | 40441dc | 2020-09-13 23:50:24 +0200 | [diff] [blame] | 95 | //2 digit GB, 1 digit MB |
| 96 | number /= 100 * ONE_K; |
| Daniel Lange | 7899ae2 | 2020-11-28 17:57:51 +0100 | [diff] [blame] | 97 | len = xSnprintf(buffer, sizeof(buffer), "%2llu", number/10); |
| Christian Göttsche | 157086e | 2020-12-04 14:44:57 +0100 | [diff] [blame] | 98 | RichString_appendnAscii(str, processGigabytesColor, buffer, len); |
| Benny Baumann | 40441dc | 2020-09-13 23:50:24 +0200 | [diff] [blame] | 99 | number %= 10; |
| Christian Göttsche | cd305b4 | 2020-11-29 14:14:46 +0100 | [diff] [blame] | 100 | len = xSnprintf(buffer, sizeof(buffer), ".%1llu", number); |
| Christian Göttsche | 157086e | 2020-12-04 14:44:57 +0100 | [diff] [blame] | 101 | RichString_appendnAscii(str, processMegabytesColor, buffer, len); |
| 102 | RichString_appendAscii(str, processGigabytesColor, "G "); |
| Benny Baumann | 40441dc | 2020-09-13 23:50:24 +0200 | [diff] [blame] | 103 | } else if (number < 1000 * ONE_M) { |
| 104 | //3 digit GB |
| 105 | number /= ONE_M; |
| Daniel Lange | 7899ae2 | 2020-11-28 17:57:51 +0100 | [diff] [blame] | 106 | len = xSnprintf(buffer, sizeof(buffer), "%4lluG ", number); |
| Christian Göttsche | 157086e | 2020-12-04 14:44:57 +0100 | [diff] [blame] | 107 | RichString_appendnAscii(str, processGigabytesColor, buffer, len); |
| Michael Witten | ab3171d | 2020-09-29 14:04:22 +0000 | [diff] [blame] | 108 | } else if (number < 10000ULL * ONE_M) { |
| Benny Baumann | 40441dc | 2020-09-13 23:50:24 +0200 | [diff] [blame] | 109 | //1 digit TB, 3 digit GB |
| 110 | number /= ONE_M; |
| Daniel Lange | 7899ae2 | 2020-11-28 17:57:51 +0100 | [diff] [blame] | 111 | len = xSnprintf(buffer, sizeof(buffer), "%1llu", number/1000); |
| Christian Göttsche | 157086e | 2020-12-04 14:44:57 +0100 | [diff] [blame] | 112 | RichString_appendnAscii(str, largeNumberColor, buffer, len); |
| Benny Baumann | 40441dc | 2020-09-13 23:50:24 +0200 | [diff] [blame] | 113 | number %= 1000; |
| Daniel Lange | 7899ae2 | 2020-11-28 17:57:51 +0100 | [diff] [blame] | 114 | len = xSnprintf(buffer, sizeof(buffer), "%03lluG ", number); |
| Christian Göttsche | 157086e | 2020-12-04 14:44:57 +0100 | [diff] [blame] | 115 | RichString_appendnAscii(str, processGigabytesColor, buffer, len); |
| Christian Göttsche | b41e4d9 | 2021-04-14 20:16:16 +0200 | [diff] [blame^] | 116 | } else if (number < 100000 * ONE_M) { |
| 117 | //2 digit TB, 1 digit GB |
| 118 | number /= 100 * ONE_M; |
| 119 | len = xSnprintf(buffer, sizeof(buffer), "%2llu", number/10); |
| 120 | RichString_appendnAscii(str, largeNumberColor, buffer, len); |
| 121 | number %= 10; |
| 122 | len = xSnprintf(buffer, sizeof(buffer), ".%1llu", number); |
| 123 | RichString_appendnAscii(str, processGigabytesColor, buffer, len); |
| 124 | RichString_appendAscii(str, largeNumberColor, "T "); |
| 125 | } else if (number < 10000ULL * ONE_G) { |
| 126 | //3 digit TB or 1 digit PB, 3 digit TB |
| 127 | number /= ONE_G; |
| 128 | len = xSnprintf(buffer, sizeof(buffer), "%4lluT ", number); |
| 129 | RichString_appendnAscii(str, largeNumberColor, buffer, len); |
| Benny Baumann | 40441dc | 2020-09-13 23:50:24 +0200 | [diff] [blame] | 130 | } else { |
| Christian Göttsche | b41e4d9 | 2021-04-14 20:16:16 +0200 | [diff] [blame^] | 131 | //2 digit PB and above |
| 132 | len = xSnprintf(buffer, sizeof(buffer), "%4.1lfP ", (double)number/ONE_T); |
| Christian Göttsche | 157086e | 2020-12-04 14:44:57 +0100 | [diff] [blame] | 133 | RichString_appendnAscii(str, largeNumberColor, buffer, len); |
| Hisham Muhammad | d6231ba | 2006-03-04 18:16:49 +0000 | [diff] [blame] | 134 | } |
| 135 | } |
| 136 | |
| Christian Göttsche | b41e4d9 | 2021-04-14 20:16:16 +0200 | [diff] [blame^] | 137 | void Process_printKBytes(RichString* str, unsigned long long number, bool coloring) { |
| 138 | if (number == ULLONG_MAX) |
| 139 | Process_printBytes(str, ULLONG_MAX, coloring); |
| 140 | else |
| 141 | Process_printBytes(str, number * ONE_K, coloring); |
| 142 | } |
| 143 | |
| 144 | void Process_printCount(RichString* str, unsigned long long number, bool coloring) { |
| Daniel Lange | 7899ae2 | 2020-11-28 17:57:51 +0100 | [diff] [blame] | 145 | char buffer[13]; |
| Hisham Muhammad | a939cdf | 2014-04-24 15:00:09 -0300 | [diff] [blame] | 146 | |
| Christian Göttsche | fee744a | 2021-01-27 15:11:46 +0100 | [diff] [blame] | 147 | int largeNumberColor = coloring ? CRT_colors[LARGE_NUMBER] : CRT_colors[PROCESS]; |
| 148 | int processMegabytesColor = coloring ? CRT_colors[PROCESS_MEGABYTES] : CRT_colors[PROCESS]; |
| Hisham Muhammad | a939cdf | 2014-04-24 15:00:09 -0300 | [diff] [blame] | 149 | int processColor = CRT_colors[PROCESS]; |
| Christian Göttsche | fee744a | 2021-01-27 15:11:46 +0100 | [diff] [blame] | 150 | int processShadowColor = coloring ? CRT_colors[PROCESS_SHADOW] : CRT_colors[PROCESS]; |
| Hisham Muhammad | a939cdf | 2014-04-24 15:00:09 -0300 | [diff] [blame] | 151 | |
| Michael Witten | ab3171d | 2020-09-29 14:04:22 +0000 | [diff] [blame] | 152 | if (number == ULLONG_MAX) { |
| Christian Göttsche | 157086e | 2020-12-04 14:44:57 +0100 | [diff] [blame] | 153 | RichString_appendAscii(str, CRT_colors[PROCESS_SHADOW], " N/A "); |
| adrien1018 | 536941f | 2018-12-30 20:18:35 +0800 | [diff] [blame] | 154 | } else if (number >= 100000LL * ONE_DECIMAL_T) { |
| Benny Baumann | 0b29e50 | 2020-11-28 17:42:02 +0100 | [diff] [blame] | 155 | xSnprintf(buffer, sizeof(buffer), "%11llu ", number / ONE_DECIMAL_G); |
| Christian Göttsche | 157086e | 2020-12-04 14:44:57 +0100 | [diff] [blame] | 156 | RichString_appendnAscii(str, largeNumberColor, buffer, 12); |
| adrien1018 | 536941f | 2018-12-30 20:18:35 +0800 | [diff] [blame] | 157 | } else if (number >= 100LL * ONE_DECIMAL_T) { |
| Benny Baumann | 0b29e50 | 2020-11-28 17:42:02 +0100 | [diff] [blame] | 158 | xSnprintf(buffer, sizeof(buffer), "%11llu ", number / ONE_DECIMAL_M); |
| Christian Göttsche | 157086e | 2020-12-04 14:44:57 +0100 | [diff] [blame] | 159 | RichString_appendnAscii(str, largeNumberColor, buffer, 8); |
| 160 | RichString_appendnAscii(str, processMegabytesColor, buffer+8, 4); |
| adrien1018 | 536941f | 2018-12-30 20:18:35 +0800 | [diff] [blame] | 161 | } else if (number >= 10LL * ONE_DECIMAL_G) { |
| Benny Baumann | 0b29e50 | 2020-11-28 17:42:02 +0100 | [diff] [blame] | 162 | xSnprintf(buffer, sizeof(buffer), "%11llu ", number / ONE_DECIMAL_K); |
| Christian Göttsche | 157086e | 2020-12-04 14:44:57 +0100 | [diff] [blame] | 163 | RichString_appendnAscii(str, largeNumberColor, buffer, 5); |
| 164 | RichString_appendnAscii(str, processMegabytesColor, buffer+5, 3); |
| 165 | RichString_appendnAscii(str, processColor, buffer+8, 4); |
| Hisham Muhammad | 9b35140 | 2011-05-26 16:31:18 +0000 | [diff] [blame] | 166 | } else { |
| Benny Baumann | 0b29e50 | 2020-11-28 17:42:02 +0100 | [diff] [blame] | 167 | xSnprintf(buffer, sizeof(buffer), "%11llu ", number); |
| Christian Göttsche | 157086e | 2020-12-04 14:44:57 +0100 | [diff] [blame] | 168 | RichString_appendnAscii(str, largeNumberColor, buffer, 2); |
| 169 | RichString_appendnAscii(str, processMegabytesColor, buffer+2, 3); |
| 170 | RichString_appendnAscii(str, processColor, buffer+5, 3); |
| 171 | RichString_appendnAscii(str, processShadowColor, buffer+8, 4); |
| Hisham Muhammad | 9b35140 | 2011-05-26 16:31:18 +0000 | [diff] [blame] | 172 | } |
| 173 | } |
| 174 | |
| Christian Göttsche | b41e4d9 | 2021-04-14 20:16:16 +0200 | [diff] [blame^] | 175 | void Process_printTime(RichString* str, unsigned long long totalHundredths, bool coloring) { |
| 176 | char buffer[10]; |
| 177 | int len; |
| Hisham Muhammad | d6231ba | 2006-03-04 18:16:49 +0000 | [diff] [blame] | 178 | |
| Christian Göttsche | b41e4d9 | 2021-04-14 20:16:16 +0200 | [diff] [blame^] | 179 | unsigned long long totalSeconds = totalHundredths / 100; |
| Hisham Muhammad | 272e2d9 | 2015-03-16 23:01:48 -0300 | [diff] [blame] | 180 | unsigned long long hours = totalSeconds / 3600; |
| David Zarzycki | f3d9eca | 2021-04-10 08:02:59 -0400 | [diff] [blame] | 181 | unsigned long long days = totalSeconds / 86400; |
| Hisham Muhammad | 272e2d9 | 2015-03-16 23:01:48 -0300 | [diff] [blame] | 182 | int minutes = (totalSeconds / 60) % 60; |
| 183 | int seconds = totalSeconds % 60; |
| 184 | int hundredths = totalHundredths - (totalSeconds * 100); |
| Christian Göttsche | b41e4d9 | 2021-04-14 20:16:16 +0200 | [diff] [blame^] | 185 | |
| 186 | int yearColor = coloring ? CRT_colors[LARGE_NUMBER] : CRT_colors[PROCESS]; |
| 187 | int dayColor = coloring ? CRT_colors[PROCESS_GIGABYTES] : CRT_colors[PROCESS]; |
| 188 | int hourColor = coloring ? CRT_colors[PROCESS_MEGABYTES] : CRT_colors[PROCESS]; |
| 189 | int defColor = CRT_colors[PROCESS]; |
| 190 | |
| 191 | if (days >= /* Ignore leapyears */365) { |
| 192 | int years = days / 365; |
| 193 | int daysLeft = days - 365 * years; |
| 194 | |
| 195 | if (daysLeft >= 100) { |
| 196 | len = xSnprintf(buffer, sizeof(buffer), "%3dy", years); |
| 197 | RichString_appendnAscii(str, yearColor, buffer, len); |
| 198 | len = xSnprintf(buffer, sizeof(buffer), "%3dd ", daysLeft); |
| 199 | RichString_appendnAscii(str, dayColor, buffer, len); |
| 200 | } else if (daysLeft >= 10) { |
| 201 | len = xSnprintf(buffer, sizeof(buffer), "%4dy", years); |
| 202 | RichString_appendnAscii(str, yearColor, buffer, len); |
| 203 | len = xSnprintf(buffer, sizeof(buffer), "%2dd ", daysLeft); |
| 204 | RichString_appendnAscii(str, dayColor, buffer, len); |
| Hisham Muhammad | 9c44f58 | 2011-12-14 23:29:07 +0000 | [diff] [blame] | 205 | } else { |
| Christian Göttsche | b41e4d9 | 2021-04-14 20:16:16 +0200 | [diff] [blame^] | 206 | len = xSnprintf(buffer, sizeof(buffer), "%5dy", years); |
| 207 | RichString_appendnAscii(str, yearColor, buffer, len); |
| 208 | len = xSnprintf(buffer, sizeof(buffer), "%1dd ", daysLeft); |
| 209 | RichString_appendnAscii(str, dayColor, buffer, len); |
| Hisham Muhammad | 9c44f58 | 2011-12-14 23:29:07 +0000 | [diff] [blame] | 210 | } |
| Christian Göttsche | b41e4d9 | 2021-04-14 20:16:16 +0200 | [diff] [blame^] | 211 | } else if (days >= 100) { |
| 212 | int hoursLeft = hours - days * 24; |
| 213 | |
| 214 | if (hoursLeft >= 10) { |
| 215 | len = xSnprintf(buffer, sizeof(buffer), "%4llud", days); |
| 216 | RichString_appendnAscii(str, dayColor, buffer, len); |
| 217 | len = xSnprintf(buffer, sizeof(buffer), "%2dh ", hoursLeft); |
| 218 | RichString_appendnAscii(str, hourColor, buffer, len); |
| 219 | } else { |
| 220 | len = xSnprintf(buffer, sizeof(buffer), "%5llud", days); |
| 221 | RichString_appendnAscii(str, dayColor, buffer, len); |
| 222 | len = xSnprintf(buffer, sizeof(buffer), "%1dh ", hoursLeft); |
| 223 | RichString_appendnAscii(str, hourColor, buffer, len); |
| 224 | } |
| 225 | } else if (hours >= 100) { |
| 226 | int minutesLeft = totalSeconds / 60 - hours * 60; |
| 227 | |
| 228 | if (minutesLeft >= 10) { |
| 229 | len = xSnprintf(buffer, sizeof(buffer), "%4lluh", hours); |
| 230 | RichString_appendnAscii(str, hourColor, buffer, len); |
| 231 | len = xSnprintf(buffer, sizeof(buffer), "%2dm ", minutesLeft); |
| 232 | RichString_appendnAscii(str, defColor, buffer, len); |
| 233 | } else { |
| 234 | len = xSnprintf(buffer, sizeof(buffer), "%5lluh", hours); |
| 235 | RichString_appendnAscii(str, hourColor, buffer, len); |
| 236 | len = xSnprintf(buffer, sizeof(buffer), "%1dm ", minutesLeft); |
| 237 | RichString_appendnAscii(str, defColor, buffer, len); |
| 238 | } |
| 239 | } else if (hours > 0) { |
| 240 | len = xSnprintf(buffer, sizeof(buffer), "%2lluh", hours); |
| 241 | RichString_appendnAscii(str, hourColor, buffer, len); |
| 242 | len = xSnprintf(buffer, sizeof(buffer), "%02d:%02d ", minutes, seconds); |
| 243 | RichString_appendnAscii(str, defColor, buffer, len); |
| 244 | } else { |
| 245 | len = xSnprintf(buffer, sizeof(buffer), "%2d:%02d.%02d ", minutes, seconds, hundredths); |
| 246 | RichString_appendnAscii(str, defColor, buffer, len); |
| Hisham Muhammad | d6231ba | 2006-03-04 18:16:49 +0000 | [diff] [blame] | 247 | } |
| Hisham Muhammad | d6231ba | 2006-03-04 18:16:49 +0000 | [diff] [blame] | 248 | } |
| 249 | |
| Christian Göttsche | a63cfc8 | 2020-10-13 14:26:40 +0200 | [diff] [blame] | 250 | void Process_fillStarttimeBuffer(Process* this) { |
| 251 | struct tm date; |
| 252 | (void) localtime_r(&this->starttime_ctime, &date); |
| 253 | strftime(this->starttime_show, sizeof(this->starttime_show) - 1, (this->starttime_ctime > (time(NULL) - 86400)) ? "%R " : "%b%d ", &date); |
| 254 | } |
| 255 | |
| Christian Göttsche | 79ad39c | 2020-10-06 12:28:11 +0200 | [diff] [blame] | 256 | static inline void Process_writeCommand(const Process* this, int attr, int baseattr, RichString* str) { |
| Christian Göttsche | 3bb731c | 2021-01-10 11:14:02 +0100 | [diff] [blame] | 257 | int start = RichString_size(str); |
| 258 | int len = 0; |
| Christian Göttsche | 79ad39c | 2020-10-06 12:28:11 +0200 | [diff] [blame] | 259 | const char* comm = this->comm; |
| Tobias Geerinckx-Rice | 293eec4 | 2015-07-29 21:14:29 +0200 | [diff] [blame] | 260 | |
| 261 | if (this->settings->highlightBaseName || !this->settings->showProgramPath) { |
| Christian Göttsche | e103ec0 | 2021-01-05 23:47:20 +0100 | [diff] [blame] | 262 | int basename = 0; |
| 263 | for (int i = 0; i < this->basenameOffset; i++) { |
| Tobias Geerinckx-Rice | 293eec4 | 2015-07-29 21:14:29 +0200 | [diff] [blame] | 264 | if (comm[i] == '/') { |
| 265 | basename = i + 1; |
| 266 | } else if (comm[i] == ':') { |
| Christian Göttsche | 3bb731c | 2021-01-10 11:14:02 +0100 | [diff] [blame] | 267 | len = i + 1; |
| Tobias Geerinckx-Rice | 293eec4 | 2015-07-29 21:14:29 +0200 | [diff] [blame] | 268 | break; |
| Hisham Muhammad | f2a190b | 2014-02-27 17:11:23 -0300 | [diff] [blame] | 269 | } |
| Hisham Muhammad | d6231ba | 2006-03-04 18:16:49 +0000 | [diff] [blame] | 270 | } |
| Christian Göttsche | 3bb731c | 2021-01-10 11:14:02 +0100 | [diff] [blame] | 271 | if (len == 0) { |
| Benny Baumann | 4586951 | 2020-11-01 01:09:51 +0100 | [diff] [blame] | 272 | if (this->settings->showProgramPath) { |
| Tobias Geerinckx-Rice | 293eec4 | 2015-07-29 21:14:29 +0200 | [diff] [blame] | 273 | start += basename; |
| Benny Baumann | 4586951 | 2020-11-01 01:09:51 +0100 | [diff] [blame] | 274 | } else { |
| Tobias Geerinckx-Rice | 293eec4 | 2015-07-29 21:14:29 +0200 | [diff] [blame] | 275 | comm += basename; |
| Benny Baumann | 4586951 | 2020-11-01 01:09:51 +0100 | [diff] [blame] | 276 | } |
| Christian Göttsche | 3bb731c | 2021-01-10 11:14:02 +0100 | [diff] [blame] | 277 | len = this->basenameOffset - basename; |
| Tobias Geerinckx-Rice | 293eec4 | 2015-07-29 21:14:29 +0200 | [diff] [blame] | 278 | } |
| Hisham Muhammad | d6231ba | 2006-03-04 18:16:49 +0000 | [diff] [blame] | 279 | } |
| Tobias Geerinckx-Rice | 293eec4 | 2015-07-29 21:14:29 +0200 | [diff] [blame] | 280 | |
| Christian Göttsche | 157086e | 2020-12-04 14:44:57 +0100 | [diff] [blame] | 281 | RichString_appendWide(str, attr, comm); |
| Tobias Geerinckx-Rice | 293eec4 | 2015-07-29 21:14:29 +0200 | [diff] [blame] | 282 | |
| Benny Baumann | 4586951 | 2020-11-01 01:09:51 +0100 | [diff] [blame] | 283 | if (this->settings->highlightBaseName) { |
| Christian Göttsche | 3bb731c | 2021-01-10 11:14:02 +0100 | [diff] [blame] | 284 | RichString_setAttrn(str, baseattr, start, len); |
| Benny Baumann | 4586951 | 2020-11-01 01:09:51 +0100 | [diff] [blame] | 285 | } |
| Hisham Muhammad | d6231ba | 2006-03-04 18:16:49 +0000 | [diff] [blame] | 286 | } |
| 287 | |
| Christian Göttsche | b41e4d9 | 2021-04-14 20:16:16 +0200 | [diff] [blame^] | 288 | void Process_printRate(RichString* str, double rate, bool coloring) { |
| 289 | char buffer[16]; |
| 290 | |
| Hisham Muhammad | 3383d8e | 2015-01-21 23:27:31 -0200 | [diff] [blame] | 291 | int largeNumberColor = CRT_colors[LARGE_NUMBER]; |
| 292 | int processMegabytesColor = CRT_colors[PROCESS_MEGABYTES]; |
| 293 | int processColor = CRT_colors[PROCESS]; |
| Christian Göttsche | b41e4d9 | 2021-04-14 20:16:16 +0200 | [diff] [blame^] | 294 | int shadowColor = CRT_colors[PROCESS_SHADOW]; |
| Benny Baumann | 0b29e50 | 2020-11-28 17:42:02 +0100 | [diff] [blame] | 295 | |
| Hisham Muhammad | 3383d8e | 2015-01-21 23:27:31 -0200 | [diff] [blame] | 296 | if (!coloring) { |
| 297 | largeNumberColor = CRT_colors[PROCESS]; |
| 298 | processMegabytesColor = CRT_colors[PROCESS]; |
| Hisham Muhammad | 2338ad5 | 2008-03-14 18:50:49 +0000 | [diff] [blame] | 299 | } |
| Benny Baumann | 0b29e50 | 2020-11-28 17:42:02 +0100 | [diff] [blame] | 300 | |
| Benny Baumann | 29ec115 | 2020-09-07 11:53:58 +0200 | [diff] [blame] | 301 | if (isnan(rate)) { |
| Christian Göttsche | b41e4d9 | 2021-04-14 20:16:16 +0200 | [diff] [blame^] | 302 | RichString_appendAscii(str, shadowColor, " N/A "); |
| 303 | } else if (rate < 0.005) { |
| 304 | int len = snprintf(buffer, sizeof(buffer), "%7.2f B/s ", rate); |
| 305 | RichString_appendnAscii(str, shadowColor, buffer, len); |
| Hisham | 797bcd0 | 2016-02-20 02:22:57 -0200 | [diff] [blame] | 306 | } else if (rate < ONE_K) { |
| Christian Göttsche | b41e4d9 | 2021-04-14 20:16:16 +0200 | [diff] [blame^] | 307 | int len = snprintf(buffer, sizeof(buffer), "%7.2f B/s ", rate); |
| Christian Göttsche | 157086e | 2020-12-04 14:44:57 +0100 | [diff] [blame] | 308 | RichString_appendnAscii(str, processColor, buffer, len); |
| adrien1018 | 536941f | 2018-12-30 20:18:35 +0800 | [diff] [blame] | 309 | } else if (rate < ONE_M) { |
| Christian Göttsche | b41e4d9 | 2021-04-14 20:16:16 +0200 | [diff] [blame^] | 310 | int len = snprintf(buffer, sizeof(buffer), "%7.2f K/s ", rate / ONE_K); |
| Christian Göttsche | 157086e | 2020-12-04 14:44:57 +0100 | [diff] [blame] | 311 | RichString_appendnAscii(str, processColor, buffer, len); |
| adrien1018 | 536941f | 2018-12-30 20:18:35 +0800 | [diff] [blame] | 312 | } else if (rate < ONE_G) { |
| Christian Göttsche | b41e4d9 | 2021-04-14 20:16:16 +0200 | [diff] [blame^] | 313 | int len = snprintf(buffer, sizeof(buffer), "%7.2f M/s ", rate / ONE_M); |
| Christian Göttsche | 157086e | 2020-12-04 14:44:57 +0100 | [diff] [blame] | 314 | RichString_appendnAscii(str, processMegabytesColor, buffer, len); |
| adrien1018 | 536941f | 2018-12-30 20:18:35 +0800 | [diff] [blame] | 315 | } else if (rate < ONE_T) { |
| Christian Göttsche | b41e4d9 | 2021-04-14 20:16:16 +0200 | [diff] [blame^] | 316 | int len = snprintf(buffer, sizeof(buffer), "%7.2f G/s ", rate / ONE_G); |
| 317 | RichString_appendnAscii(str, largeNumberColor, buffer, len); |
| 318 | } else if (rate < ONE_P) { |
| 319 | int len = snprintf(buffer, sizeof(buffer), "%7.2f T/s ", rate / ONE_T); |
| Christian Göttsche | 157086e | 2020-12-04 14:44:57 +0100 | [diff] [blame] | 320 | RichString_appendnAscii(str, largeNumberColor, buffer, len); |
| Hisham Muhammad | 3383d8e | 2015-01-21 23:27:31 -0200 | [diff] [blame] | 321 | } else { |
| Christian Göttsche | b41e4d9 | 2021-04-14 20:16:16 +0200 | [diff] [blame^] | 322 | int len = snprintf(buffer, sizeof(buffer), "%7.2f P/s ", rate / ONE_P); |
| Christian Göttsche | 157086e | 2020-12-04 14:44:57 +0100 | [diff] [blame] | 323 | RichString_appendnAscii(str, largeNumberColor, buffer, len); |
| Hisham Muhammad | 3383d8e | 2015-01-21 23:27:31 -0200 | [diff] [blame] | 324 | } |
| Hisham Muhammad | 2338ad5 | 2008-03-14 18:50:49 +0000 | [diff] [blame] | 325 | } |
| 326 | |
| Christian Göttsche | a5db139 | 2021-01-10 15:57:46 +0100 | [diff] [blame] | 327 | void Process_printLeftAlignedField(RichString* str, int attr, const char* content, unsigned int width) { |
| Christian Göttsche | 08ac22d | 2021-01-14 09:59:11 +0100 | [diff] [blame] | 328 | int columns = width; |
| 329 | RichString_appendnWideColumns(str, attr, content, strlen(content), &columns); |
| 330 | RichString_appendChr(str, attr, ' ', width + 1 - columns); |
| Christian Göttsche | a5db139 | 2021-01-10 15:57:46 +0100 | [diff] [blame] | 331 | } |
| 332 | |
| Christian Göttsche | 79ad39c | 2020-10-06 12:28:11 +0200 | [diff] [blame] | 333 | void Process_writeField(const Process* this, RichString* str, ProcessField field) { |
| Christian Göttsche | fee744a | 2021-01-27 15:11:46 +0100 | [diff] [blame] | 334 | char buffer[256]; |
| 335 | size_t n = sizeof(buffer); |
| Hisham Muhammad | d6231ba | 2006-03-04 18:16:49 +0000 | [diff] [blame] | 336 | int attr = CRT_colors[DEFAULT_COLOR]; |
| Hisham Muhammad | 3383d8e | 2015-01-21 23:27:31 -0200 | [diff] [blame] | 337 | bool coloring = this->settings->highlightMegabytes; |
| Hisham Muhammad | d6231ba | 2006-03-04 18:16:49 +0000 | [diff] [blame] | 338 | |
| 339 | switch (field) { |
| Hisham Muhammad | d6231ba | 2006-03-04 18:16:49 +0000 | [diff] [blame] | 340 | case COMM: { |
| Christian Göttsche | fee744a | 2021-01-27 15:11:46 +0100 | [diff] [blame] | 341 | int baseattr = CRT_colors[PROCESS_BASENAME]; |
| Hisham Muhammad | 3383d8e | 2015-01-21 23:27:31 -0200 | [diff] [blame] | 342 | if (this->settings->highlightThreads && Process_isThread(this)) { |
| Hisham Muhammad | 93f091c | 2008-03-08 23:39:48 +0000 | [diff] [blame] | 343 | attr = CRT_colors[PROCESS_THREAD]; |
| 344 | baseattr = CRT_colors[PROCESS_THREAD_BASENAME]; |
| 345 | } |
| Hisham Muhammad | 3383d8e | 2015-01-21 23:27:31 -0200 | [diff] [blame] | 346 | if (!this->settings->treeView || this->indent == 0) { |
| Hisham Muhammad | 93f091c | 2008-03-08 23:39:48 +0000 | [diff] [blame] | 347 | Process_writeCommand(this, attr, baseattr, str); |
| Hisham Muhammad | d6231ba | 2006-03-04 18:16:49 +0000 | [diff] [blame] | 348 | return; |
| Hisham Muhammad | d6231ba | 2006-03-04 18:16:49 +0000 | [diff] [blame] | 349 | } |
| Christian Göttsche | fee744a | 2021-01-27 15:11:46 +0100 | [diff] [blame] | 350 | |
| 351 | char* buf = buffer; |
| 352 | int maxIndent = 0; |
| 353 | bool lastItem = (this->indent < 0); |
| 354 | int indent = (this->indent < 0 ? -this->indent : this->indent); |
| 355 | |
| 356 | for (int i = 0; i < 32; i++) { |
| 357 | if (indent & (1U << i)) { |
| 358 | maxIndent = i+1; |
| 359 | } |
| 360 | } |
| 361 | |
| 362 | for (int i = 0; i < maxIndent - 1; i++) { |
| 363 | int written, ret; |
| 364 | if (indent & (1 << i)) { |
| 365 | ret = xSnprintf(buf, n, "%s ", CRT_treeStr[TREE_STR_VERT]); |
| 366 | } else { |
| 367 | ret = xSnprintf(buf, n, " "); |
| 368 | } |
| 369 | if (ret < 0 || (size_t)ret >= n) { |
| 370 | written = n; |
| 371 | } else { |
| 372 | written = ret; |
| 373 | } |
| 374 | buf += written; |
| 375 | n -= written; |
| 376 | } |
| 377 | |
| 378 | const char* draw = CRT_treeStr[lastItem ? TREE_STR_BEND : TREE_STR_RTEE]; |
| 379 | xSnprintf(buf, n, "%s%s ", draw, this->showChildren ? CRT_treeStr[TREE_STR_SHUT] : CRT_treeStr[TREE_STR_OPEN] ); |
| 380 | RichString_appendWide(str, CRT_colors[PROCESS_TREE], buffer); |
| 381 | Process_writeCommand(this, attr, baseattr, str); |
| 382 | return; |
| Hisham Muhammad | d6231ba | 2006-03-04 18:16:49 +0000 | [diff] [blame] | 383 | } |
| Christian Göttsche | b41e4d9 | 2021-04-14 20:16:16 +0200 | [diff] [blame^] | 384 | case MAJFLT: Process_printCount(str, this->majflt, coloring); return; |
| 385 | case MINFLT: Process_printCount(str, this->minflt, coloring); return; |
| 386 | case M_RESIDENT: Process_printKBytes(str, this->m_resident, coloring); return; |
| 387 | case M_VIRT: Process_printKBytes(str, this->m_virt, coloring); return; |
| Christian Göttsche | fee744a | 2021-01-27 15:11:46 +0100 | [diff] [blame] | 388 | case NICE: |
| Hisham Muhammad | 09e241f | 2017-07-27 16:07:50 -0300 | [diff] [blame] | 389 | xSnprintf(buffer, n, "%3ld ", this->nice); |
| Hisham Muhammad | be1700c | 2015-03-16 01:43:04 -0300 | [diff] [blame] | 390 | attr = this->nice < 0 ? CRT_colors[PROCESS_HIGH_PRIORITY] |
| 391 | : this->nice > 0 ? CRT_colors[PROCESS_LOW_PRIORITY] |
| Christian Göttsche | fee744a | 2021-01-27 15:11:46 +0100 | [diff] [blame] | 392 | : CRT_colors[PROCESS_SHADOW]; |
| 393 | break; |
| 394 | case NLWP: |
| 395 | if (this->nlwp == 1) |
| 396 | attr = CRT_colors[PROCESS_SHADOW]; |
| 397 | |
| 398 | xSnprintf(buffer, n, "%4ld ", this->nlwp); |
| 399 | break; |
| 400 | case PERCENT_CPU: |
| 401 | case PERCENT_NORM_CPU: { |
| 402 | float cpuPercentage = this->percent_cpu; |
| 403 | if (field == PERCENT_NORM_CPU) { |
| 404 | cpuPercentage /= this->processList->cpuCount; |
| 405 | } |
| Christian Göttsche | 979aca9 | 2021-03-02 21:59:56 +0100 | [diff] [blame] | 406 | if (cpuPercentage > 999.9F) { |
| Christian Göttsche | fee744a | 2021-01-27 15:11:46 +0100 | [diff] [blame] | 407 | xSnprintf(buffer, n, "%4u ", (unsigned int)cpuPercentage); |
| Christian Göttsche | 979aca9 | 2021-03-02 21:59:56 +0100 | [diff] [blame] | 408 | } else if (cpuPercentage > 99.9F) { |
| Christian Göttsche | fee744a | 2021-01-27 15:11:46 +0100 | [diff] [blame] | 409 | xSnprintf(buffer, n, "%3u. ", (unsigned int)cpuPercentage); |
| 410 | } else { |
| Christian Göttsche | 979aca9 | 2021-03-02 21:59:56 +0100 | [diff] [blame] | 411 | if (cpuPercentage < 0.05F) |
| Christian Göttsche | fee744a | 2021-01-27 15:11:46 +0100 | [diff] [blame] | 412 | attr = CRT_colors[PROCESS_SHADOW]; |
| 413 | |
| 414 | xSnprintf(buffer, n, "%4.1f ", cpuPercentage); |
| 415 | } |
| Hisham Muhammad | be1700c | 2015-03-16 01:43:04 -0300 | [diff] [blame] | 416 | break; |
| 417 | } |
| Christian Göttsche | fee744a | 2021-01-27 15:11:46 +0100 | [diff] [blame] | 418 | case PERCENT_MEM: |
| Christian Göttsche | 979aca9 | 2021-03-02 21:59:56 +0100 | [diff] [blame] | 419 | if (this->percent_mem > 99.9F) { |
| Christian Göttsche | fee744a | 2021-01-27 15:11:46 +0100 | [diff] [blame] | 420 | xSnprintf(buffer, n, "100. "); |
| 421 | } else { |
| Christian Göttsche | 979aca9 | 2021-03-02 21:59:56 +0100 | [diff] [blame] | 422 | if (this->percent_mem < 0.05F) |
| Christian Göttsche | fee744a | 2021-01-27 15:11:46 +0100 | [diff] [blame] | 423 | attr = CRT_colors[PROCESS_SHADOW]; |
| 424 | |
| 425 | xSnprintf(buffer, n, "%4.1f ", this->percent_mem); |
| 426 | } |
| 427 | break; |
| Christian Göttsche | 9f68c8d | 2020-12-15 19:44:52 +0100 | [diff] [blame] | 428 | case PGRP: xSnprintf(buffer, n, "%*d ", Process_pidDigits, this->pgrp); break; |
| 429 | case PID: xSnprintf(buffer, n, "%*d ", Process_pidDigits, this->pid); break; |
| 430 | case PPID: xSnprintf(buffer, n, "%*d ", Process_pidDigits, this->ppid); break; |
| Christian Göttsche | fee744a | 2021-01-27 15:11:46 +0100 | [diff] [blame] | 431 | case PRIORITY: |
| 432 | if (this->priority <= -100) |
| Hisham Muhammad | 09e241f | 2017-07-27 16:07:50 -0300 | [diff] [blame] | 433 | xSnprintf(buffer, n, " RT "); |
| Hisham Muhammad | be1700c | 2015-03-16 01:43:04 -0300 | [diff] [blame] | 434 | else |
| Hisham Muhammad | 09e241f | 2017-07-27 16:07:50 -0300 | [diff] [blame] | 435 | xSnprintf(buffer, n, "%3ld ", this->priority); |
| Hisham Muhammad | be1700c | 2015-03-16 01:43:04 -0300 | [diff] [blame] | 436 | break; |
| Hisham Muhammad | 09e241f | 2017-07-27 16:07:50 -0300 | [diff] [blame] | 437 | case PROCESSOR: xSnprintf(buffer, n, "%3d ", Settings_cpuId(this->settings, this->processor)); break; |
| Christian Göttsche | 9f68c8d | 2020-12-15 19:44:52 +0100 | [diff] [blame] | 438 | case SESSION: xSnprintf(buffer, n, "%*d ", Process_pidDigits, this->session); break; |
| Hisham Muhammad | 09e241f | 2017-07-27 16:07:50 -0300 | [diff] [blame] | 439 | case STARTTIME: xSnprintf(buffer, n, "%s", this->starttime_show); break; |
| Christian Göttsche | fee744a | 2021-01-27 15:11:46 +0100 | [diff] [blame] | 440 | case STATE: |
| Hisham Muhammad | 09e241f | 2017-07-27 16:07:50 -0300 | [diff] [blame] | 441 | xSnprintf(buffer, n, "%c ", this->state); |
| Christian Göttsche | fee744a | 2021-01-27 15:11:46 +0100 | [diff] [blame] | 442 | switch (this->state) { |
| 443 | case 'R': |
| 444 | attr = CRT_colors[PROCESS_R_STATE]; |
| 445 | break; |
| 446 | case 'D': |
| 447 | attr = CRT_colors[PROCESS_D_STATE]; |
| 448 | break; |
| 449 | case 'I': |
| 450 | case 'S': |
| 451 | attr = CRT_colors[PROCESS_SHADOW]; |
| 452 | break; |
| Valmiky Arquissandas | 64e0d94 | 2014-10-14 02:30:17 +0100 | [diff] [blame] | 453 | } |
| Hisham Muhammad | d6231ba | 2006-03-04 18:16:49 +0000 | [diff] [blame] | 454 | break; |
| Daniel Lange | c34be41 | 2018-10-07 11:16:12 +0200 | [diff] [blame] | 455 | case ST_UID: xSnprintf(buffer, n, "%5d ", this->st_uid); break; |
| Christian Göttsche | b41e4d9 | 2021-04-14 20:16:16 +0200 | [diff] [blame^] | 456 | case TIME: Process_printTime(str, this->time, coloring); return; |
| Christian Göttsche | fee744a | 2021-01-27 15:11:46 +0100 | [diff] [blame] | 457 | case TGID: |
| 458 | if (this->tgid == this->pid) |
| 459 | attr = CRT_colors[PROCESS_SHADOW]; |
| 460 | |
| 461 | xSnprintf(buffer, n, "%*d ", Process_pidDigits, this->tgid); |
| 462 | break; |
| Christian Göttsche | 9f68c8d | 2020-12-15 19:44:52 +0100 | [diff] [blame] | 463 | case TPGID: xSnprintf(buffer, n, "%*d ", Process_pidDigits, this->tpgid); break; |
| Christian Göttsche | 9a82215 | 2021-03-21 19:40:56 +0100 | [diff] [blame] | 464 | case TTY: |
| 465 | if (!this->tty_name) { |
| Christian Göttsche | a3c8285 | 2021-01-27 15:11:42 +0100 | [diff] [blame] | 466 | attr = CRT_colors[PROCESS_SHADOW]; |
| Christian Göttsche | 9a82215 | 2021-03-21 19:40:56 +0100 | [diff] [blame] | 467 | xSnprintf(buffer, n, "(no tty) "); |
| Christian Göttsche | a3c8285 | 2021-01-27 15:11:42 +0100 | [diff] [blame] | 468 | } else { |
| Christian Göttsche | 9a82215 | 2021-03-21 19:40:56 +0100 | [diff] [blame] | 469 | const char* name = String_startsWith(this->tty_name, "/dev/") ? (this->tty_name + strlen("/dev/")) : this->tty_name; |
| 470 | xSnprintf(buffer, n, "%-8s ", name); |
| Christian Göttsche | a3c8285 | 2021-01-27 15:11:42 +0100 | [diff] [blame] | 471 | } |
| 472 | break; |
| Christian Göttsche | fee744a | 2021-01-27 15:11:46 +0100 | [diff] [blame] | 473 | case USER: |
| Christian Göttsche | 42073ba | 2020-11-04 17:46:04 +0100 | [diff] [blame] | 474 | if (Process_getuid != this->st_uid) |
| Hisham Muhammad | d6231ba | 2006-03-04 18:16:49 +0000 | [diff] [blame] | 475 | attr = CRT_colors[PROCESS_SHADOW]; |
| Christian Göttsche | 5359eae | 2020-12-23 12:21:29 +0100 | [diff] [blame] | 476 | |
| Hisham Muhammad | eb2803c | 2006-07-12 01:35:59 +0000 | [diff] [blame] | 477 | if (this->user) { |
| Christian Göttsche | a5db139 | 2021-01-10 15:57:46 +0100 | [diff] [blame] | 478 | Process_printLeftAlignedField(str, attr, this->user, 9); |
| Christian Göttsche | 5359eae | 2020-12-23 12:21:29 +0100 | [diff] [blame] | 479 | return; |
| Hisham Muhammad | eb2803c | 2006-07-12 01:35:59 +0000 | [diff] [blame] | 480 | } |
| Christian Göttsche | 5359eae | 2020-12-23 12:21:29 +0100 | [diff] [blame] | 481 | |
| 482 | xSnprintf(buffer, n, "%-9d ", this->st_uid); |
| Hisham Muhammad | d6231ba | 2006-03-04 18:16:49 +0000 | [diff] [blame] | 483 | break; |
| Hisham Muhammad | d6231ba | 2006-03-04 18:16:49 +0000 | [diff] [blame] | 484 | default: |
| Christian Göttsche | 615fc93 | 2021-04-18 15:52:28 +0200 | [diff] [blame] | 485 | assert(0 && "Process_writeField: default key reached"); /* should never be reached */ |
| Hisham Muhammad | 09e241f | 2017-07-27 16:07:50 -0300 | [diff] [blame] | 486 | xSnprintf(buffer, n, "- "); |
| Hisham Muhammad | d6231ba | 2006-03-04 18:16:49 +0000 | [diff] [blame] | 487 | } |
| Christian Göttsche | a2be57d | 2021-04-14 20:54:38 +0200 | [diff] [blame] | 488 | RichString_appendAscii(str, attr, buffer); |
| Hisham Muhammad | d6231ba | 2006-03-04 18:16:49 +0000 | [diff] [blame] | 489 | } |
| 490 | |
| Christian Göttsche | 79ad39c | 2020-10-06 12:28:11 +0200 | [diff] [blame] | 491 | void Process_display(const Object* cast, RichString* out) { |
| 492 | const Process* this = (const Process*) cast; |
| 493 | const ProcessField* fields = this->settings->fields; |
| Hisham Muhammad | da23c8c | 2008-03-09 08:58:38 +0000 | [diff] [blame] | 494 | for (int i = 0; fields[i]; i++) |
| Hisham Muhammad | 4c24a9b | 2015-03-31 23:23:10 -0300 | [diff] [blame] | 495 | As_Process(this)->writeField(this, out, fields[i]); |
| Benny Baumann | 4586951 | 2020-11-01 01:09:51 +0100 | [diff] [blame] | 496 | |
| Christian Göttsche | 42073ba | 2020-11-04 17:46:04 +0100 | [diff] [blame] | 497 | if (this->settings->shadowOtherUsers && this->st_uid != Process_getuid) { |
| Hisham Muhammad | da23c8c | 2008-03-09 08:58:38 +0000 | [diff] [blame] | 498 | RichString_setAttr(out, CRT_colors[PROCESS_SHADOW]); |
| Benny Baumann | 4586951 | 2020-11-01 01:09:51 +0100 | [diff] [blame] | 499 | } |
| 500 | |
| 501 | if (this->tag == true) { |
| Hisham Muhammad | da23c8c | 2008-03-09 08:58:38 +0000 | [diff] [blame] | 502 | RichString_setAttr(out, CRT_colors[PROCESS_TAG]); |
| Benny Baumann | 4586951 | 2020-11-01 01:09:51 +0100 | [diff] [blame] | 503 | } |
| 504 | |
| Daniel Lange | 0951090 | 2020-11-16 12:13:47 +0100 | [diff] [blame] | 505 | if (this->settings->highlightChanges) { |
| 506 | if (Process_isTomb(this)) { |
| 507 | out->highlightAttr = CRT_colors[PROCESS_TOMB]; |
| 508 | } else if (Process_isNew(this)) { |
| 509 | out->highlightAttr = CRT_colors[PROCESS_NEW]; |
| 510 | } |
| 511 | } |
| 512 | |
| Christian Göttsche | 3f99c2d | 2021-03-12 16:46:04 +0100 | [diff] [blame] | 513 | assert(RichString_size(out) > 0); |
| Hisham Muhammad | da23c8c | 2008-03-09 08:58:38 +0000 | [diff] [blame] | 514 | } |
| 515 | |
| Hisham Muhammad | 6f868b0 | 2015-02-20 14:52:10 -0200 | [diff] [blame] | 516 | void Process_done(Process* this) { |
| Hisham Muhammad | da23c8c | 2008-03-09 08:58:38 +0000 | [diff] [blame] | 517 | assert (this != NULL); |
| Hisham Muhammad | f54a37b | 2014-05-03 17:49:05 -0300 | [diff] [blame] | 518 | free(this->comm); |
| Christian Göttsche | 9a82215 | 2021-03-21 19:40:56 +0100 | [diff] [blame] | 519 | free(this->tty_name); |
| Hisham Muhammad | da23c8c | 2008-03-09 08:58:38 +0000 | [diff] [blame] | 520 | } |
| 521 | |
| Narendran Gopalakrishnan | 09fe94d | 2020-10-17 16:24:45 +0530 | [diff] [blame] | 522 | static const char* Process_getCommandStr(const Process* p) { |
| 523 | return p->comm ? p->comm : ""; |
| 524 | } |
| 525 | |
| Christian Göttsche | ba282cf | 2020-10-05 13:19:50 +0200 | [diff] [blame] | 526 | const ProcessClass Process_class = { |
| Hisham Muhammad | 4c24a9b | 2015-03-31 23:23:10 -0300 | [diff] [blame] | 527 | .super = { |
| 528 | .extends = Class(Object), |
| 529 | .display = Process_display, |
| 530 | .delete = Process_delete, |
| 531 | .compare = Process_compare |
| 532 | }, |
| 533 | .writeField = Process_writeField, |
| Narendran Gopalakrishnan | 09fe94d | 2020-10-17 16:24:45 +0530 | [diff] [blame] | 534 | .getCommandStr = Process_getCommandStr, |
| Hisham Muhammad | 00b324b | 2012-12-05 15:12:20 +0000 | [diff] [blame] | 535 | }; |
| 536 | |
| Christian Göttsche | 3035e29 | 2021-01-26 18:41:04 +0100 | [diff] [blame] | 537 | void Process_init(Process* this, const Settings* settings) { |
| Hisham Muhammad | 3383d8e | 2015-01-21 23:27:31 -0200 | [diff] [blame] | 538 | this->settings = settings; |
| Hisham Muhammad | da23c8c | 2008-03-09 08:58:38 +0000 | [diff] [blame] | 539 | this->tag = false; |
| Hisham Muhammad | 9eb9121 | 2010-06-17 19:02:03 +0000 | [diff] [blame] | 540 | this->showChildren = true; |
| Hisham Muhammad | d8e1480 | 2010-11-22 12:40:20 +0000 | [diff] [blame] | 541 | this->show = true; |
| Hisham Muhammad | da23c8c | 2008-03-09 08:58:38 +0000 | [diff] [blame] | 542 | this->updated = false; |
| Hisham Muhammad | cb297af | 2014-04-09 17:43:54 -0300 | [diff] [blame] | 543 | this->basenameOffset = -1; |
| Benny Baumann | 4586951 | 2020-11-01 01:09:51 +0100 | [diff] [blame] | 544 | |
| Christian Göttsche | 42073ba | 2020-11-04 17:46:04 +0100 | [diff] [blame] | 545 | if (Process_getuid == (uid_t)-1) { |
| Benny Baumann | 4586951 | 2020-11-01 01:09:51 +0100 | [diff] [blame] | 546 | Process_getuid = getuid(); |
| 547 | } |
| Hisham Muhammad | da23c8c | 2008-03-09 08:58:38 +0000 | [diff] [blame] | 548 | } |
| 549 | |
| Hisham Muhammad | da23c8c | 2008-03-09 08:58:38 +0000 | [diff] [blame] | 550 | void Process_toggleTag(Process* this) { |
| Christian Göttsche | 2d231d7 | 2020-12-08 22:37:15 +0100 | [diff] [blame] | 551 | this->tag = !this->tag; |
| Hisham Muhammad | da23c8c | 2008-03-09 08:58:38 +0000 | [diff] [blame] | 552 | } |
| 553 | |
| Adam Saponara | dde71c6 | 2020-10-30 21:56:16 -0400 | [diff] [blame] | 554 | bool Process_isNew(const Process* this) { |
| Adam Saponara | a83f515 | 2020-10-31 20:36:53 -0400 | [diff] [blame] | 555 | assert(this->processList); |
| Nathan Scott | 356488a | 2021-03-30 15:55:48 +1100 | [diff] [blame] | 556 | if (this->processList->monotonicMs >= this->seenStampMs) { |
| 557 | return this->processList->monotonicMs - this->seenStampMs <= 1000 * (uint64_t)this->processList->settings->highlightDelaySecs; |
| Daniel Lange | 0951090 | 2020-11-16 12:13:47 +0100 | [diff] [blame] | 558 | } |
| Adam Saponara | dde71c6 | 2020-10-30 21:56:16 -0400 | [diff] [blame] | 559 | return false; |
| 560 | } |
| 561 | |
| 562 | bool Process_isTomb(const Process* this) { |
| Nathan Scott | 356488a | 2021-03-30 15:55:48 +1100 | [diff] [blame] | 563 | return this->tombStampMs > 0; |
| Adam Saponara | dde71c6 | 2020-10-30 21:56:16 -0400 | [diff] [blame] | 564 | } |
| 565 | |
| Hisham Muhammad | da23c8c | 2008-03-09 08:58:38 +0000 | [diff] [blame] | 566 | bool Process_setPriority(Process* this, int priority) { |
| Christian Göttsche | 36880cd | 2021-01-21 20:27:37 +0100 | [diff] [blame] | 567 | if (Settings_isReadonly()) |
| 568 | return false; |
| 569 | |
| Michael Klein | ab3a7c2 | 2015-12-07 20:10:09 +0100 | [diff] [blame] | 570 | int old_prio = getpriority(PRIO_PROCESS, this->pid); |
| 571 | int err = setpriority(PRIO_PROCESS, this->pid, priority); |
| Benny Baumann | 82157f5 | 2021-02-16 19:44:59 +0100 | [diff] [blame] | 572 | |
| Michael Klein | ab3a7c2 | 2015-12-07 20:10:09 +0100 | [diff] [blame] | 573 | if (err == 0 && old_prio != getpriority(PRIO_PROCESS, this->pid)) { |
| 574 | this->nice = priority; |
| Hisham Muhammad | da23c8c | 2008-03-09 08:58:38 +0000 | [diff] [blame] | 575 | } |
| Michael Klein | ab3a7c2 | 2015-12-07 20:10:09 +0100 | [diff] [blame] | 576 | return (err == 0); |
| Hisham Muhammad | da23c8c | 2008-03-09 08:58:38 +0000 | [diff] [blame] | 577 | } |
| 578 | |
| Nathan Scott | 500fb28 | 2020-08-20 09:35:24 +1000 | [diff] [blame] | 579 | bool Process_changePriorityBy(Process* this, Arg delta) { |
| 580 | return Process_setPriority(this, this->nice + delta.i); |
| Hisham Muhammad | 47e881f | 2012-10-04 23:59:45 +0000 | [diff] [blame] | 581 | } |
| 582 | |
| Nathan Scott | 500fb28 | 2020-08-20 09:35:24 +1000 | [diff] [blame] | 583 | bool Process_sendSignal(Process* this, Arg sgn) { |
| Benny Baumann | 82157f5 | 2021-02-16 19:44:59 +0100 | [diff] [blame] | 584 | return kill(this->pid, sgn.i) == 0; |
| Hisham Muhammad | da23c8c | 2008-03-09 08:58:38 +0000 | [diff] [blame] | 585 | } |
| 586 | |
| Christian Göttsche | 90ea3ac | 2020-12-23 13:02:32 +0100 | [diff] [blame] | 587 | int Process_pidCompare(const void* v1, const void* v2) { |
| Christian Göttsche | 18b1e9f | 2020-09-23 14:15:51 +0200 | [diff] [blame] | 588 | const Process* p1 = (const Process*)v1; |
| 589 | const Process* p2 = (const Process*)v2; |
| Christian Göttsche | 2d231d7 | 2020-12-08 22:37:15 +0100 | [diff] [blame] | 590 | |
| 591 | return SPACESHIP_NUMBER(p1->pid, p2->pid); |
| Hisham Muhammad | 5d48ab8 | 2006-07-11 06:13:32 +0000 | [diff] [blame] | 592 | } |
| 593 | |
| Christian Göttsche | 90ea3ac | 2020-12-23 13:02:32 +0100 | [diff] [blame] | 594 | int Process_compare(const void* v1, const void* v2) { |
| Daniel Lange | 074703b | 2021-01-21 20:57:34 +0100 | [diff] [blame] | 595 | const Process *p1 = (const Process*)v1; |
| 596 | const Process *p2 = (const Process*)v2; |
| Christian Göttsche | 397b5c4 | 2020-11-04 17:46:24 +0100 | [diff] [blame] | 597 | |
| Daniel Lange | 074703b | 2021-01-21 20:57:34 +0100 | [diff] [blame] | 598 | const Settings *settings = p1->settings; |
| Christian Göttsche | 397b5c4 | 2020-11-04 17:46:24 +0100 | [diff] [blame] | 599 | |
| Hisham Muhammad | 2327260 | 2020-12-18 11:03:31 -0300 | [diff] [blame] | 600 | ProcessField key = Settings_getActiveSortKey(settings); |
| Hisham Muhammad | e8c6994 | 2020-12-17 19:08:56 -0300 | [diff] [blame] | 601 | |
| Christian Göttsche | 90ea3ac | 2020-12-23 13:02:32 +0100 | [diff] [blame] | 602 | int result = Process_compareByKey(p1, p2, key); |
| Benny Baumann | 77db240 | 2020-12-18 22:12:26 +0100 | [diff] [blame] | 603 | |
| 604 | // Implement tie-breaker (needed to make tree mode more stable) |
| 605 | if (!result) |
| Daniel Lange | 074703b | 2021-01-21 20:57:34 +0100 | [diff] [blame] | 606 | return SPACESHIP_NUMBER(p1->pid, p2->pid); |
| Benny Baumann | 77db240 | 2020-12-18 22:12:26 +0100 | [diff] [blame] | 607 | |
| Christian Göttsche | bea7f8e | 2021-03-12 16:44:46 +0100 | [diff] [blame] | 608 | return (Settings_getActiveDirection(settings) == 1) ? result : -result; |
| Benny Baumann | 77db240 | 2020-12-18 22:12:26 +0100 | [diff] [blame] | 609 | } |
| 610 | |
| Christian Göttsche | d5de1bc | 2021-01-27 15:11:44 +0100 | [diff] [blame] | 611 | static uint8_t stateCompareValue(char state) { |
| 612 | switch (state) { |
| 613 | |
| 614 | case 'S': |
| 615 | return 10; |
| 616 | |
| 617 | case 'I': |
| 618 | return 9; |
| 619 | |
| 620 | case 'X': |
| 621 | return 8; |
| 622 | |
| 623 | case 'Z': |
| 624 | return 7; |
| 625 | |
| 626 | case 't': |
| 627 | return 6; |
| 628 | |
| 629 | case 'T': |
| 630 | return 5; |
| 631 | |
| 632 | case 'L': |
| 633 | return 4; |
| 634 | |
| 635 | case 'D': |
| 636 | return 3; |
| 637 | |
| 638 | case 'R': |
| 639 | return 2; |
| 640 | |
| 641 | case '?': |
| 642 | return 1; |
| 643 | |
| 644 | default: |
| 645 | return 0; |
| 646 | } |
| 647 | } |
| 648 | |
| Christian Göttsche | 90ea3ac | 2020-12-23 13:02:32 +0100 | [diff] [blame] | 649 | int Process_compareByKey_Base(const Process* p1, const Process* p2, ProcessField key) { |
| Benny Baumann | 77db240 | 2020-12-18 22:12:26 +0100 | [diff] [blame] | 650 | int r; |
| 651 | |
| Christian Göttsche | 89473cc | 2020-12-15 19:44:48 +0100 | [diff] [blame] | 652 | switch (key) { |
| Hisham Muhammad | 5d48ab8 | 2006-07-11 06:13:32 +0000 | [diff] [blame] | 653 | case PERCENT_CPU: |
| Christian Göttsche | 15eab20 | 2020-10-30 17:02:20 +0100 | [diff] [blame] | 654 | case PERCENT_NORM_CPU: |
| Daniel Lange | 4531b31 | 2021-01-21 14:27:23 +0100 | [diff] [blame] | 655 | return SPACESHIP_NUMBER(p1->percent_cpu, p2->percent_cpu); |
| Hisham Muhammad | 5d48ab8 | 2006-07-11 06:13:32 +0000 | [diff] [blame] | 656 | case PERCENT_MEM: |
| Daniel Lange | 4531b31 | 2021-01-21 14:27:23 +0100 | [diff] [blame] | 657 | return SPACESHIP_NUMBER(p1->m_resident, p2->m_resident); |
| Hisham Muhammad | 5d48ab8 | 2006-07-11 06:13:32 +0000 | [diff] [blame] | 658 | case COMM: |
| Narendran Gopalakrishnan | 09fe94d | 2020-10-17 16:24:45 +0530 | [diff] [blame] | 659 | return SPACESHIP_NULLSTR(Process_getCommand(p1), Process_getCommand(p2)); |
| Hisham Muhammad | be1700c | 2015-03-16 01:43:04 -0300 | [diff] [blame] | 660 | case MAJFLT: |
| Daniel Lange | 4531b31 | 2021-01-21 14:27:23 +0100 | [diff] [blame] | 661 | return SPACESHIP_NUMBER(p1->majflt, p2->majflt); |
| Hisham Muhammad | be1700c | 2015-03-16 01:43:04 -0300 | [diff] [blame] | 662 | case MINFLT: |
| Daniel Lange | 4531b31 | 2021-01-21 14:27:23 +0100 | [diff] [blame] | 663 | return SPACESHIP_NUMBER(p1->minflt, p2->minflt); |
| Hisham Muhammad | be1700c | 2015-03-16 01:43:04 -0300 | [diff] [blame] | 664 | case M_RESIDENT: |
| Daniel Lange | 4531b31 | 2021-01-21 14:27:23 +0100 | [diff] [blame] | 665 | return SPACESHIP_NUMBER(p1->m_resident, p2->m_resident); |
| Christian Göttsche | fa002c0 | 2020-11-20 17:09:34 +0100 | [diff] [blame] | 666 | case M_VIRT: |
| Daniel Lange | 4531b31 | 2021-01-21 14:27:23 +0100 | [diff] [blame] | 667 | return SPACESHIP_NUMBER(p1->m_virt, p2->m_virt); |
| Hisham Muhammad | be1700c | 2015-03-16 01:43:04 -0300 | [diff] [blame] | 668 | case NICE: |
| Christian Göttsche | 397b5c4 | 2020-11-04 17:46:24 +0100 | [diff] [blame] | 669 | return SPACESHIP_NUMBER(p1->nice, p2->nice); |
| Hisham Muhammad | d357c67 | 2007-05-21 19:10:53 +0000 | [diff] [blame] | 670 | case NLWP: |
| Christian Göttsche | 397b5c4 | 2020-11-04 17:46:24 +0100 | [diff] [blame] | 671 | return SPACESHIP_NUMBER(p1->nlwp, p2->nlwp); |
| Hisham Muhammad | be1700c | 2015-03-16 01:43:04 -0300 | [diff] [blame] | 672 | case PGRP: |
| Christian Göttsche | 397b5c4 | 2020-11-04 17:46:24 +0100 | [diff] [blame] | 673 | return SPACESHIP_NUMBER(p1->pgrp, p2->pgrp); |
| Hisham Muhammad | be1700c | 2015-03-16 01:43:04 -0300 | [diff] [blame] | 674 | case PID: |
| Christian Göttsche | 397b5c4 | 2020-11-04 17:46:24 +0100 | [diff] [blame] | 675 | return SPACESHIP_NUMBER(p1->pid, p2->pid); |
| Hisham Muhammad | be1700c | 2015-03-16 01:43:04 -0300 | [diff] [blame] | 676 | case PPID: |
| Christian Göttsche | 397b5c4 | 2020-11-04 17:46:24 +0100 | [diff] [blame] | 677 | return SPACESHIP_NUMBER(p1->ppid, p2->ppid); |
| Hisham Muhammad | be1700c | 2015-03-16 01:43:04 -0300 | [diff] [blame] | 678 | case PRIORITY: |
| Christian Göttsche | 397b5c4 | 2020-11-04 17:46:24 +0100 | [diff] [blame] | 679 | return SPACESHIP_NUMBER(p1->priority, p2->priority); |
| Hisham Muhammad | 272e2d9 | 2015-03-16 23:01:48 -0300 | [diff] [blame] | 680 | case PROCESSOR: |
| Christian Göttsche | 397b5c4 | 2020-11-04 17:46:24 +0100 | [diff] [blame] | 681 | return SPACESHIP_NUMBER(p1->processor, p2->processor); |
| Hisham Muhammad | be1700c | 2015-03-16 01:43:04 -0300 | [diff] [blame] | 682 | case SESSION: |
| Christian Göttsche | 397b5c4 | 2020-11-04 17:46:24 +0100 | [diff] [blame] | 683 | return SPACESHIP_NUMBER(p1->session, p2->session); |
| 684 | case STARTTIME: |
| 685 | r = SPACESHIP_NUMBER(p1->starttime_ctime, p2->starttime_ctime); |
| 686 | return r != 0 ? r : SPACESHIP_NUMBER(p1->pid, p2->pid); |
| Hisham Muhammad | be1700c | 2015-03-16 01:43:04 -0300 | [diff] [blame] | 687 | case STATE: |
| Christian Göttsche | d5de1bc | 2021-01-27 15:11:44 +0100 | [diff] [blame] | 688 | return SPACESHIP_NUMBER(stateCompareValue(p1->state), stateCompareValue(p2->state)); |
| Hisham Muhammad | be1700c | 2015-03-16 01:43:04 -0300 | [diff] [blame] | 689 | case ST_UID: |
| Christian Göttsche | 397b5c4 | 2020-11-04 17:46:24 +0100 | [diff] [blame] | 690 | return SPACESHIP_NUMBER(p1->st_uid, p2->st_uid); |
| Hisham Muhammad | be1700c | 2015-03-16 01:43:04 -0300 | [diff] [blame] | 691 | case TIME: |
| Daniel Lange | 4531b31 | 2021-01-21 14:27:23 +0100 | [diff] [blame] | 692 | return SPACESHIP_NUMBER(p1->time, p2->time); |
| Hisham Muhammad | be1700c | 2015-03-16 01:43:04 -0300 | [diff] [blame] | 693 | case TGID: |
| Christian Göttsche | 397b5c4 | 2020-11-04 17:46:24 +0100 | [diff] [blame] | 694 | return SPACESHIP_NUMBER(p1->tgid, p2->tgid); |
| Hisham Muhammad | be1700c | 2015-03-16 01:43:04 -0300 | [diff] [blame] | 695 | case TPGID: |
| Christian Göttsche | 397b5c4 | 2020-11-04 17:46:24 +0100 | [diff] [blame] | 696 | return SPACESHIP_NUMBER(p1->tpgid, p2->tpgid); |
| Christian Göttsche | 9a82215 | 2021-03-21 19:40:56 +0100 | [diff] [blame] | 697 | case TTY: |
| 698 | /* Order no tty last */ |
| 699 | return SPACESHIP_DEFAULTSTR(p1->tty_name, p2->tty_name, "\x7F"); |
| Hisham Muhammad | be1700c | 2015-03-16 01:43:04 -0300 | [diff] [blame] | 700 | case USER: |
| Christian Göttsche | 397b5c4 | 2020-11-04 17:46:24 +0100 | [diff] [blame] | 701 | return SPACESHIP_NULLSTR(p1->user, p2->user); |
| Hisham Muhammad | 5d48ab8 | 2006-07-11 06:13:32 +0000 | [diff] [blame] | 702 | default: |
| Christian Göttsche | 615fc93 | 2021-04-18 15:52:28 +0200 | [diff] [blame] | 703 | assert(0 && "Process_compareByKey_Base: default key reached"); /* should never be reached */ |
| Benny Baumann | 77db240 | 2020-12-18 22:12:26 +0100 | [diff] [blame] | 704 | return SPACESHIP_NUMBER(p1->pid, p2->pid); |
| Hisham Muhammad | 5d48ab8 | 2006-07-11 06:13:32 +0000 | [diff] [blame] | 705 | } |
| Hisham Muhammad | d6231ba | 2006-03-04 18:16:49 +0000 | [diff] [blame] | 706 | } |