| Nathan Scott | 2be0992 | 2020-08-20 13:59:41 +1000 | [diff] [blame] | 1 | /* |
| 2 | htop - PressureStallMeter.c |
| 3 | (C) 2004-2011 Hisham H. Muhammad |
| 4 | (C) 2019 Ran Benita |
| Daniel Lange | 94ad111 | 2021-09-22 11:33:00 +0200 | [diff] [blame] | 5 | Released under the GNU GPLv2+, see the COPYING file |
| Nathan Scott | 2be0992 | 2020-08-20 13:59:41 +1000 | [diff] [blame] | 6 | in the source distribution for its full text. |
| 7 | */ |
| 8 | |
| Daniel Lange | 179aeb0 | 2023-11-29 17:44:20 +0100 | [diff] [blame^] | 9 | #include "config.h" // IWYU pragma: keep |
| 10 | |
| mayurdahibhate | 3f86a01 | 2021-04-29 23:43:36 +0530 | [diff] [blame] | 11 | #include "linux/PressureStallMeter.h" |
| Nathan Scott | 2be0992 | 2020-08-20 13:59:41 +1000 | [diff] [blame] | 12 | |
| Benny Baumann | 0f52629 | 2020-09-19 13:55:23 +0200 | [diff] [blame] | 13 | #include <stdbool.h> |
| Nathan Scott | 2be0992 | 2020-08-20 13:59:41 +1000 | [diff] [blame] | 14 | #include <string.h> |
| 15 | |
| Benny Baumann | c6f04a9 | 2020-09-19 20:22:34 +0200 | [diff] [blame] | 16 | #include "CRT.h" |
| Benny Baumann | 0f52629 | 2020-09-19 13:55:23 +0200 | [diff] [blame] | 17 | #include "Meter.h" |
| 18 | #include "Object.h" |
| Benny Baumann | c6f04a9 | 2020-09-19 20:22:34 +0200 | [diff] [blame] | 19 | #include "Platform.h" |
| Benny Baumann | 0f52629 | 2020-09-19 13:55:23 +0200 | [diff] [blame] | 20 | #include "RichString.h" |
| Benny Baumann | 872e542 | 2020-10-14 20:21:09 +0200 | [diff] [blame] | 21 | #include "XUtils.h" |
| Benny Baumann | c6f04a9 | 2020-09-19 20:22:34 +0200 | [diff] [blame] | 22 | |
| Nathan Scott | 2be0992 | 2020-08-20 13:59:41 +1000 | [diff] [blame] | 23 | |
| Christian Göttsche | 7af0665 | 2020-10-13 14:35:30 +0200 | [diff] [blame] | 24 | static const int PressureStallMeter_attributes[] = { |
| Christian Göttsche | 1d8192c | 2020-11-29 15:27:51 +0100 | [diff] [blame] | 25 | PRESSURE_STALL_TEN, |
| 26 | PRESSURE_STALL_SIXTY, |
| 27 | PRESSURE_STALL_THREEHUNDRED |
| Nathan Scott | 2be0992 | 2020-08-20 13:59:41 +1000 | [diff] [blame] | 28 | }; |
| 29 | |
| Christian Göttsche | 2d1042a | 2020-10-06 13:13:16 +0200 | [diff] [blame] | 30 | static void PressureStallMeter_updateValues(Meter* this) { |
| Benny Baumann | b23f823 | 2020-10-31 22:14:27 +0100 | [diff] [blame] | 31 | const char* file; |
| 32 | if (strstr(Meter_name(this), "CPU")) { |
| 33 | file = "cpu"; |
| 34 | } else if (strstr(Meter_name(this), "IO")) { |
| 35 | file = "io"; |
| Matthias Maier | 0bd1085 | 2023-02-13 21:39:32 -0600 | [diff] [blame] | 36 | } else if (strstr(Meter_name(this), "IRQ")) { |
| 37 | file = "irq"; |
| Benny Baumann | b23f823 | 2020-10-31 22:14:27 +0100 | [diff] [blame] | 38 | } else { |
| 39 | file = "memory"; |
| 40 | } |
| Nathan Scott | 2be0992 | 2020-08-20 13:59:41 +1000 | [diff] [blame] | 41 | |
| Benny Baumann | b23f823 | 2020-10-31 22:14:27 +0100 | [diff] [blame] | 42 | bool some; |
| 43 | if (strstr(Meter_name(this), "Some")) { |
| 44 | some = true; |
| 45 | } else { |
| 46 | some = false; |
| 47 | } |
| Nathan Scott | 2be0992 | 2020-08-20 13:59:41 +1000 | [diff] [blame] | 48 | |
| Benny Baumann | b23f823 | 2020-10-31 22:14:27 +0100 | [diff] [blame] | 49 | Platform_getPressureStall(file, some, &this->values[0], &this->values[1], &this->values[2]); |
| Christian Göttsche | ded9c5d | 2020-12-08 15:55:26 +0100 | [diff] [blame] | 50 | |
| 51 | /* only print bar for ten (not sixty and threehundred), cause the sum is meaningless */ |
| 52 | this->curItems = 1; |
| 53 | |
| Christian Göttsche | 2d1042a | 2020-10-06 13:13:16 +0200 | [diff] [blame] | 54 | xSnprintf(this->txtBuffer, sizeof(this->txtBuffer), "%s %s %5.2lf%% %5.2lf%% %5.2lf%%", some ? "some" : "full", file, this->values[0], this->values[1], this->values[2]); |
| Nathan Scott | 2be0992 | 2020-08-20 13:59:41 +1000 | [diff] [blame] | 55 | } |
| 56 | |
| Christian Göttsche | 79ad39c | 2020-10-06 12:28:11 +0200 | [diff] [blame] | 57 | static void PressureStallMeter_display(const Object* cast, RichString* out) { |
| 58 | const Meter* this = (const Meter*)cast; |
| Nathan Scott | 2be0992 | 2020-08-20 13:59:41 +1000 | [diff] [blame] | 59 | char buffer[20]; |
| Christian Göttsche | 436808f | 2021-04-14 20:47:42 +0200 | [diff] [blame] | 60 | int len; |
| 61 | |
| 62 | len = xSnprintf(buffer, sizeof(buffer), "%5.2lf%% ", this->values[0]); |
| 63 | RichString_appendnAscii(out, CRT_colors[PRESSURE_STALL_TEN], buffer, len); |
| 64 | len = xSnprintf(buffer, sizeof(buffer), "%5.2lf%% ", this->values[1]); |
| 65 | RichString_appendnAscii(out, CRT_colors[PRESSURE_STALL_SIXTY], buffer, len); |
| 66 | len = xSnprintf(buffer, sizeof(buffer), "%5.2lf%% ", this->values[2]); |
| 67 | RichString_appendnAscii(out, CRT_colors[PRESSURE_STALL_THREEHUNDRED], buffer, len); |
| Nathan Scott | 2be0992 | 2020-08-20 13:59:41 +1000 | [diff] [blame] | 68 | } |
| 69 | |
| Christian Göttsche | 7af0665 | 2020-10-13 14:35:30 +0200 | [diff] [blame] | 70 | const MeterClass PressureStallCPUSomeMeter_class = { |
| Nathan Scott | 2be0992 | 2020-08-20 13:59:41 +1000 | [diff] [blame] | 71 | .super = { |
| 72 | .extends = Class(Meter), |
| 73 | .delete = Meter_delete, |
| 74 | .display = PressureStallMeter_display, |
| 75 | }, |
| 76 | .updateValues = PressureStallMeter_updateValues, |
| 77 | .defaultMode = TEXT_METERMODE, |
| 78 | .maxItems = 3, |
| 79 | .total = 100.0, |
| 80 | .attributes = PressureStallMeter_attributes, |
| 81 | .name = "PressureStallCPUSome", |
| Christian Göttsche | 1d8192c | 2020-11-29 15:27:51 +0100 | [diff] [blame] | 82 | .uiName = "PSI some CPU", |
| 83 | .caption = "PSI some CPU: ", |
| 84 | .description = "Pressure Stall Information, some cpu" |
| Nathan Scott | 2be0992 | 2020-08-20 13:59:41 +1000 | [diff] [blame] | 85 | }; |
| 86 | |
| Christian Göttsche | 7af0665 | 2020-10-13 14:35:30 +0200 | [diff] [blame] | 87 | const MeterClass PressureStallIOSomeMeter_class = { |
| Nathan Scott | 2be0992 | 2020-08-20 13:59:41 +1000 | [diff] [blame] | 88 | .super = { |
| 89 | .extends = Class(Meter), |
| 90 | .delete = Meter_delete, |
| 91 | .display = PressureStallMeter_display, |
| 92 | }, |
| 93 | .updateValues = PressureStallMeter_updateValues, |
| 94 | .defaultMode = TEXT_METERMODE, |
| 95 | .maxItems = 3, |
| 96 | .total = 100.0, |
| 97 | .attributes = PressureStallMeter_attributes, |
| 98 | .name = "PressureStallIOSome", |
| Christian Göttsche | 1d8192c | 2020-11-29 15:27:51 +0100 | [diff] [blame] | 99 | .uiName = "PSI some IO", |
| 100 | .caption = "PSI some IO: ", |
| 101 | .description = "Pressure Stall Information, some io" |
| Nathan Scott | 2be0992 | 2020-08-20 13:59:41 +1000 | [diff] [blame] | 102 | }; |
| 103 | |
| Christian Göttsche | 7af0665 | 2020-10-13 14:35:30 +0200 | [diff] [blame] | 104 | const MeterClass PressureStallIOFullMeter_class = { |
| Nathan Scott | 2be0992 | 2020-08-20 13:59:41 +1000 | [diff] [blame] | 105 | .super = { |
| 106 | .extends = Class(Meter), |
| 107 | .delete = Meter_delete, |
| 108 | .display = PressureStallMeter_display, |
| 109 | }, |
| 110 | .updateValues = PressureStallMeter_updateValues, |
| 111 | .defaultMode = TEXT_METERMODE, |
| 112 | .maxItems = 3, |
| 113 | .total = 100.0, |
| 114 | .attributes = PressureStallMeter_attributes, |
| 115 | .name = "PressureStallIOFull", |
| Christian Göttsche | 1d8192c | 2020-11-29 15:27:51 +0100 | [diff] [blame] | 116 | .uiName = "PSI full IO", |
| 117 | .caption = "PSI full IO: ", |
| 118 | .description = "Pressure Stall Information, full io" |
| Nathan Scott | 2be0992 | 2020-08-20 13:59:41 +1000 | [diff] [blame] | 119 | }; |
| 120 | |
| Matthias Maier | 0bd1085 | 2023-02-13 21:39:32 -0600 | [diff] [blame] | 121 | const MeterClass PressureStallIRQFullMeter_class = { |
| 122 | .super = { |
| 123 | .extends = Class(Meter), |
| 124 | .delete = Meter_delete, |
| 125 | .display = PressureStallMeter_display, |
| 126 | }, |
| 127 | .updateValues = PressureStallMeter_updateValues, |
| 128 | .defaultMode = TEXT_METERMODE, |
| 129 | .maxItems = 3, |
| 130 | .total = 100.0, |
| 131 | .attributes = PressureStallMeter_attributes, |
| 132 | .name = "PressureStallIRQFull", |
| 133 | .uiName = "PSI full IRQ", |
| 134 | .caption = "PSI full IRQ: ", |
| 135 | .description = "Pressure Stall Information, full irq" |
| 136 | }; |
| 137 | |
| Christian Göttsche | 7af0665 | 2020-10-13 14:35:30 +0200 | [diff] [blame] | 138 | const MeterClass PressureStallMemorySomeMeter_class = { |
| Nathan Scott | 2be0992 | 2020-08-20 13:59:41 +1000 | [diff] [blame] | 139 | .super = { |
| 140 | .extends = Class(Meter), |
| 141 | .delete = Meter_delete, |
| 142 | .display = PressureStallMeter_display, |
| 143 | }, |
| 144 | .updateValues = PressureStallMeter_updateValues, |
| 145 | .defaultMode = TEXT_METERMODE, |
| 146 | .maxItems = 3, |
| 147 | .total = 100.0, |
| 148 | .attributes = PressureStallMeter_attributes, |
| 149 | .name = "PressureStallMemorySome", |
| Christian Göttsche | 1d8192c | 2020-11-29 15:27:51 +0100 | [diff] [blame] | 150 | .uiName = "PSI some memory", |
| 151 | .caption = "PSI some memory: ", |
| 152 | .description = "Pressure Stall Information, some memory" |
| Nathan Scott | 2be0992 | 2020-08-20 13:59:41 +1000 | [diff] [blame] | 153 | }; |
| 154 | |
| Christian Göttsche | 7af0665 | 2020-10-13 14:35:30 +0200 | [diff] [blame] | 155 | const MeterClass PressureStallMemoryFullMeter_class = { |
| Nathan Scott | 2be0992 | 2020-08-20 13:59:41 +1000 | [diff] [blame] | 156 | .super = { |
| 157 | .extends = Class(Meter), |
| 158 | .delete = Meter_delete, |
| 159 | .display = PressureStallMeter_display, |
| 160 | }, |
| 161 | .updateValues = PressureStallMeter_updateValues, |
| 162 | .defaultMode = TEXT_METERMODE, |
| 163 | .maxItems = 3, |
| 164 | .total = 100.0, |
| 165 | .attributes = PressureStallMeter_attributes, |
| 166 | .name = "PressureStallMemoryFull", |
| Christian Göttsche | 1d8192c | 2020-11-29 15:27:51 +0100 | [diff] [blame] | 167 | .uiName = "PSI full memory", |
| 168 | .caption = "PSI full memory: ", |
| 169 | .description = "Pressure Stall Information, full memory" |
| Nathan Scott | 2be0992 | 2020-08-20 13:59:41 +1000 | [diff] [blame] | 170 | }; |