1*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 2*15db2897SKrishnendu Sadhukhan - Sun Microsystems * CDDL HEADER START 3*15db2897SKrishnendu Sadhukhan - Sun Microsystems * 4*15db2897SKrishnendu Sadhukhan - Sun Microsystems * The contents of this file are subject to the terms of the 5*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Common Development and Distribution License (the "License"). 6*15db2897SKrishnendu Sadhukhan - Sun Microsystems * You may not use this file except in compliance with the License. 7*15db2897SKrishnendu Sadhukhan - Sun Microsystems * 8*15db2897SKrishnendu Sadhukhan - Sun Microsystems * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*15db2897SKrishnendu Sadhukhan - Sun Microsystems * or http://www.opensolaris.org/os/licensing. 10*15db2897SKrishnendu Sadhukhan - Sun Microsystems * See the License for the specific language governing permissions 11*15db2897SKrishnendu Sadhukhan - Sun Microsystems * and limitations under the License. 12*15db2897SKrishnendu Sadhukhan - Sun Microsystems * 13*15db2897SKrishnendu Sadhukhan - Sun Microsystems * When distributing Covered Code, include this CDDL HEADER in each 14*15db2897SKrishnendu Sadhukhan - Sun Microsystems * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*15db2897SKrishnendu Sadhukhan - Sun Microsystems * If applicable, add the following below this CDDL HEADER, with the 16*15db2897SKrishnendu Sadhukhan - Sun Microsystems * fields enclosed by brackets "[]" replaced with your own identifying 17*15db2897SKrishnendu Sadhukhan - Sun Microsystems * information: Portions Copyright [yyyy] [name of copyright owner] 18*15db2897SKrishnendu Sadhukhan - Sun Microsystems * 19*15db2897SKrishnendu Sadhukhan - Sun Microsystems * CDDL HEADER END 20*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 21*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 22*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Copyright (c) 2008-2009, Intel Corporation. 23*15db2897SKrishnendu Sadhukhan - Sun Microsystems * All Rights Reserved. 24*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 25*15db2897SKrishnendu Sadhukhan - Sun Microsystems 26*15db2897SKrishnendu Sadhukhan - Sun Microsystems #include <stdio.h> 27*15db2897SKrishnendu Sadhukhan - Sun Microsystems #include <stdlib.h> 28*15db2897SKrishnendu Sadhukhan - Sun Microsystems #include <unistd.h> 29*15db2897SKrishnendu Sadhukhan - Sun Microsystems #include <string.h> 30*15db2897SKrishnendu Sadhukhan - Sun Microsystems #include <sys/types.h> 31*15db2897SKrishnendu Sadhukhan - Sun Microsystems #include <sys/time.h> 32*15db2897SKrishnendu Sadhukhan - Sun Microsystems #include <dirent.h> 33*15db2897SKrishnendu Sadhukhan - Sun Microsystems #include <curses.h> 34*15db2897SKrishnendu Sadhukhan - Sun Microsystems #include <time.h> 35*15db2897SKrishnendu Sadhukhan - Sun Microsystems #include <wchar.h> 36*15db2897SKrishnendu Sadhukhan - Sun Microsystems #include <ctype.h> 37*15db2897SKrishnendu Sadhukhan - Sun Microsystems #include <stdarg.h> 38*15db2897SKrishnendu Sadhukhan - Sun Microsystems #include <signal.h> 39*15db2897SKrishnendu Sadhukhan - Sun Microsystems 40*15db2897SKrishnendu Sadhukhan - Sun Microsystems #include "latencytop.h" 41*15db2897SKrishnendu Sadhukhan - Sun Microsystems 42*15db2897SKrishnendu Sadhukhan - Sun Microsystems #define LT_WINDOW_X 80 43*15db2897SKrishnendu Sadhukhan - Sun Microsystems #define LT_WINDOW_Y 24 44*15db2897SKrishnendu Sadhukhan - Sun Microsystems 45*15db2897SKrishnendu Sadhukhan - Sun Microsystems #define LT_COLOR_DEFAULT 1 46*15db2897SKrishnendu Sadhukhan - Sun Microsystems #define LT_COLOR_HEADER 2 47*15db2897SKrishnendu Sadhukhan - Sun Microsystems 48*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* Windows created by libcurses */ 49*15db2897SKrishnendu Sadhukhan - Sun Microsystems static WINDOW *titlebar = NULL; 50*15db2897SKrishnendu Sadhukhan - Sun Microsystems static WINDOW *captionbar = NULL; 51*15db2897SKrishnendu Sadhukhan - Sun Microsystems static WINDOW *sysglobal_window = NULL; 52*15db2897SKrishnendu Sadhukhan - Sun Microsystems static WINDOW *taskbar = NULL; 53*15db2897SKrishnendu Sadhukhan - Sun Microsystems static WINDOW *process_window = NULL; 54*15db2897SKrishnendu Sadhukhan - Sun Microsystems static WINDOW *hintbar = NULL; 55*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* Screen dimension */ 56*15db2897SKrishnendu Sadhukhan - Sun Microsystems static int screen_width = 1, screen_height = 1; 57*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* Is display initialized, i.e. are window pointers set up. */ 58*15db2897SKrishnendu Sadhukhan - Sun Microsystems static int display_initialized = FALSE; 59*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* Is initscr() called */ 60*15db2897SKrishnendu Sadhukhan - Sun Microsystems static int curses_inited = FALSE; 61*15db2897SKrishnendu Sadhukhan - Sun Microsystems 62*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* To handle user key presses */ 63*15db2897SKrishnendu Sadhukhan - Sun Microsystems static pid_t selected_pid = INVALID_PID; 64*15db2897SKrishnendu Sadhukhan - Sun Microsystems static id_t selected_tid = INVALID_TID; 65*15db2897SKrishnendu Sadhukhan - Sun Microsystems static lt_sort_t sort_type = LT_SORT_TOTAL; 66*15db2897SKrishnendu Sadhukhan - Sun Microsystems static int thread_mode = FALSE; 67*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* Type of list being displayed */ 68*15db2897SKrishnendu Sadhukhan - Sun Microsystems static int current_list_type = LT_LIST_CAUSE; 69*15db2897SKrishnendu Sadhukhan - Sun Microsystems static int show_help = FALSE; 70*15db2897SKrishnendu Sadhukhan - Sun Microsystems 71*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* Help functions that append/prepend a blank to the given string */ 72*15db2897SKrishnendu Sadhukhan - Sun Microsystems #define fill_space_right(a, b, c) fill_space((a), (b), (c), TRUE) 73*15db2897SKrishnendu Sadhukhan - Sun Microsystems #define fill_space_left(a, b, c) fill_space((a), (b), (c), FALSE) 74*15db2897SKrishnendu Sadhukhan - Sun Microsystems 75*15db2897SKrishnendu Sadhukhan - Sun Microsystems static void 76*15db2897SKrishnendu Sadhukhan - Sun Microsystems fill_space(char *buffer, int len, int buffer_limit, int is_right) 77*15db2897SKrishnendu Sadhukhan - Sun Microsystems { 78*15db2897SKrishnendu Sadhukhan - Sun Microsystems int i = 0; 79*15db2897SKrishnendu Sadhukhan - Sun Microsystems int tofill; 80*15db2897SKrishnendu Sadhukhan - Sun Microsystems 81*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (len >= buffer_limit) { 82*15db2897SKrishnendu Sadhukhan - Sun Microsystems len = buffer_limit - 1; 83*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 84*15db2897SKrishnendu Sadhukhan - Sun Microsystems 85*15db2897SKrishnendu Sadhukhan - Sun Microsystems i = strlen(buffer); 86*15db2897SKrishnendu Sadhukhan - Sun Microsystems 87*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (i >= len) { 88*15db2897SKrishnendu Sadhukhan - Sun Microsystems return; 89*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 90*15db2897SKrishnendu Sadhukhan - Sun Microsystems 91*15db2897SKrishnendu Sadhukhan - Sun Microsystems tofill = len - i; 92*15db2897SKrishnendu Sadhukhan - Sun Microsystems 93*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (is_right) { 94*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) memset(&buffer[i], ' ', tofill); 95*15db2897SKrishnendu Sadhukhan - Sun Microsystems buffer[len] = '\0'; 96*15db2897SKrishnendu Sadhukhan - Sun Microsystems } else { 97*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) memmove(&buffer[tofill], buffer, i+1); 98*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) memset(buffer, ' ', tofill); 99*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 100*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 101*15db2897SKrishnendu Sadhukhan - Sun Microsystems 102*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* Convert the nanosecond value to a human readable string */ 103*15db2897SKrishnendu Sadhukhan - Sun Microsystems static const char * 104*15db2897SKrishnendu Sadhukhan - Sun Microsystems get_time_string(double nanoseconds, char *buffer, int len, int fill_width) 105*15db2897SKrishnendu Sadhukhan - Sun Microsystems { 106*15db2897SKrishnendu Sadhukhan - Sun Microsystems const double ONE_USEC = 1000.0; 107*15db2897SKrishnendu Sadhukhan - Sun Microsystems const double ONE_MSEC = 1000000.0; 108*15db2897SKrishnendu Sadhukhan - Sun Microsystems const double ONE_SEC = 1000000000.0; 109*15db2897SKrishnendu Sadhukhan - Sun Microsystems 110*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (nanoseconds < (ONE_USEC - .5)) { 111*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) snprintf(buffer, len, "%3.1f nsec", nanoseconds); 112*15db2897SKrishnendu Sadhukhan - Sun Microsystems } else if (nanoseconds < (ONE_MSEC - .5 * ONE_USEC)) { 113*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) snprintf(buffer, len, 114*15db2897SKrishnendu Sadhukhan - Sun Microsystems "%3.1f usec", nanoseconds / ONE_USEC); 115*15db2897SKrishnendu Sadhukhan - Sun Microsystems } else if (nanoseconds < (ONE_SEC - .5 * ONE_MSEC)) { 116*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) snprintf(buffer, len, 117*15db2897SKrishnendu Sadhukhan - Sun Microsystems "%3.1f msec", nanoseconds / ONE_MSEC); 118*15db2897SKrishnendu Sadhukhan - Sun Microsystems } else if (nanoseconds < 999.5 * ONE_SEC) { 119*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) snprintf(buffer, len, 120*15db2897SKrishnendu Sadhukhan - Sun Microsystems "%3.1f sec", nanoseconds / ONE_SEC); 121*15db2897SKrishnendu Sadhukhan - Sun Microsystems } else { 122*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) snprintf(buffer, len, 123*15db2897SKrishnendu Sadhukhan - Sun Microsystems "%.0e sec", nanoseconds / ONE_SEC); 124*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 125*15db2897SKrishnendu Sadhukhan - Sun Microsystems 126*15db2897SKrishnendu Sadhukhan - Sun Microsystems fill_space_left(buffer, fill_width, len); 127*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (buffer); 128*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 129*15db2897SKrishnendu Sadhukhan - Sun Microsystems 130*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* Used in print_statistics below */ 131*15db2897SKrishnendu Sadhukhan - Sun Microsystems #define WIDTH_REASON_STRING 36 132*15db2897SKrishnendu Sadhukhan - Sun Microsystems #define WIDTH_COUNT 12 133*15db2897SKrishnendu Sadhukhan - Sun Microsystems #define WIDTH_AVG 12 134*15db2897SKrishnendu Sadhukhan - Sun Microsystems #define WIDTH_MAX 12 135*15db2897SKrishnendu Sadhukhan - Sun Microsystems #define WIDTH_PCT 8 136*15db2897SKrishnendu Sadhukhan - Sun Microsystems #define BEGIN_COUNT WIDTH_REASON_STRING 137*15db2897SKrishnendu Sadhukhan - Sun Microsystems #define BEGIN_AVG (BEGIN_COUNT + WIDTH_COUNT) 138*15db2897SKrishnendu Sadhukhan - Sun Microsystems #define BEGIN_MAX (BEGIN_AVG + WIDTH_AVG) 139*15db2897SKrishnendu Sadhukhan - Sun Microsystems #define BEGIN_PCT (BEGIN_MAX + WIDTH_MAX) 140*15db2897SKrishnendu Sadhukhan - Sun Microsystems 141*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 142*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Print statistics in global/process pane. Called by print_sysglobal 143*15db2897SKrishnendu Sadhukhan - Sun Microsystems * print_process. 144*15db2897SKrishnendu Sadhukhan - Sun Microsystems * 145*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Parameters: 146*15db2897SKrishnendu Sadhukhan - Sun Microsystems * window - the global or process statistics window. 147*15db2897SKrishnendu Sadhukhan - Sun Microsystems * begin_line - where to start printing. 148*15db2897SKrishnendu Sadhukhan - Sun Microsystems * count - how many lines should be printed. 149*15db2897SKrishnendu Sadhukhan - Sun Microsystems * list - a stat_list. 150*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 151*15db2897SKrishnendu Sadhukhan - Sun Microsystems static void 152*15db2897SKrishnendu Sadhukhan - Sun Microsystems print_statistics(WINDOW * window, int begin_line, int nlines, void *list) 153*15db2897SKrishnendu Sadhukhan - Sun Microsystems { 154*15db2897SKrishnendu Sadhukhan - Sun Microsystems uint64_t total; 155*15db2897SKrishnendu Sadhukhan - Sun Microsystems int i = 0; 156*15db2897SKrishnendu Sadhukhan - Sun Microsystems 157*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (!display_initialized) { 158*15db2897SKrishnendu Sadhukhan - Sun Microsystems return; 159*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 160*15db2897SKrishnendu Sadhukhan - Sun Microsystems 161*15db2897SKrishnendu Sadhukhan - Sun Microsystems total = lt_stat_list_get_gtotal(list); 162*15db2897SKrishnendu Sadhukhan - Sun Microsystems 163*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (total == 0) { 164*15db2897SKrishnendu Sadhukhan - Sun Microsystems return; 165*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 166*15db2897SKrishnendu Sadhukhan - Sun Microsystems 167*15db2897SKrishnendu Sadhukhan - Sun Microsystems while (i < nlines && lt_stat_list_has_item(list, i)) { 168*15db2897SKrishnendu Sadhukhan - Sun Microsystems 169*15db2897SKrishnendu Sadhukhan - Sun Microsystems char tmp[WIDTH_REASON_STRING]; 170*15db2897SKrishnendu Sadhukhan - Sun Microsystems const char *reason = lt_stat_list_get_reason(list, i); 171*15db2897SKrishnendu Sadhukhan - Sun Microsystems uint64_t count = lt_stat_list_get_count(list, i); 172*15db2897SKrishnendu Sadhukhan - Sun Microsystems 173*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (count == 0) { 174*15db2897SKrishnendu Sadhukhan - Sun Microsystems continue; 175*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 176*15db2897SKrishnendu Sadhukhan - Sun Microsystems 177*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) snprintf(tmp, sizeof (tmp), "%s", reason); 178*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(window, i + begin_line, 0, "%s", tmp); 179*15db2897SKrishnendu Sadhukhan - Sun Microsystems 180*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) snprintf(tmp, sizeof (tmp), "%llu", count); 181*15db2897SKrishnendu Sadhukhan - Sun Microsystems fill_space_left(tmp, WIDTH_COUNT, sizeof (tmp)); 182*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(window, i + begin_line, BEGIN_COUNT, 183*15db2897SKrishnendu Sadhukhan - Sun Microsystems "%s", tmp); 184*15db2897SKrishnendu Sadhukhan - Sun Microsystems 185*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(window, i + begin_line, BEGIN_AVG, 186*15db2897SKrishnendu Sadhukhan - Sun Microsystems "%s", get_time_string( 187*15db2897SKrishnendu Sadhukhan - Sun Microsystems (double)lt_stat_list_get_sum(list, i) / count, 188*15db2897SKrishnendu Sadhukhan - Sun Microsystems tmp, sizeof (tmp), WIDTH_AVG)); 189*15db2897SKrishnendu Sadhukhan - Sun Microsystems 190*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(window, i + begin_line, BEGIN_MAX, 191*15db2897SKrishnendu Sadhukhan - Sun Microsystems "%s", get_time_string( 192*15db2897SKrishnendu Sadhukhan - Sun Microsystems (double)lt_stat_list_get_max(list, i), 193*15db2897SKrishnendu Sadhukhan - Sun Microsystems tmp, sizeof (tmp), WIDTH_MAX)); 194*15db2897SKrishnendu Sadhukhan - Sun Microsystems 195*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (LT_LIST_SPECIALS != current_list_type) { 196*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) snprintf(tmp, sizeof (tmp), "%.1f %%", 197*15db2897SKrishnendu Sadhukhan - Sun Microsystems (double)lt_stat_list_get_sum(list, i) 198*15db2897SKrishnendu Sadhukhan - Sun Microsystems / total * 100.0); 199*15db2897SKrishnendu Sadhukhan - Sun Microsystems } else { 200*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) snprintf(tmp, sizeof (tmp), "--- "); 201*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 202*15db2897SKrishnendu Sadhukhan - Sun Microsystems 203*15db2897SKrishnendu Sadhukhan - Sun Microsystems fill_space_left(tmp, WIDTH_PCT, sizeof (tmp)); 204*15db2897SKrishnendu Sadhukhan - Sun Microsystems 205*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(window, i + begin_line, BEGIN_PCT, 206*15db2897SKrishnendu Sadhukhan - Sun Microsystems "%s", tmp); 207*15db2897SKrishnendu Sadhukhan - Sun Microsystems i++; 208*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 209*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 210*15db2897SKrishnendu Sadhukhan - Sun Microsystems 211*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 212*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Print statistics in global pane. 213*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 214*15db2897SKrishnendu Sadhukhan - Sun Microsystems static void 215*15db2897SKrishnendu Sadhukhan - Sun Microsystems print_sysglobal(void) 216*15db2897SKrishnendu Sadhukhan - Sun Microsystems { 217*15db2897SKrishnendu Sadhukhan - Sun Microsystems void *list; 218*15db2897SKrishnendu Sadhukhan - Sun Microsystems char header[256]; 219*15db2897SKrishnendu Sadhukhan - Sun Microsystems 220*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (!display_initialized) { 221*15db2897SKrishnendu Sadhukhan - Sun Microsystems return; 222*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 223*15db2897SKrishnendu Sadhukhan - Sun Microsystems 224*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) werase(sysglobal_window); 225*15db2897SKrishnendu Sadhukhan - Sun Microsystems 226*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) wattron(sysglobal_window, A_REVERSE); 227*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) snprintf(header, sizeof (header), 228*15db2897SKrishnendu Sadhukhan - Sun Microsystems "%s", "System wide latencies"); 229*15db2897SKrishnendu Sadhukhan - Sun Microsystems fill_space_right(header, screen_width, sizeof (header)); 230*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(sysglobal_window, 0, 0, "%s", header); 231*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) wattroff(sysglobal_window, A_REVERSE); 232*15db2897SKrishnendu Sadhukhan - Sun Microsystems 233*15db2897SKrishnendu Sadhukhan - Sun Microsystems list = lt_stat_list_create(current_list_type, 234*15db2897SKrishnendu Sadhukhan - Sun Microsystems LT_LEVEL_GLOBAL, 0, 0, 10, sort_type); 235*15db2897SKrishnendu Sadhukhan - Sun Microsystems print_statistics(sysglobal_window, 1, 10, list); 236*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_stat_list_free(list); 237*15db2897SKrishnendu Sadhukhan - Sun Microsystems 238*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) wrefresh(sysglobal_window); 239*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 240*15db2897SKrishnendu Sadhukhan - Sun Microsystems 241*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 242*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Prints current operation mode. Mode is combination of: 243*15db2897SKrishnendu Sadhukhan - Sun Microsystems * 244*15db2897SKrishnendu Sadhukhan - Sun Microsystems * "Process or Thread", and "1 or 2 or 3". 245*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 246*15db2897SKrishnendu Sadhukhan - Sun Microsystems static void 247*15db2897SKrishnendu Sadhukhan - Sun Microsystems print_current_mode() 248*15db2897SKrishnendu Sadhukhan - Sun Microsystems { 249*15db2897SKrishnendu Sadhukhan - Sun Microsystems char type; 250*15db2897SKrishnendu Sadhukhan - Sun Microsystems 251*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (!display_initialized) { 252*15db2897SKrishnendu Sadhukhan - Sun Microsystems return; 253*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 254*15db2897SKrishnendu Sadhukhan - Sun Microsystems 255*15db2897SKrishnendu Sadhukhan - Sun Microsystems switch (current_list_type) { 256*15db2897SKrishnendu Sadhukhan - Sun Microsystems case LT_LIST_CAUSE: 257*15db2897SKrishnendu Sadhukhan - Sun Microsystems type = '1'; 258*15db2897SKrishnendu Sadhukhan - Sun Microsystems break; 259*15db2897SKrishnendu Sadhukhan - Sun Microsystems case LT_LIST_SPECIALS: 260*15db2897SKrishnendu Sadhukhan - Sun Microsystems type = '2'; 261*15db2897SKrishnendu Sadhukhan - Sun Microsystems break; 262*15db2897SKrishnendu Sadhukhan - Sun Microsystems case LT_LIST_SOBJ: 263*15db2897SKrishnendu Sadhukhan - Sun Microsystems type = '3'; 264*15db2897SKrishnendu Sadhukhan - Sun Microsystems break; 265*15db2897SKrishnendu Sadhukhan - Sun Microsystems default: 266*15db2897SKrishnendu Sadhukhan - Sun Microsystems type = '?'; 267*15db2897SKrishnendu Sadhukhan - Sun Microsystems break; 268*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 269*15db2897SKrishnendu Sadhukhan - Sun Microsystems 270*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(process_window, 0, screen_width - 8, "View: %c%c", 271*15db2897SKrishnendu Sadhukhan - Sun Microsystems type, thread_mode ? 'T' : 'P'); 272*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 273*15db2897SKrishnendu Sadhukhan - Sun Microsystems 274*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 275*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Print per-process statistics in process pane. 276*15db2897SKrishnendu Sadhukhan - Sun Microsystems * This is called when mode of operation is process. 277*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 278*15db2897SKrishnendu Sadhukhan - Sun Microsystems static void 279*15db2897SKrishnendu Sadhukhan - Sun Microsystems print_process(unsigned int pid) 280*15db2897SKrishnendu Sadhukhan - Sun Microsystems { 281*15db2897SKrishnendu Sadhukhan - Sun Microsystems void *list; 282*15db2897SKrishnendu Sadhukhan - Sun Microsystems char header[256]; 283*15db2897SKrishnendu Sadhukhan - Sun Microsystems char tmp[30]; 284*15db2897SKrishnendu Sadhukhan - Sun Microsystems 285*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (!display_initialized) { 286*15db2897SKrishnendu Sadhukhan - Sun Microsystems return; 287*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 288*15db2897SKrishnendu Sadhukhan - Sun Microsystems 289*15db2897SKrishnendu Sadhukhan - Sun Microsystems list = lt_stat_list_create(current_list_type, LT_LEVEL_PROCESS, 290*15db2897SKrishnendu Sadhukhan - Sun Microsystems pid, 0, 8, sort_type); 291*15db2897SKrishnendu Sadhukhan - Sun Microsystems 292*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) werase(process_window); 293*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) wattron(process_window, A_REVERSE); 294*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) snprintf(header, sizeof (header), "Process %s (%i), %d threads", 295*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_stat_proc_get_name(pid), pid, lt_stat_proc_get_nthreads(pid)); 296*15db2897SKrishnendu Sadhukhan - Sun Microsystems fill_space_right(header, screen_width, sizeof (header)); 297*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(process_window, 0, 0, "%s", header); 298*15db2897SKrishnendu Sadhukhan - Sun Microsystems 299*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (current_list_type != LT_LIST_SPECIALS) { 300*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(process_window, 0, 48, "Total: %s", 301*15db2897SKrishnendu Sadhukhan - Sun Microsystems get_time_string((double)lt_stat_list_get_gtotal(list), 302*15db2897SKrishnendu Sadhukhan - Sun Microsystems tmp, sizeof (tmp), 12)); 303*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 304*15db2897SKrishnendu Sadhukhan - Sun Microsystems 305*15db2897SKrishnendu Sadhukhan - Sun Microsystems print_current_mode(); 306*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) wattroff(process_window, A_REVERSE); 307*15db2897SKrishnendu Sadhukhan - Sun Microsystems print_statistics(process_window, 1, 8, list); 308*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_stat_list_free(list); 309*15db2897SKrishnendu Sadhukhan - Sun Microsystems 310*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) wrefresh(process_window); 311*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 312*15db2897SKrishnendu Sadhukhan - Sun Microsystems 313*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 314*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Display the list of processes that are tracked, in task bar. 315*15db2897SKrishnendu Sadhukhan - Sun Microsystems * This one is called when mode of operation is process. 316*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 317*15db2897SKrishnendu Sadhukhan - Sun Microsystems static void 318*15db2897SKrishnendu Sadhukhan - Sun Microsystems print_taskbar_process(pid_t *pidlist, int pidlist_len, int pidlist_index) 319*15db2897SKrishnendu Sadhukhan - Sun Microsystems { 320*15db2897SKrishnendu Sadhukhan - Sun Microsystems const int ITEM_WIDTH = 8; 321*15db2897SKrishnendu Sadhukhan - Sun Microsystems 322*15db2897SKrishnendu Sadhukhan - Sun Microsystems int number_item; 323*15db2897SKrishnendu Sadhukhan - Sun Microsystems int i; 324*15db2897SKrishnendu Sadhukhan - Sun Microsystems int xpos = 0; 325*15db2897SKrishnendu Sadhukhan - Sun Microsystems 326*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (!display_initialized) { 327*15db2897SKrishnendu Sadhukhan - Sun Microsystems return; 328*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 329*15db2897SKrishnendu Sadhukhan - Sun Microsystems 330*15db2897SKrishnendu Sadhukhan - Sun Microsystems number_item = (screen_width / ITEM_WIDTH) - 1; 331*15db2897SKrishnendu Sadhukhan - Sun Microsystems i = pidlist_index - (pidlist_index % number_item); 332*15db2897SKrishnendu Sadhukhan - Sun Microsystems 333*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) werase(taskbar); 334*15db2897SKrishnendu Sadhukhan - Sun Microsystems 335*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (i != 0) { 336*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(taskbar, 0, xpos, "<-"); 337*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 338*15db2897SKrishnendu Sadhukhan - Sun Microsystems 339*15db2897SKrishnendu Sadhukhan - Sun Microsystems xpos = ITEM_WIDTH / 2; 340*15db2897SKrishnendu Sadhukhan - Sun Microsystems 341*15db2897SKrishnendu Sadhukhan - Sun Microsystems while (xpos + ITEM_WIDTH <= screen_width && i < pidlist_len) { 342*15db2897SKrishnendu Sadhukhan - Sun Microsystems char str[ITEM_WIDTH+1]; 343*15db2897SKrishnendu Sadhukhan - Sun Microsystems int slen; 344*15db2897SKrishnendu Sadhukhan - Sun Microsystems const char *pname = lt_stat_proc_get_name(pidlist[i]); 345*15db2897SKrishnendu Sadhukhan - Sun Microsystems 346*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (pname && pname[0]) { 347*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) snprintf(str, sizeof (str) - 1, "%s", pname); 348*15db2897SKrishnendu Sadhukhan - Sun Microsystems } else { 349*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) snprintf(str, sizeof (str) - 1, 350*15db2897SKrishnendu Sadhukhan - Sun Microsystems "<%d>", pidlist[i]); 351*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 352*15db2897SKrishnendu Sadhukhan - Sun Microsystems 353*15db2897SKrishnendu Sadhukhan - Sun Microsystems slen = strlen(str); 354*15db2897SKrishnendu Sadhukhan - Sun Microsystems 355*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (slen < ITEM_WIDTH) { 356*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) memset(&str[slen], ' ', ITEM_WIDTH - slen); 357*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 358*15db2897SKrishnendu Sadhukhan - Sun Microsystems 359*15db2897SKrishnendu Sadhukhan - Sun Microsystems str[sizeof (str) - 1] = '\0'; 360*15db2897SKrishnendu Sadhukhan - Sun Microsystems 361*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (i == pidlist_index) { 362*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) wattron(taskbar, A_REVERSE); 363*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 364*15db2897SKrishnendu Sadhukhan - Sun Microsystems 365*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(taskbar, 0, xpos, "%s", str); 366*15db2897SKrishnendu Sadhukhan - Sun Microsystems 367*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (i == pidlist_index) { 368*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) wattroff(taskbar, A_REVERSE); 369*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 370*15db2897SKrishnendu Sadhukhan - Sun Microsystems 371*15db2897SKrishnendu Sadhukhan - Sun Microsystems xpos += ITEM_WIDTH; 372*15db2897SKrishnendu Sadhukhan - Sun Microsystems i++; 373*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 374*15db2897SKrishnendu Sadhukhan - Sun Microsystems 375*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (i != pidlist_len) { 376*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(taskbar, 0, screen_width - 2, "->"); 377*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 378*15db2897SKrishnendu Sadhukhan - Sun Microsystems 379*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) wrefresh(taskbar); 380*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 381*15db2897SKrishnendu Sadhukhan - Sun Microsystems 382*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 383*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Display the list of processes that are tracked, in task bar. 384*15db2897SKrishnendu Sadhukhan - Sun Microsystems * This one is called when mode of operation is thread. 385*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 386*15db2897SKrishnendu Sadhukhan - Sun Microsystems static void 387*15db2897SKrishnendu Sadhukhan - Sun Microsystems print_taskbar_thread(pid_t *pidlist, id_t *tidlist, int list_len, 388*15db2897SKrishnendu Sadhukhan - Sun Microsystems int list_index) 389*15db2897SKrishnendu Sadhukhan - Sun Microsystems { 390*15db2897SKrishnendu Sadhukhan - Sun Microsystems const int ITEM_WIDTH = 12; 391*15db2897SKrishnendu Sadhukhan - Sun Microsystems 392*15db2897SKrishnendu Sadhukhan - Sun Microsystems int number_item; 393*15db2897SKrishnendu Sadhukhan - Sun Microsystems int i; 394*15db2897SKrishnendu Sadhukhan - Sun Microsystems int xpos = 0; 395*15db2897SKrishnendu Sadhukhan - Sun Microsystems const char *pname = NULL; 396*15db2897SKrishnendu Sadhukhan - Sun Microsystems pid_t last_pid = INVALID_PID; 397*15db2897SKrishnendu Sadhukhan - Sun Microsystems 398*15db2897SKrishnendu Sadhukhan - Sun Microsystems 399*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (!display_initialized) { 400*15db2897SKrishnendu Sadhukhan - Sun Microsystems return; 401*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 402*15db2897SKrishnendu Sadhukhan - Sun Microsystems 403*15db2897SKrishnendu Sadhukhan - Sun Microsystems number_item = (screen_width - 8) / ITEM_WIDTH; 404*15db2897SKrishnendu Sadhukhan - Sun Microsystems i = list_index - (list_index % number_item); 405*15db2897SKrishnendu Sadhukhan - Sun Microsystems 406*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) werase(taskbar); 407*15db2897SKrishnendu Sadhukhan - Sun Microsystems 408*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (i != 0) { 409*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(taskbar, 0, xpos, "<-"); 410*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 411*15db2897SKrishnendu Sadhukhan - Sun Microsystems 412*15db2897SKrishnendu Sadhukhan - Sun Microsystems xpos = 4; 413*15db2897SKrishnendu Sadhukhan - Sun Microsystems 414*15db2897SKrishnendu Sadhukhan - Sun Microsystems while (xpos + ITEM_WIDTH <= screen_width && i < list_len) { 415*15db2897SKrishnendu Sadhukhan - Sun Microsystems char str[ITEM_WIDTH+1]; 416*15db2897SKrishnendu Sadhukhan - Sun Microsystems int slen, tlen; 417*15db2897SKrishnendu Sadhukhan - Sun Microsystems 418*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (pidlist[i] != last_pid) { 419*15db2897SKrishnendu Sadhukhan - Sun Microsystems pname = lt_stat_proc_get_name(pidlist[i]); 420*15db2897SKrishnendu Sadhukhan - Sun Microsystems last_pid = pidlist[i]; 421*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 422*15db2897SKrishnendu Sadhukhan - Sun Microsystems 423*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 424*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Calculate length of thread's ID; use shorter process name 425*15db2897SKrishnendu Sadhukhan - Sun Microsystems * in order to save space on the screen. 426*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 427*15db2897SKrishnendu Sadhukhan - Sun Microsystems tlen = snprintf(NULL, 0, "_%d", tidlist[i]); 428*15db2897SKrishnendu Sadhukhan - Sun Microsystems 429*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (pname && pname[0]) { 430*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) snprintf(str, sizeof (str) - tlen - 1, 431*15db2897SKrishnendu Sadhukhan - Sun Microsystems "%s", pname); 432*15db2897SKrishnendu Sadhukhan - Sun Microsystems } else { 433*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) snprintf(str, sizeof (str) - tlen - 1, 434*15db2897SKrishnendu Sadhukhan - Sun Microsystems "<%d>", pidlist[i]); 435*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 436*15db2897SKrishnendu Sadhukhan - Sun Microsystems 437*15db2897SKrishnendu Sadhukhan - Sun Microsystems slen = strlen(str); 438*15db2897SKrishnendu Sadhukhan - Sun Microsystems 439*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) snprintf(&str[slen], sizeof (str) - slen, 440*15db2897SKrishnendu Sadhukhan - Sun Microsystems "_%d", tidlist[i]); 441*15db2897SKrishnendu Sadhukhan - Sun Microsystems 442*15db2897SKrishnendu Sadhukhan - Sun Microsystems slen += tlen; 443*15db2897SKrishnendu Sadhukhan - Sun Microsystems 444*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (slen < ITEM_WIDTH) { 445*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) memset(&str[slen], ' ', ITEM_WIDTH - slen); 446*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 447*15db2897SKrishnendu Sadhukhan - Sun Microsystems 448*15db2897SKrishnendu Sadhukhan - Sun Microsystems str[sizeof (str) - 1] = '\0'; 449*15db2897SKrishnendu Sadhukhan - Sun Microsystems 450*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (i == list_index) { 451*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) wattron(taskbar, A_REVERSE); 452*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 453*15db2897SKrishnendu Sadhukhan - Sun Microsystems 454*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(taskbar, 0, xpos, "%s", str); 455*15db2897SKrishnendu Sadhukhan - Sun Microsystems 456*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (i == list_index) { 457*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) wattroff(taskbar, A_REVERSE); 458*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 459*15db2897SKrishnendu Sadhukhan - Sun Microsystems 460*15db2897SKrishnendu Sadhukhan - Sun Microsystems xpos += ITEM_WIDTH; 461*15db2897SKrishnendu Sadhukhan - Sun Microsystems i++; 462*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 463*15db2897SKrishnendu Sadhukhan - Sun Microsystems 464*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (i != list_len) { 465*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(taskbar, 0, screen_width - 2, "->"); 466*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 467*15db2897SKrishnendu Sadhukhan - Sun Microsystems 468*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) wrefresh(taskbar); 469*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 470*15db2897SKrishnendu Sadhukhan - Sun Microsystems 471*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 472*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Print per-thread statistics in process pane. 473*15db2897SKrishnendu Sadhukhan - Sun Microsystems * This is called when mode of operation is thread. 474*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 475*15db2897SKrishnendu Sadhukhan - Sun Microsystems static void 476*15db2897SKrishnendu Sadhukhan - Sun Microsystems print_thread(pid_t pid, id_t tid) 477*15db2897SKrishnendu Sadhukhan - Sun Microsystems { 478*15db2897SKrishnendu Sadhukhan - Sun Microsystems void *list; 479*15db2897SKrishnendu Sadhukhan - Sun Microsystems char header[256]; 480*15db2897SKrishnendu Sadhukhan - Sun Microsystems char tmp[30]; 481*15db2897SKrishnendu Sadhukhan - Sun Microsystems 482*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (!display_initialized) { 483*15db2897SKrishnendu Sadhukhan - Sun Microsystems return; 484*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 485*15db2897SKrishnendu Sadhukhan - Sun Microsystems 486*15db2897SKrishnendu Sadhukhan - Sun Microsystems list = lt_stat_list_create(current_list_type, LT_LEVEL_THREAD, 487*15db2897SKrishnendu Sadhukhan - Sun Microsystems pid, tid, 8, sort_type); 488*15db2897SKrishnendu Sadhukhan - Sun Microsystems 489*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) werase(process_window); 490*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) wattron(process_window, A_REVERSE); 491*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) snprintf(header, sizeof (header), 492*15db2897SKrishnendu Sadhukhan - Sun Microsystems "Process %s (%i), LWP %d", 493*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_stat_proc_get_name(pid), pid, tid); 494*15db2897SKrishnendu Sadhukhan - Sun Microsystems fill_space_right(header, screen_width, sizeof (header)); 495*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(process_window, 0, 0, "%s", header); 496*15db2897SKrishnendu Sadhukhan - Sun Microsystems 497*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (current_list_type != LT_LIST_SPECIALS) { 498*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(process_window, 0, 48, "Total: %s", 499*15db2897SKrishnendu Sadhukhan - Sun Microsystems get_time_string( 500*15db2897SKrishnendu Sadhukhan - Sun Microsystems (double)lt_stat_list_get_gtotal(list), 501*15db2897SKrishnendu Sadhukhan - Sun Microsystems tmp, sizeof (tmp), 12)); 502*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 503*15db2897SKrishnendu Sadhukhan - Sun Microsystems 504*15db2897SKrishnendu Sadhukhan - Sun Microsystems print_current_mode(); 505*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) wattroff(process_window, A_REVERSE); 506*15db2897SKrishnendu Sadhukhan - Sun Microsystems print_statistics(process_window, 1, 8, list); 507*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_stat_list_free(list); 508*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) wrefresh(process_window); 509*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 510*15db2897SKrishnendu Sadhukhan - Sun Microsystems 511*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 512*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Update hint string at the bottom line. The message to print is stored in 513*15db2897SKrishnendu Sadhukhan - Sun Microsystems * hint. If hint is NULL, the function will display its own message. 514*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 515*15db2897SKrishnendu Sadhukhan - Sun Microsystems static void 516*15db2897SKrishnendu Sadhukhan - Sun Microsystems print_hint(const char *hint) 517*15db2897SKrishnendu Sadhukhan - Sun Microsystems { 518*15db2897SKrishnendu Sadhukhan - Sun Microsystems const char *HINTS[] = { 519*15db2897SKrishnendu Sadhukhan - Sun Microsystems "Press '<' or '>' to switch between processes.", 520*15db2897SKrishnendu Sadhukhan - Sun Microsystems "Press 'q' to exit.", 521*15db2897SKrishnendu Sadhukhan - Sun Microsystems "Press 'r' to refresh immediately.", 522*15db2897SKrishnendu Sadhukhan - Sun Microsystems "Press 't' to toggle Process/Thread display mode.", 523*15db2897SKrishnendu Sadhukhan - Sun Microsystems "Press 'h' for help.", 524*15db2897SKrishnendu Sadhukhan - Sun Microsystems "Use 'c', 'a', 'm', 'p' to change sort criteria." 525*15db2897SKrishnendu Sadhukhan - Sun Microsystems "Use '1', '2', '3' to switch between windows." 526*15db2897SKrishnendu Sadhukhan - Sun Microsystems }; 527*15db2897SKrishnendu Sadhukhan - Sun Microsystems const uint64_t update_interval = 5000; /* 5 seconds */ 528*15db2897SKrishnendu Sadhukhan - Sun Microsystems 529*15db2897SKrishnendu Sadhukhan - Sun Microsystems static int index = 0; 530*15db2897SKrishnendu Sadhukhan - Sun Microsystems static uint64_t next_hint = 0; 531*15db2897SKrishnendu Sadhukhan - Sun Microsystems uint64_t now = lt_millisecond(); 532*15db2897SKrishnendu Sadhukhan - Sun Microsystems 533*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (!display_initialized) { 534*15db2897SKrishnendu Sadhukhan - Sun Microsystems return; 535*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 536*15db2897SKrishnendu Sadhukhan - Sun Microsystems 537*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (hint == NULL) { 538*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (now < next_hint) { 539*15db2897SKrishnendu Sadhukhan - Sun Microsystems return; 540*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 541*15db2897SKrishnendu Sadhukhan - Sun Microsystems 542*15db2897SKrishnendu Sadhukhan - Sun Microsystems hint = HINTS[index]; 543*15db2897SKrishnendu Sadhukhan - Sun Microsystems index = (index + 1) % (sizeof (HINTS) / sizeof (HINTS[0])); 544*15db2897SKrishnendu Sadhukhan - Sun Microsystems next_hint = now + update_interval; 545*15db2897SKrishnendu Sadhukhan - Sun Microsystems } else { 546*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 547*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Important messages are displayed at least every 2 cycles. 548*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 549*15db2897SKrishnendu Sadhukhan - Sun Microsystems next_hint = now + update_interval * 2; 550*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 551*15db2897SKrishnendu Sadhukhan - Sun Microsystems 552*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) werase(hintbar); 553*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(hintbar, 0, (screen_width - strlen(hint)) / 2, 554*15db2897SKrishnendu Sadhukhan - Sun Microsystems "%s", hint); 555*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) wrefresh(hintbar); 556*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 557*15db2897SKrishnendu Sadhukhan - Sun Microsystems 558*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 559*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Create a PID list or a PID/TID list (if operation mode is thread) from 560*15db2897SKrishnendu Sadhukhan - Sun Microsystems * available statistics. 561*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 562*15db2897SKrishnendu Sadhukhan - Sun Microsystems static void 563*15db2897SKrishnendu Sadhukhan - Sun Microsystems get_plist(pid_t **plist, id_t **tlist, int *list_len, int *list_index) 564*15db2897SKrishnendu Sadhukhan - Sun Microsystems { 565*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (!thread_mode) { 566*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* Per-process mode */ 567*15db2897SKrishnendu Sadhukhan - Sun Microsystems *list_len = lt_stat_proc_list_create(plist, NULL); 568*15db2897SKrishnendu Sadhukhan - Sun Microsystems 569*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* Search for previously selected PID */ 570*15db2897SKrishnendu Sadhukhan - Sun Microsystems for (*list_index = 0; *list_index < *list_len && 571*15db2897SKrishnendu Sadhukhan - Sun Microsystems (*plist)[*list_index] != selected_pid; 572*15db2897SKrishnendu Sadhukhan - Sun Microsystems ++*list_index) { 573*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 574*15db2897SKrishnendu Sadhukhan - Sun Microsystems 575*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (*list_index >= *list_len) { 576*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 577*15db2897SKrishnendu Sadhukhan - Sun Microsystems * The previously selected pid is gone. 578*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Select the first one. 579*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 580*15db2897SKrishnendu Sadhukhan - Sun Microsystems *list_index = 0; 581*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 582*15db2897SKrishnendu Sadhukhan - Sun Microsystems } else { 583*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* Per-thread mode */ 584*15db2897SKrishnendu Sadhukhan - Sun Microsystems *list_len = lt_stat_proc_list_create(plist, tlist); 585*15db2897SKrishnendu Sadhukhan - Sun Microsystems 586*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* Search for previously selected PID & TID */ 587*15db2897SKrishnendu Sadhukhan - Sun Microsystems for (*list_index = 0; *list_index < *list_len; 588*15db2897SKrishnendu Sadhukhan - Sun Microsystems ++*list_index) { 589*15db2897SKrishnendu Sadhukhan - Sun Microsystems if ((*plist)[*list_index] == selected_pid && 590*15db2897SKrishnendu Sadhukhan - Sun Microsystems (*tlist)[*list_index] == selected_tid) { 591*15db2897SKrishnendu Sadhukhan - Sun Microsystems break; 592*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 593*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 594*15db2897SKrishnendu Sadhukhan - Sun Microsystems 595*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (*list_index >= *list_len) { 596*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 597*15db2897SKrishnendu Sadhukhan - Sun Microsystems * The previously selected pid/tid is gone. 598*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Select the first one. 599*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 600*15db2897SKrishnendu Sadhukhan - Sun Microsystems for (*list_index = 0; 601*15db2897SKrishnendu Sadhukhan - Sun Microsystems *list_index < *list_len && 602*15db2897SKrishnendu Sadhukhan - Sun Microsystems (*plist)[*list_index] != selected_pid; 603*15db2897SKrishnendu Sadhukhan - Sun Microsystems ++*list_index) { 604*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 605*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 606*15db2897SKrishnendu Sadhukhan - Sun Microsystems 607*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (*list_index >= *list_len) { 608*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 609*15db2897SKrishnendu Sadhukhan - Sun Microsystems * The previously selected pid is gone. 610*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Select the first one 611*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 612*15db2897SKrishnendu Sadhukhan - Sun Microsystems *list_index = 0; 613*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 614*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 615*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 616*15db2897SKrishnendu Sadhukhan - Sun Microsystems 617*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* Print help message when user presses 'h' hot key */ 618*15db2897SKrishnendu Sadhukhan - Sun Microsystems static void 619*15db2897SKrishnendu Sadhukhan - Sun Microsystems print_help(void) 620*15db2897SKrishnendu Sadhukhan - Sun Microsystems { 621*15db2897SKrishnendu Sadhukhan - Sun Microsystems const char *HELP[] = { 622*15db2897SKrishnendu Sadhukhan - Sun Microsystems TITLE, 623*15db2897SKrishnendu Sadhukhan - Sun Microsystems COPYRIGHT, 624*15db2897SKrishnendu Sadhukhan - Sun Microsystems "", 625*15db2897SKrishnendu Sadhukhan - Sun Microsystems "These single-character commands are available:", 626*15db2897SKrishnendu Sadhukhan - Sun Microsystems "< - Move to previous process/thread.", 627*15db2897SKrishnendu Sadhukhan - Sun Microsystems "> - Move to next process/thread.", 628*15db2897SKrishnendu Sadhukhan - Sun Microsystems "q - Exit.", 629*15db2897SKrishnendu Sadhukhan - Sun Microsystems "r - Refresh.", 630*15db2897SKrishnendu Sadhukhan - Sun Microsystems "t - Toggle process/thread mode.", 631*15db2897SKrishnendu Sadhukhan - Sun Microsystems "c - Sort by count.", 632*15db2897SKrishnendu Sadhukhan - Sun Microsystems "a - Sort by average.", 633*15db2897SKrishnendu Sadhukhan - Sun Microsystems "m - Sort by maximum.", 634*15db2897SKrishnendu Sadhukhan - Sun Microsystems "p - Sort by percent.", 635*15db2897SKrishnendu Sadhukhan - Sun Microsystems "1 - Show list by causes.", 636*15db2897SKrishnendu Sadhukhan - Sun Microsystems "2 - Show list of special entries.", 637*15db2897SKrishnendu Sadhukhan - Sun Microsystems "3 - Show list by synchronization objects.", 638*15db2897SKrishnendu Sadhukhan - Sun Microsystems "h - Show this help.", 639*15db2897SKrishnendu Sadhukhan - Sun Microsystems "", 640*15db2897SKrishnendu Sadhukhan - Sun Microsystems "Press any key to continue..." 641*15db2897SKrishnendu Sadhukhan - Sun Microsystems }; 642*15db2897SKrishnendu Sadhukhan - Sun Microsystems int i; 643*15db2897SKrishnendu Sadhukhan - Sun Microsystems 644*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (!display_initialized) { 645*15db2897SKrishnendu Sadhukhan - Sun Microsystems return; 646*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 647*15db2897SKrishnendu Sadhukhan - Sun Microsystems 648*15db2897SKrishnendu Sadhukhan - Sun Microsystems for (i = 0; i < sizeof (HELP) / sizeof (HELP[0]); ++i) { 649*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(stdscr, i, 0, "%s", HELP[i]); 650*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 651*15db2897SKrishnendu Sadhukhan - Sun Microsystems 652*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) refresh(); 653*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 654*15db2897SKrishnendu Sadhukhan - Sun Microsystems 655*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 656*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Print title on screen 657*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 658*15db2897SKrishnendu Sadhukhan - Sun Microsystems static void 659*15db2897SKrishnendu Sadhukhan - Sun Microsystems print_title(void) 660*15db2897SKrishnendu Sadhukhan - Sun Microsystems { 661*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (!display_initialized) { 662*15db2897SKrishnendu Sadhukhan - Sun Microsystems return; 663*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 664*15db2897SKrishnendu Sadhukhan - Sun Microsystems 665*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) wattrset(titlebar, COLOR_PAIR(LT_COLOR_HEADER)); 666*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) wbkgd(titlebar, COLOR_PAIR(LT_COLOR_HEADER)); 667*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) werase(titlebar); 668*15db2897SKrishnendu Sadhukhan - Sun Microsystems 669*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(titlebar, 0, (screen_width - strlen(TITLE)) / 2, 670*15db2897SKrishnendu Sadhukhan - Sun Microsystems "%s", TITLE); 671*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) wrefresh(titlebar); 672*15db2897SKrishnendu Sadhukhan - Sun Microsystems 673*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) werase(captionbar); 674*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(captionbar, 0, 0, "%s", 675*15db2897SKrishnendu Sadhukhan - Sun Microsystems " Cause " 676*15db2897SKrishnendu Sadhukhan - Sun Microsystems "Count Average Maximum Percent"); 677*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) wrefresh(captionbar); 678*15db2897SKrishnendu Sadhukhan - Sun Microsystems 679*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) wattrset(hintbar, COLOR_PAIR(LT_COLOR_HEADER)); 680*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) wbkgd(hintbar, COLOR_PAIR(LT_COLOR_HEADER)); 681*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 682*15db2897SKrishnendu Sadhukhan - Sun Microsystems 683*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 684*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Handle signal from terminal resize 685*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 686*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* ARGSUSED */ 687*15db2897SKrishnendu Sadhukhan - Sun Microsystems static void 688*15db2897SKrishnendu Sadhukhan - Sun Microsystems on_resize(int sig) 689*15db2897SKrishnendu Sadhukhan - Sun Microsystems { 690*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_gpipe_break("r"); 691*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 692*15db2897SKrishnendu Sadhukhan - Sun Microsystems 693*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 694*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Initialize display. Display will be cleared when this function returns. 695*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 696*15db2897SKrishnendu Sadhukhan - Sun Microsystems void 697*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_init(void) 698*15db2897SKrishnendu Sadhukhan - Sun Microsystems { 699*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (display_initialized) { 700*15db2897SKrishnendu Sadhukhan - Sun Microsystems return; 701*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 702*15db2897SKrishnendu Sadhukhan - Sun Microsystems 703*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* Window resize signal */ 704*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) signal(SIGWINCH, on_resize); 705*15db2897SKrishnendu Sadhukhan - Sun Microsystems 706*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* Initialize curses library */ 707*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) initscr(); 708*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) start_color(); 709*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) keypad(stdscr, TRUE); 710*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) nonl(); 711*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) cbreak(); 712*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) noecho(); 713*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) curs_set(0); 714*15db2897SKrishnendu Sadhukhan - Sun Microsystems 715*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* Set up color pairs */ 716*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) init_pair(LT_COLOR_DEFAULT, COLOR_WHITE, COLOR_BLACK); 717*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) init_pair(LT_COLOR_HEADER, COLOR_BLACK, COLOR_WHITE); 718*15db2897SKrishnendu Sadhukhan - Sun Microsystems 719*15db2897SKrishnendu Sadhukhan - Sun Microsystems curses_inited = TRUE; 720*15db2897SKrishnendu Sadhukhan - Sun Microsystems getmaxyx(stdscr, screen_height, screen_width); 721*15db2897SKrishnendu Sadhukhan - Sun Microsystems 722*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (screen_width < LT_WINDOW_X || screen_height < LT_WINDOW_Y) { 723*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(stdscr, 0, 0, "Terminal size is too small."); 724*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(stdscr, 1, 0, 725*15db2897SKrishnendu Sadhukhan - Sun Microsystems "Please resize it to 80x24 or larger."); 726*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(stdscr, 2, 0, "Press q to quit."); 727*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) refresh(); 728*15db2897SKrishnendu Sadhukhan - Sun Microsystems return; 729*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 730*15db2897SKrishnendu Sadhukhan - Sun Microsystems 731*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* Set up all window panes */ 732*15db2897SKrishnendu Sadhukhan - Sun Microsystems titlebar = subwin(stdscr, 1, screen_width, 0, 0); 733*15db2897SKrishnendu Sadhukhan - Sun Microsystems captionbar = subwin(stdscr, 1, screen_width, 1, 0); 734*15db2897SKrishnendu Sadhukhan - Sun Microsystems sysglobal_window = subwin(stdscr, screen_height / 2 - 1, 735*15db2897SKrishnendu Sadhukhan - Sun Microsystems screen_width, 2, 0); 736*15db2897SKrishnendu Sadhukhan - Sun Microsystems process_window = subwin(stdscr, screen_height / 2 - 3, 737*15db2897SKrishnendu Sadhukhan - Sun Microsystems screen_width, screen_height / 2 + 1, 0); 738*15db2897SKrishnendu Sadhukhan - Sun Microsystems taskbar = subwin(stdscr, 1, screen_width, screen_height - 2, 0); 739*15db2897SKrishnendu Sadhukhan - Sun Microsystems hintbar = subwin(stdscr, 1, screen_width, screen_height - 1, 0); 740*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) werase(stdscr); 741*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) refresh(); 742*15db2897SKrishnendu Sadhukhan - Sun Microsystems 743*15db2897SKrishnendu Sadhukhan - Sun Microsystems display_initialized = TRUE; 744*15db2897SKrishnendu Sadhukhan - Sun Microsystems 745*15db2897SKrishnendu Sadhukhan - Sun Microsystems print_title(); 746*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 747*15db2897SKrishnendu Sadhukhan - Sun Microsystems 748*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 749*15db2897SKrishnendu Sadhukhan - Sun Microsystems * The event loop for display. It displays data on screen and handles hotkey 750*15db2897SKrishnendu Sadhukhan - Sun Microsystems * presses. 751*15db2897SKrishnendu Sadhukhan - Sun Microsystems * 752*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Parameter : 753*15db2897SKrishnendu Sadhukhan - Sun Microsystems * duration - returns after 'duration' 754*15db2897SKrishnendu Sadhukhan - Sun Microsystems * 755*15db2897SKrishnendu Sadhukhan - Sun Microsystems * The function also returns if user presses 'q', 'Ctrl+C' or 'r'. 756*15db2897SKrishnendu Sadhukhan - Sun Microsystems * 757*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Return value: 758*15db2897SKrishnendu Sadhukhan - Sun Microsystems * 0 - main() exits 759*15db2897SKrishnendu Sadhukhan - Sun Microsystems * 1 - main() calls it again 760*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 761*15db2897SKrishnendu Sadhukhan - Sun Microsystems int 762*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_loop(int duration) 763*15db2897SKrishnendu Sadhukhan - Sun Microsystems { 764*15db2897SKrishnendu Sadhukhan - Sun Microsystems uint64_t start; 765*15db2897SKrishnendu Sadhukhan - Sun Microsystems int remaining; 766*15db2897SKrishnendu Sadhukhan - Sun Microsystems struct timeval timeout; 767*15db2897SKrishnendu Sadhukhan - Sun Microsystems fd_set read_fd; 768*15db2897SKrishnendu Sadhukhan - Sun Microsystems int need_refresh = TRUE; 769*15db2897SKrishnendu Sadhukhan - Sun Microsystems pid_t *plist = NULL; 770*15db2897SKrishnendu Sadhukhan - Sun Microsystems id_t *tlist = NULL; 771*15db2897SKrishnendu Sadhukhan - Sun Microsystems int list_len = 0; 772*15db2897SKrishnendu Sadhukhan - Sun Microsystems int list_index = 0; 773*15db2897SKrishnendu Sadhukhan - Sun Microsystems int retval = 1; 774*15db2897SKrishnendu Sadhukhan - Sun Microsystems int next_snap; 775*15db2897SKrishnendu Sadhukhan - Sun Microsystems int gpipe; 776*15db2897SKrishnendu Sadhukhan - Sun Microsystems 777*15db2897SKrishnendu Sadhukhan - Sun Microsystems start = lt_millisecond(); 778*15db2897SKrishnendu Sadhukhan - Sun Microsystems gpipe = lt_gpipe_readfd(); 779*15db2897SKrishnendu Sadhukhan - Sun Microsystems 780*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (!show_help) { 781*15db2897SKrishnendu Sadhukhan - Sun Microsystems print_hint(NULL); 782*15db2897SKrishnendu Sadhukhan - Sun Microsystems print_sysglobal(); 783*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 784*15db2897SKrishnendu Sadhukhan - Sun Microsystems 785*15db2897SKrishnendu Sadhukhan - Sun Microsystems get_plist(&plist, &tlist, &list_len, &list_index); 786*15db2897SKrishnendu Sadhukhan - Sun Microsystems 787*15db2897SKrishnendu Sadhukhan - Sun Microsystems for (;;) { 788*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (list_len != 0 && need_refresh && !show_help) { 789*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (!thread_mode) { 790*15db2897SKrishnendu Sadhukhan - Sun Microsystems print_taskbar_process(plist, list_len, 791*15db2897SKrishnendu Sadhukhan - Sun Microsystems list_index); 792*15db2897SKrishnendu Sadhukhan - Sun Microsystems print_process(plist[list_index]); 793*15db2897SKrishnendu Sadhukhan - Sun Microsystems } else { 794*15db2897SKrishnendu Sadhukhan - Sun Microsystems print_taskbar_thread(plist, tlist, 795*15db2897SKrishnendu Sadhukhan - Sun Microsystems list_len, list_index); 796*15db2897SKrishnendu Sadhukhan - Sun Microsystems print_thread(plist[list_index], 797*15db2897SKrishnendu Sadhukhan - Sun Microsystems tlist[list_index]); 798*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 799*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 800*15db2897SKrishnendu Sadhukhan - Sun Microsystems 801*15db2897SKrishnendu Sadhukhan - Sun Microsystems need_refresh = TRUE; /* Usually we need refresh. */ 802*15db2897SKrishnendu Sadhukhan - Sun Microsystems remaining = duration - (int)(lt_millisecond() - start); 803*15db2897SKrishnendu Sadhukhan - Sun Microsystems 804*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (remaining <= 0) { 805*15db2897SKrishnendu Sadhukhan - Sun Microsystems break; 806*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 807*15db2897SKrishnendu Sadhukhan - Sun Microsystems 808*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* Embedded dtrace snap action here. */ 809*15db2897SKrishnendu Sadhukhan - Sun Microsystems next_snap = lt_dtrace_work(0); 810*15db2897SKrishnendu Sadhukhan - Sun Microsystems 811*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (next_snap == 0) { 812*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 813*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Just did a snap, check time for the next one. 814*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 815*15db2897SKrishnendu Sadhukhan - Sun Microsystems next_snap = lt_dtrace_work(0); 816*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 817*15db2897SKrishnendu Sadhukhan - Sun Microsystems 818*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (next_snap > 0 && remaining > next_snap) { 819*15db2897SKrishnendu Sadhukhan - Sun Microsystems remaining = next_snap; 820*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 821*15db2897SKrishnendu Sadhukhan - Sun Microsystems 822*15db2897SKrishnendu Sadhukhan - Sun Microsystems timeout.tv_sec = remaining / 1000; 823*15db2897SKrishnendu Sadhukhan - Sun Microsystems timeout.tv_usec = (remaining % 1000) * 1000; 824*15db2897SKrishnendu Sadhukhan - Sun Microsystems 825*15db2897SKrishnendu Sadhukhan - Sun Microsystems FD_ZERO(&read_fd); 826*15db2897SKrishnendu Sadhukhan - Sun Microsystems FD_SET(0, &read_fd); 827*15db2897SKrishnendu Sadhukhan - Sun Microsystems FD_SET(gpipe, &read_fd); 828*15db2897SKrishnendu Sadhukhan - Sun Microsystems 829*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* Wait for keyboard input, or signal from gpipe */ 830*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (select(gpipe + 1, &read_fd, NULL, NULL, &timeout) > 0) { 831*15db2897SKrishnendu Sadhukhan - Sun Microsystems int k = 0; 832*15db2897SKrishnendu Sadhukhan - Sun Microsystems 833*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (FD_ISSET(gpipe, &read_fd)) { 834*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* Data from pipe has priority */ 835*15db2897SKrishnendu Sadhukhan - Sun Microsystems char ch; 836*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) read(gpipe, &ch, 1); 837*15db2897SKrishnendu Sadhukhan - Sun Microsystems k = ch; /* Need this for big-endianness */ 838*15db2897SKrishnendu Sadhukhan - Sun Microsystems } else { 839*15db2897SKrishnendu Sadhukhan - Sun Microsystems k = getch(); 840*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 841*15db2897SKrishnendu Sadhukhan - Sun Microsystems 842*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 843*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Check if we need to update the hint line whenever we 844*15db2897SKrishnendu Sadhukhan - Sun Microsystems * get a chance. 845*15db2897SKrishnendu Sadhukhan - Sun Microsystems * NOTE: current implementation depends on 846*15db2897SKrishnendu Sadhukhan - Sun Microsystems * g_config.lt_cfg_snap_interval, but it's OK because it 847*15db2897SKrishnendu Sadhukhan - Sun Microsystems * doesn't have to be precise. 848*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 849*15db2897SKrishnendu Sadhukhan - Sun Microsystems print_hint(NULL); 850*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 851*15db2897SKrishnendu Sadhukhan - Sun Microsystems * If help is on display right now, and a key press 852*15db2897SKrishnendu Sadhukhan - Sun Microsystems * happens, we need to clear the help and continue. 853*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 854*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (show_help) { 855*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) werase(stdscr); 856*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) refresh(); 857*15db2897SKrishnendu Sadhukhan - Sun Microsystems print_title(); 858*15db2897SKrishnendu Sadhukhan - Sun Microsystems print_sysglobal(); 859*15db2897SKrishnendu Sadhukhan - Sun Microsystems show_help = FALSE; 860*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* Drop this key and continue */ 861*15db2897SKrishnendu Sadhukhan - Sun Microsystems continue; 862*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 863*15db2897SKrishnendu Sadhukhan - Sun Microsystems 864*15db2897SKrishnendu Sadhukhan - Sun Microsystems switch (k) { 865*15db2897SKrishnendu Sadhukhan - Sun Microsystems case 'Q': 866*15db2897SKrishnendu Sadhukhan - Sun Microsystems case 'q': 867*15db2897SKrishnendu Sadhukhan - Sun Microsystems retval = 0; 868*15db2897SKrishnendu Sadhukhan - Sun Microsystems goto quit; 869*15db2897SKrishnendu Sadhukhan - Sun Microsystems case 'R': 870*15db2897SKrishnendu Sadhukhan - Sun Microsystems case 'r': 871*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_deinit(); 872*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_init(); 873*15db2897SKrishnendu Sadhukhan - Sun Microsystems goto quit; 874*15db2897SKrishnendu Sadhukhan - Sun Microsystems case 'H': 875*15db2897SKrishnendu Sadhukhan - Sun Microsystems case 'h': 876*15db2897SKrishnendu Sadhukhan - Sun Microsystems show_help = TRUE; 877*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) werase(stdscr); 878*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) refresh(); 879*15db2897SKrishnendu Sadhukhan - Sun Microsystems print_help(); 880*15db2897SKrishnendu Sadhukhan - Sun Microsystems break; 881*15db2897SKrishnendu Sadhukhan - Sun Microsystems case ',': 882*15db2897SKrishnendu Sadhukhan - Sun Microsystems case '<': 883*15db2897SKrishnendu Sadhukhan - Sun Microsystems case KEY_LEFT: 884*15db2897SKrishnendu Sadhukhan - Sun Microsystems --list_index; 885*15db2897SKrishnendu Sadhukhan - Sun Microsystems 886*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (list_index < 0) { 887*15db2897SKrishnendu Sadhukhan - Sun Microsystems list_index = 0; 888*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 889*15db2897SKrishnendu Sadhukhan - Sun Microsystems 890*15db2897SKrishnendu Sadhukhan - Sun Microsystems break; 891*15db2897SKrishnendu Sadhukhan - Sun Microsystems case '.': 892*15db2897SKrishnendu Sadhukhan - Sun Microsystems case '>': 893*15db2897SKrishnendu Sadhukhan - Sun Microsystems case KEY_RIGHT: 894*15db2897SKrishnendu Sadhukhan - Sun Microsystems ++list_index; 895*15db2897SKrishnendu Sadhukhan - Sun Microsystems 896*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (list_index >= list_len) { 897*15db2897SKrishnendu Sadhukhan - Sun Microsystems list_index = list_len - 1; 898*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 899*15db2897SKrishnendu Sadhukhan - Sun Microsystems 900*15db2897SKrishnendu Sadhukhan - Sun Microsystems break; 901*15db2897SKrishnendu Sadhukhan - Sun Microsystems case 'a': 902*15db2897SKrishnendu Sadhukhan - Sun Microsystems case 'A': 903*15db2897SKrishnendu Sadhukhan - Sun Microsystems sort_type = LT_SORT_AVG; 904*15db2897SKrishnendu Sadhukhan - Sun Microsystems print_sysglobal(); 905*15db2897SKrishnendu Sadhukhan - Sun Microsystems break; 906*15db2897SKrishnendu Sadhukhan - Sun Microsystems case 'p': 907*15db2897SKrishnendu Sadhukhan - Sun Microsystems case 'P': 908*15db2897SKrishnendu Sadhukhan - Sun Microsystems sort_type = LT_SORT_TOTAL; 909*15db2897SKrishnendu Sadhukhan - Sun Microsystems print_sysglobal(); 910*15db2897SKrishnendu Sadhukhan - Sun Microsystems break; 911*15db2897SKrishnendu Sadhukhan - Sun Microsystems case 'm': 912*15db2897SKrishnendu Sadhukhan - Sun Microsystems case 'M': 913*15db2897SKrishnendu Sadhukhan - Sun Microsystems sort_type = LT_SORT_MAX; 914*15db2897SKrishnendu Sadhukhan - Sun Microsystems print_sysglobal(); 915*15db2897SKrishnendu Sadhukhan - Sun Microsystems break; 916*15db2897SKrishnendu Sadhukhan - Sun Microsystems case 'c': 917*15db2897SKrishnendu Sadhukhan - Sun Microsystems case 'C': 918*15db2897SKrishnendu Sadhukhan - Sun Microsystems sort_type = LT_SORT_COUNT; 919*15db2897SKrishnendu Sadhukhan - Sun Microsystems print_sysglobal(); 920*15db2897SKrishnendu Sadhukhan - Sun Microsystems break; 921*15db2897SKrishnendu Sadhukhan - Sun Microsystems case 't': 922*15db2897SKrishnendu Sadhukhan - Sun Microsystems case 'T': 923*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (plist != NULL) { 924*15db2897SKrishnendu Sadhukhan - Sun Microsystems selected_pid = plist[list_index]; 925*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 926*15db2897SKrishnendu Sadhukhan - Sun Microsystems 927*15db2897SKrishnendu Sadhukhan - Sun Microsystems selected_tid = INVALID_TID; 928*15db2897SKrishnendu Sadhukhan - Sun Microsystems thread_mode = !thread_mode; 929*15db2897SKrishnendu Sadhukhan - Sun Microsystems get_plist(&plist, &tlist, 930*15db2897SKrishnendu Sadhukhan - Sun Microsystems &list_len, &list_index); 931*15db2897SKrishnendu Sadhukhan - Sun Microsystems break; 932*15db2897SKrishnendu Sadhukhan - Sun Microsystems case '1': 933*15db2897SKrishnendu Sadhukhan - Sun Microsystems case '!': 934*15db2897SKrishnendu Sadhukhan - Sun Microsystems current_list_type = LT_LIST_CAUSE; 935*15db2897SKrishnendu Sadhukhan - Sun Microsystems print_sysglobal(); 936*15db2897SKrishnendu Sadhukhan - Sun Microsystems break; 937*15db2897SKrishnendu Sadhukhan - Sun Microsystems case '2': 938*15db2897SKrishnendu Sadhukhan - Sun Microsystems case '@': 939*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (g_config.lt_cfg_low_overhead_mode) { 940*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_error("Switching mode is " 941*15db2897SKrishnendu Sadhukhan - Sun Microsystems "not available for '-f low'."); 942*15db2897SKrishnendu Sadhukhan - Sun Microsystems } else { 943*15db2897SKrishnendu Sadhukhan - Sun Microsystems current_list_type = LT_LIST_SPECIALS; 944*15db2897SKrishnendu Sadhukhan - Sun Microsystems print_sysglobal(); 945*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 946*15db2897SKrishnendu Sadhukhan - Sun Microsystems 947*15db2897SKrishnendu Sadhukhan - Sun Microsystems break; 948*15db2897SKrishnendu Sadhukhan - Sun Microsystems case '3': 949*15db2897SKrishnendu Sadhukhan - Sun Microsystems case '#': 950*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (g_config.lt_cfg_trace_syncobj) { 951*15db2897SKrishnendu Sadhukhan - Sun Microsystems current_list_type = LT_LIST_SOBJ; 952*15db2897SKrishnendu Sadhukhan - Sun Microsystems print_sysglobal(); 953*15db2897SKrishnendu Sadhukhan - Sun Microsystems } else if (g_config.lt_cfg_low_overhead_mode) { 954*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_error("Switching mode is " 955*15db2897SKrishnendu Sadhukhan - Sun Microsystems "not available for '-f low'."); 956*15db2897SKrishnendu Sadhukhan - Sun Microsystems } else { 957*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_error("Tracing " 958*15db2897SKrishnendu Sadhukhan - Sun Microsystems "synchronization objects is " 959*15db2897SKrishnendu Sadhukhan - Sun Microsystems "disabled."); 960*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 961*15db2897SKrishnendu Sadhukhan - Sun Microsystems 962*15db2897SKrishnendu Sadhukhan - Sun Microsystems break; 963*15db2897SKrishnendu Sadhukhan - Sun Microsystems default: 964*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* Wake up for nothing; no refresh is needed */ 965*15db2897SKrishnendu Sadhukhan - Sun Microsystems need_refresh = FALSE; 966*15db2897SKrishnendu Sadhukhan - Sun Microsystems break; 967*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 968*15db2897SKrishnendu Sadhukhan - Sun Microsystems } else { 969*15db2897SKrishnendu Sadhukhan - Sun Microsystems need_refresh = FALSE; 970*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 971*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 972*15db2897SKrishnendu Sadhukhan - Sun Microsystems 973*15db2897SKrishnendu Sadhukhan - Sun Microsystems quit: 974*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (plist != NULL) { 975*15db2897SKrishnendu Sadhukhan - Sun Microsystems selected_pid = plist[list_index]; 976*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 977*15db2897SKrishnendu Sadhukhan - Sun Microsystems 978*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (tlist != NULL) { 979*15db2897SKrishnendu Sadhukhan - Sun Microsystems selected_tid = tlist[list_index]; 980*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 981*15db2897SKrishnendu Sadhukhan - Sun Microsystems 982*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_stat_proc_list_free(plist, tlist); 983*15db2897SKrishnendu Sadhukhan - Sun Microsystems 984*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (retval); 985*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 986*15db2897SKrishnendu Sadhukhan - Sun Microsystems 987*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 988*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Clean up display. 989*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 990*15db2897SKrishnendu Sadhukhan - Sun Microsystems void 991*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_deinit(void) 992*15db2897SKrishnendu Sadhukhan - Sun Microsystems { 993*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (curses_inited) { 994*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) clear(); 995*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) refresh(); 996*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) endwin(); 997*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 998*15db2897SKrishnendu Sadhukhan - Sun Microsystems 999*15db2897SKrishnendu Sadhukhan - Sun Microsystems titlebar = NULL; 1000*15db2897SKrishnendu Sadhukhan - Sun Microsystems captionbar = NULL; 1001*15db2897SKrishnendu Sadhukhan - Sun Microsystems sysglobal_window = NULL; 1002*15db2897SKrishnendu Sadhukhan - Sun Microsystems taskbar = NULL; 1003*15db2897SKrishnendu Sadhukhan - Sun Microsystems process_window = NULL; 1004*15db2897SKrishnendu Sadhukhan - Sun Microsystems hintbar = NULL; 1005*15db2897SKrishnendu Sadhukhan - Sun Microsystems screen_width = 1; 1006*15db2897SKrishnendu Sadhukhan - Sun Microsystems screen_height = 1; 1007*15db2897SKrishnendu Sadhukhan - Sun Microsystems 1008*15db2897SKrishnendu Sadhukhan - Sun Microsystems display_initialized = FALSE; 1009*15db2897SKrishnendu Sadhukhan - Sun Microsystems curses_inited = FALSE; 1010*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 1011*15db2897SKrishnendu Sadhukhan - Sun Microsystems 1012*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 1013*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Print message when display error happens. 1014*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 1015*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* ARGSUSED */ 1016*15db2897SKrishnendu Sadhukhan - Sun Microsystems void 1017*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_error(const char *fmt, ...) 1018*15db2897SKrishnendu Sadhukhan - Sun Microsystems { 1019*15db2897SKrishnendu Sadhukhan - Sun Microsystems va_list vl; 1020*15db2897SKrishnendu Sadhukhan - Sun Microsystems char tmp[81]; 1021*15db2897SKrishnendu Sadhukhan - Sun Microsystems int l; 1022*15db2897SKrishnendu Sadhukhan - Sun Microsystems 1023*15db2897SKrishnendu Sadhukhan - Sun Microsystems va_start(vl, fmt); 1024*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) vsnprintf(tmp, sizeof (tmp), fmt, vl); 1025*15db2897SKrishnendu Sadhukhan - Sun Microsystems va_end(vl); 1026*15db2897SKrishnendu Sadhukhan - Sun Microsystems 1027*15db2897SKrishnendu Sadhukhan - Sun Microsystems l = strlen(tmp); 1028*15db2897SKrishnendu Sadhukhan - Sun Microsystems 1029*15db2897SKrishnendu Sadhukhan - Sun Microsystems while (l > 0 && (tmp[l - 1] == '\n' || tmp[l - 1] == '\r')) { 1030*15db2897SKrishnendu Sadhukhan - Sun Microsystems tmp[l - 1] = '\0'; 1031*15db2897SKrishnendu Sadhukhan - Sun Microsystems --l; 1032*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 1033*15db2897SKrishnendu Sadhukhan - Sun Microsystems 1034*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (!display_initialized) { 1035*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) fprintf(stderr, "%s\n", tmp); 1036*15db2897SKrishnendu Sadhukhan - Sun Microsystems } else if (!show_help) { 1037*15db2897SKrishnendu Sadhukhan - Sun Microsystems print_hint(tmp); 1038*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 1039*15db2897SKrishnendu Sadhukhan - Sun Microsystems 1040*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 1041