Changeset dec16a2 in mainline for uspace/app/top/screen.c
- Timestamp:
- 2010-04-18T16:52:47Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 5c45ca8
- Parents:
- e535eeb
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/top/screen.c
re535eeb rdec16a2 1 1 /* 2 2 * Copyright (c) 2010 Stanislav Kozina 3 * Copyright (c) 2010 Martin Decky 3 4 * All rights reserved. 4 5 * … … 38 39 #include <io/console.h> 39 40 #include <vfs/vfs.h> 40 #include < load.h>41 #include < kernel/ps/taskinfo.h>42 #include < ps.h>41 #include <stdarg.h> 42 #include <stats.h> 43 #include <inttypes.h> 43 44 #include "screen.h" 44 45 #include "top.h" 45 #include "func.h" 46 47 int rows; 48 int colls; 49 int up_rows;50 51 #define WHITE 0xf0f0f0 52 #define BLACK 0x000000 53 54 static void print_float(ps_float f, int precision) 55 { 56 printf("%2u.", f.upper / f.lower);57 int i;58 u nsigned int rest = (f.upper % f.lower) * 10;59 for (i = 0; i < precision; ++i) {60 printf("% d", rest / f.lower);61 rest = (rest % f .lower) * 10;62 } 63 } 64 65 static void resume_normal(void)46 47 #define WHITE 0xf0f0f0 48 #define BLACK 0x000000 49 50 static int rows; 51 static int colls; 52 static int up_rows; 53 54 static void print_float(fixed_float ffloat, unsigned int precision) 55 { 56 printf("%2" PRIu64 ".", ffloat.upper / ffloat.lower); 57 58 unsigned int i; 59 uint64_t rest = (ffloat.upper % ffloat.lower) * 10; 60 for (i = 0; i < precision; i++) { 61 printf("%" PRIu64, rest / ffloat.lower); 62 rest = (rest % ffloat.lower) * 10; 63 } 64 } 65 66 static void screen_resume_normal(void) 66 67 { 67 68 fflush(stdout); … … 69 70 } 70 71 72 static void screen_moveto(int r, int c) 73 { 74 fflush(stdout); 75 console_goto(fphone(stdout), c, r); 76 } 77 78 static void screen_clear(void) 79 { 80 console_clear(fphone(stdout)); 81 screen_moveto(0, 0); 82 up_rows = 0; 83 fflush(stdout); 84 } 85 71 86 void screen_init(void) 72 87 { 88 console_cursor_visibility(fphone(stdout), 0); 89 screen_resume_normal(); 90 screen_clear(); 91 73 92 console_get_size(fphone(stdout), &colls, &rows); 74 up_rows = 0; 75 console_cursor_visibility(fphone(stdout), 0); 76 resume_normal(); 77 clear_screen(); 78 } 79 80 void clear_screen(void) 81 { 82 console_clear(fphone(stdout)); 83 moveto(0, 0); 84 up_rows = 0; 85 fflush(stdout); 86 } 87 88 void moveto(int r, int c) 89 { 90 fflush(stdout); 91 console_goto(fphone(stdout), c, r); 93 } 94 95 void screen_done(void) 96 { 97 screen_resume_normal(); 98 screen_clear(); 99 console_cursor_visibility(fphone(stdout), 1); 92 100 } 93 101 94 102 static inline void print_time(data_t *data) 95 103 { 96 printf("%02 d:%02d:%02d", data->hours, data->minutes, data->seconds);104 printf("%02lu:%02lu:%02lu ", data->hours, data->minutes, data->seconds); 97 105 } 98 106 99 107 static inline void print_uptime(data_t *data) 100 108 { 101 printf("up % 4d days, %02d:%02d:%02d, ", data->uptime_d, data->uptime_h,102 data->uptime_m, data->uptime_s);109 printf("up %u days, %02u:%02u:%02u, ", data->udays, data->uhours, 110 data->uminutes, data->useconds); 103 111 } 104 112 105 113 static inline void print_load(data_t *data) 106 114 { 107 puts("load avarage: "); 108 print_load_fragment(data->load[0], 2); 109 puts(" "); 110 print_load_fragment(data->load[1], 2); 111 puts(" "); 112 print_load_fragment(data->load[2], 2); 113 } 114 115 static inline void print_taskstat(data_t *data) 116 { 117 puts("Tasks: "); 118 printf("%4u total", data->task_count); 119 } 120 121 static inline void print_threadstat(data_t *data) 122 { 115 printf("load avarage: "); 116 117 size_t i; 118 for (i = 0; i < data->load_count; i++) { 119 stats_print_load_fragment(data->load[i], 2); 120 printf(" "); 121 } 122 } 123 124 static inline void print_task_summary(data_t *data) 125 { 126 printf("tasks: %u total", data->tasks_count); 127 } 128 129 static inline void print_thread_summary(data_t *data) 130 { 131 size_t total = 0; 132 size_t running = 0; 133 size_t ready = 0; 123 134 size_t sleeping = 0; 124 size_t running = 0; 135 size_t lingering = 0; 136 size_t other = 0; 125 137 size_t invalid = 0; 126 size_t other = 0; 127 size_t total = 0; 128 size_t i; 129 for (i = 0; i < data->thread_count; ++i) { 130 ++total; 131 switch (data->thread_infos[i].state) { 132 case Invalid: 133 case Lingering: 134 ++invalid; 135 break; 136 case Running: 137 case Ready: 138 ++running; 139 break; 140 case Sleeping: 141 ++sleeping; 142 break; 143 case Entering: 144 case Exiting: 145 ++other; 146 break; 138 139 140 size_t i; 141 for (i = 0; i < data->threads_count; i++) { 142 total++; 143 144 switch (data->threads[i].state) { 145 case Running: 146 running++; 147 break; 148 case Ready: 149 ready++; 150 break; 151 case Sleeping: 152 sleeping++; 153 break; 154 case Lingering: 155 lingering++; 156 break; 157 case Entering: 158 case Exiting: 159 other++; 160 break; 161 default: 162 invalid++; 147 163 } 148 164 } 149 printf("Threads: %5u total, %5u running, %5u sleeping, %5u invalid, %5u other", 150 total, running, sleeping, invalid, other); 151 } 152 153 static inline void print_cpuinfo(data_t *data) 154 { 155 unsigned int i; 156 uspace_cpu_info_t *cpus = data->cpus; 157 for (i = 0; i < data->cpu_count; ++i) { 158 printf("Cpu%u (%4u Mhz): Busy ticks: %6llu, Idle Ticks: %6llu", 159 i, (unsigned int)cpus[i].frequency_mhz, cpus[i].busy_ticks, 160 cpus[i].idle_ticks); 165 166 printf("threads: %u total, %u running, %u ready, %u sleeping, %u lingering, " 167 "%u other, %u invalid", 168 total, running, ready, sleeping, lingering, other, invalid); 169 } 170 171 static inline void print_cpu_info(data_t *data) 172 { 173 size_t i; 174 for (i = 0; i < data->cpus_count; i++) { 175 printf("cpu%u (%4" PRIu16 " MHz): busy ticks: " 176 "%" PRIu64 ", idle ticks: %" PRIu64, 177 data->cpus[i].id, data->cpus[i].frequency_mhz, 178 data->cpus[i].busy_ticks, data->cpus[i].idle_ticks); 161 179 printf(", idle: "); 162 print_float(data->cpu_perc[i].idle, 2); 163 puts("%, busy: "); 164 print_float(data->cpu_perc[i].busy, 2); 165 puts("%\n"); 166 ++up_rows; 167 } 168 } 169 170 static inline void print_meminfo(data_t *data) 171 { 172 uint64_t newsize; 173 char suffix; 174 order(data->mem_info.total, &newsize, &suffix); 175 printf("Mem: %8llu %c total", newsize, suffix); 176 order(data->mem_info.used, &newsize, &suffix); 177 printf(", %8llu %c used", newsize, suffix); 178 order(data->mem_info.free, &newsize, &suffix); 179 printf(", %8llu %c free", newsize, suffix); 180 print_float(data->cpus_perc[i].idle, 2); 181 printf("%%, busy: "); 182 print_float(data->cpus_perc[i].busy, 2); 183 184 printf("%%\n"); 185 up_rows++; 186 } 187 } 188 189 static inline void print_physmem_info(data_t *data) 190 { 191 uint64_t total; 192 uint64_t unavail; 193 uint64_t used; 194 uint64_t free; 195 char total_suffix; 196 char unavail_suffix; 197 char used_suffix; 198 char free_suffix; 199 200 order_suffix(data->physmem->total, &total, &total_suffix); 201 order_suffix(data->physmem->unavail, &unavail, &unavail_suffix); 202 order_suffix(data->physmem->used, &used, &used_suffix); 203 order_suffix(data->physmem->free, &free, &free_suffix); 204 205 printf("memory: %" PRIu64 "%c total, %" PRIu64 "%c unavail, %" 206 PRIu64 "%c used, %" PRIu64 "%c free", total, total_suffix, 207 unavail, unavail_suffix, used, used_suffix, free, free_suffix); 180 208 } 181 209 182 210 static inline void print_tasks(data_t *data, int row) 183 211 { 184 int i; 185 for (i = 0; i < (int)data->task_count; ++i) { 186 if (row + i > rows) 187 return; 188 task_info_t *taskinfo = &data->taskinfos[i]; 189 uint64_t mem; 190 char suffix; 191 order(taskinfo->virt_mem, &mem, &suffix); 192 printf("%8llu %8u %8llu%c ", taskinfo->taskid, 193 taskinfo->thread_count, mem, suffix); 194 task_perc_t *taskperc = &data->task_perc[i]; 195 puts(" "); 196 print_float(taskperc->mem, 2); 197 puts("% "); 198 print_float(taskperc->ucycles, 2); 199 puts("% "); 200 print_float(taskperc->kcycles, 2); 201 puts("% "); 202 printf("%s\n", taskinfo->name); 212 size_t i; 213 for (i = 0; i < data->tasks_count; i++, row++) { 214 if (row > rows) 215 break; 216 217 uint64_t virtmem; 218 char virtmem_suffix; 219 order_suffix(data->tasks[i].virtmem, &virtmem, &virtmem_suffix); 220 221 printf("%8" PRIu64 " %8u %8" PRIu64 "%c ", data->tasks[i].task_id, 222 data->tasks[i].threads, virtmem, virtmem_suffix); 223 printf(" "); 224 print_float(data->tasks_perc[i].virtmem, 2); 225 printf("%% "); 226 print_float(data->tasks_perc[i].ucycles, 2); 227 printf("%% "); 228 print_float(data->tasks_perc[i].kcycles, 2); 229 printf("%% %s\n", data->tasks[i].name); 203 230 } 204 231 } … … 208 235 fflush(stdout); 209 236 console_set_rgb_color(fphone(stdout), WHITE, BLACK); 237 210 238 printf(" ID Threads Mem %%Mem %%uCycles %%kCycles Name"); 239 211 240 int i; 212 241 for (i = 61; i < colls; ++i) 213 puts(" "); 242 printf(" "); 243 214 244 fflush(stdout); 215 245 console_set_rgb_color(fphone(stdout), BLACK, WHITE); … … 220 250 fflush(stdout); 221 251 console_set_rgb_color(fphone(stdout), WHITE, BLACK); 252 222 253 printf(" ID Calls sent Calls recv Answs sent Answs recv IRQn recv Forw Name"); 254 223 255 int i; 224 256 for (i = 80; i < colls; ++i) 225 puts(" "); 257 printf(" "); 258 226 259 fflush(stdout); 227 260 console_set_rgb_color(fphone(stdout), BLACK, WHITE); … … 230 263 static inline void print_ipc(data_t *data, int row) 231 264 { 232 int i; 233 for (i = 0; i < (int)data->task_count; ++i) { 234 if (row + i > rows) 235 return; 236 task_info_t *taskinfo = &data->taskinfos[i]; 237 task_ipc_info_t *ipcinfo = &taskinfo->ipc_info; 238 printf("%8llu ", taskinfo->taskid); 239 printf("%10llu %10llu %10llu %10llu %10llu %10llu ", 240 ipcinfo->call_sent, ipcinfo->call_recieved, 241 ipcinfo->answer_sent, ipcinfo->answer_recieved, 242 ipcinfo->irq_notif_recieved, ipcinfo->forwarded); 243 printf("%s\n", taskinfo->name); 265 size_t i; 266 for (i = 0; i < data->tasks_count; i++, row++) { 267 if (row > rows) 268 break; 269 270 printf("%8" PRIu64 " %10" PRIu64 " %10" PRIu64 " %10" PRIu64 271 " %10" PRIu64 " %10" PRIu64 " %10" PRIu64 " %s\n", 272 data->tasks[i].task_id, data->tasks[i].ipc_info.call_sent, 273 data->tasks[i].ipc_info.call_recieved, 274 data->tasks[i].ipc_info.answer_sent, 275 data->tasks[i].ipc_info.answer_recieved, 276 data->tasks[i].ipc_info.irq_notif_recieved, 277 data->tasks[i].ipc_info.forwarded, data->tasks[i].name); 244 278 } 245 279 } … … 247 281 void print_data(data_t *data) 248 282 { 249 clear_screen(); 250 fflush(stdout); 283 screen_clear(); 284 fflush(stdout); 285 251 286 printf("top - "); 252 287 print_time(data); 253 288 print_uptime(data); 254 289 print_load(data); 255 puts("\n"); 256 ++up_rows; 257 print_taskstat(data); 258 puts("\n"); 259 ++up_rows; 260 print_threadstat(data); 261 puts("\n"); 262 ++up_rows; 263 print_cpuinfo(data); 264 print_meminfo(data); 265 puts("\n"); 266 ++up_rows; 267 puts("\n"); 268 ++up_rows; 290 291 printf("\n"); 292 up_rows++; 293 294 print_task_summary(data); 295 296 printf("\n"); 297 up_rows++; 298 299 print_thread_summary(data); 300 301 printf("\n"); 302 up_rows++; 303 304 print_cpu_info(data); 305 print_physmem_info(data); 306 307 printf("\n"); 308 up_rows++; 309 310 /* Empty row for warnings */ 311 printf("\n"); 312 269 313 if (operation_type == OP_IPC) { 270 314 print_ipc_head(); 271 p uts("\n");315 printf("\n"); 272 316 print_ipc(data, up_rows); 273 317 } else { 274 318 print_task_head(); 275 p uts("\n");319 printf("\n"); 276 320 print_tasks(data, up_rows); 277 321 } 322 323 fflush(stdout); 324 } 325 326 void print_warning(const char *fmt, ...) 327 { 328 screen_moveto(up_rows, 0); 329 330 va_list args; 331 va_start(args, fmt); 332 vprintf(fmt, args); 333 va_end(args); 334 278 335 fflush(stdout); 279 336 }
Note:
See TracChangeset
for help on using the changeset viewer.