void top(void) { if (getuid() == 0) firemon_drop_privs(); while (1) { // clear linked list head_clear(); // set pid table int i; int itv = 5; // 5 second interval pid_read(0); // start cpu measurements unsigned utime; unsigned stime; for (i = 0; i < MAX_PIDS; i++) { if (pids[i].level == 1) pid_store_cpu(i, 0, &utime, &stime); } // wait 5 seconds firemon_sleep(itv); // grab screen size struct winsize sz; int row = 24; int col = 80; if (!ioctl(0, TIOCGWINSZ, &sz)) { col = sz.ws_col; row = sz.ws_row; } // start printing firemon_clrscr(); char *header = get_header(); if (strlen(header) > col) header[col] = '\0'; printf("%s\n", header); if (row > 0) row--; free(header); // find system uptime FILE *fp = fopen("/proc/uptime", "r"); if (fp) { float f; int rv = fscanf(fp, "%f", &f); (void) rv; sysuptime = (unsigned long long) f; fclose(fp); } // print processes for (i = 0; i < MAX_PIDS; i++) { if (pids[i].level == 1) { float cpu = 0; int cnt = 0; // process count char *line = print_top(i, 0, &utime, &stime, itv, &cpu, &cnt); if (line) head_add(cpu, line); } } head_print(col, row); } }
int colm_delete_program( program_t *prg ) { tree_t **sp = prg->stack_root; int exit_status = prg->exit_status; colm_tree_downref( prg, sp, prg->return_val ); colm_clear_heap( prg, sp ); colm_tree_downref( prg, sp, prg->error ); #if DEBUG long kid_lost = kid_num_lost( prg ); long tree_lost = tree_num_lost( prg ); long parse_tree_lost = parse_tree_num_lost( &prg->parse_tree_pool ); long head_lost = head_num_lost( prg ); long location_lost = location_num_lost( prg ); if ( kid_lost ) message( "warning: lost kids: %ld\n", kid_lost ); if ( tree_lost ) message( "warning: lost trees: %ld\n", tree_lost ); if ( parse_tree_lost ) message( "warning: lost parse trees: %ld\n", parse_tree_lost ); if ( head_lost ) message( "warning: lost heads: %ld\n", head_lost ); if ( location_lost ) message( "warning: lost locations: %ld\n", location_lost ); #endif kid_clear( prg ); tree_clear( prg ); head_clear( prg ); parse_tree_clear( &prg->parse_tree_pool ); location_clear( prg ); struct run_buf *rb = prg->alloc_run_buf; while ( rb != 0 ) { struct run_buf *next = rb->next; free( rb ); rb = next; } vm_clear( prg ); if ( prg->stream_fns ) { char **ptr = prg->stream_fns; while ( *ptr != 0 ) { free( *ptr ); ptr += 1; } free( prg->stream_fns ); } free( prg ); return exit_status; }