int main() { #ifdef EMULATION emu_init(); #endif irq_setmask(0); irq_enable(1); uart_async_init(); banner(); brd_init(); cpustats_init(); time_init(); mem_init(); vga_init(); snd_init(); pfpu_init(); tmu_init(); renderer_init(); apipe_init(); rpipe_init(); slowout_init(); hdlcd_init(); ui_init(); shell_init(); while(1) { if(readchar_nonblock()) shell_input(readchar()); apipe_service(); rpipe_service(); #ifdef EMULATION emu_service(); #endif } return 0; }
int main(int argc, char **argv) { bool force_ascii = false; int delay = 500; int opt; while ((opt = getopt(argc, argv, "ad:h")) != -1) { switch (opt) { case 'a': force_ascii = true; break; case 'd': { char *end; float val = strtof(optarg, &end); if (*end) { fprintf(stderr, "Delay argument (-d) requires " "a number\n"); exit(2); } delay = 1000 * val; break; } default: fprintf(stderr, "Usage: %s [-a] [-d delay]\n", argv[0]); if (opt == 'h') { fprintf(stderr, "\n" "Display CPU usage as a bar chart.\n" "\n" "Options:\n" " -a Use ASCII-only bars (instead of Unicode)\n" " -d SECS Specify delay between updates (decimals accepted)\n" "\n" "If your bars look funky, use -a or specify LANG=C.\n" "\n" "For kernels prior to 2.6.37, using a small delay on a large system can\n" "induce significant system time overhead.\n"); exit(0); } exit(2); } } if (optind < argc) { fprintf(stderr, "Unexpected arguments\n"); exit(2); } struct sigaction sa = { .sa_handler = on_sigint }; sigaction(SIGINT, &sa, NULL); cpustats_init(); term_init(); ui_init(force_ascii); struct cpustats *before = cpustats_alloc(), *after = cpustats_alloc(), *delta = cpustats_alloc(), *prevLayout = cpustats_alloc(); cpustats_read(before); cpustats_subtract(prevLayout, before, before); ui_layout(prevLayout); fflush(stdout); while (!need_exit) { // Sleep or take input struct pollfd pollfd = { .fd = 0, .events = POLLIN }; if (poll(&pollfd, 1, delay) < 0 && errno != EINTR) epanic("poll failed"); if (pollfd.revents & POLLIN) { char ch = 0; if (read(0, &ch, 1) < 0) epanic("read failed"); if (ch == 'q') break; } // Get new statistics cpustats_read(after); cpustats_subtract(delta, after, before); // Recompute the layout if necessary if (term_check_resize() || !cpustats_sets_equal(delta, prevLayout)) ui_layout(delta); // Show the load average float loadavg[3]; cpustats_loadavg(loadavg); ui_show_load(loadavg); if (delta->real) { ui_compute_bars(delta); ui_show_bars(); } // Done updating UI fflush(stdout); SWAP(before, after); SWAP(delta, prevLayout); } return 0; }