115db2897SKrishnendu Sadhukhan - Sun Microsystems /* 215db2897SKrishnendu Sadhukhan - Sun Microsystems * CDDL HEADER START 315db2897SKrishnendu Sadhukhan - Sun Microsystems * 415db2897SKrishnendu Sadhukhan - Sun Microsystems * The contents of this file are subject to the terms of the 515db2897SKrishnendu Sadhukhan - Sun Microsystems * Common Development and Distribution License (the "License"). 615db2897SKrishnendu Sadhukhan - Sun Microsystems * You may not use this file except in compliance with the License. 715db2897SKrishnendu Sadhukhan - Sun Microsystems * 815db2897SKrishnendu Sadhukhan - Sun Microsystems * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 915db2897SKrishnendu Sadhukhan - Sun Microsystems * or http://www.opensolaris.org/os/licensing. 1015db2897SKrishnendu Sadhukhan - Sun Microsystems * See the License for the specific language governing permissions 1115db2897SKrishnendu Sadhukhan - Sun Microsystems * and limitations under the License. 1215db2897SKrishnendu Sadhukhan - Sun Microsystems * 1315db2897SKrishnendu Sadhukhan - Sun Microsystems * When distributing Covered Code, include this CDDL HEADER in each 1415db2897SKrishnendu Sadhukhan - Sun Microsystems * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 1515db2897SKrishnendu Sadhukhan - Sun Microsystems * If applicable, add the following below this CDDL HEADER, with the 1615db2897SKrishnendu Sadhukhan - Sun Microsystems * fields enclosed by brackets "[]" replaced with your own identifying 1715db2897SKrishnendu Sadhukhan - Sun Microsystems * information: Portions Copyright [yyyy] [name of copyright owner] 1815db2897SKrishnendu Sadhukhan - Sun Microsystems * 1915db2897SKrishnendu Sadhukhan - Sun Microsystems * CDDL HEADER END 2015db2897SKrishnendu Sadhukhan - Sun Microsystems */ 2115db2897SKrishnendu Sadhukhan - Sun Microsystems /* 2215db2897SKrishnendu Sadhukhan - Sun Microsystems * Copyright (c) 2008-2009, Intel Corporation. 2315db2897SKrishnendu Sadhukhan - Sun Microsystems * All Rights Reserved. 2415db2897SKrishnendu Sadhukhan - Sun Microsystems */ 2515db2897SKrishnendu Sadhukhan - Sun Microsystems 2615db2897SKrishnendu Sadhukhan - Sun Microsystems #include <stdio.h> 2715db2897SKrishnendu Sadhukhan - Sun Microsystems #include <stdlib.h> 2815db2897SKrishnendu Sadhukhan - Sun Microsystems #include <unistd.h> 2915db2897SKrishnendu Sadhukhan - Sun Microsystems #include <string.h> 3015db2897SKrishnendu Sadhukhan - Sun Microsystems #include <sys/types.h> 3115db2897SKrishnendu Sadhukhan - Sun Microsystems #include <sys/time.h> 3215db2897SKrishnendu Sadhukhan - Sun Microsystems #include <dirent.h> 3315db2897SKrishnendu Sadhukhan - Sun Microsystems #include <curses.h> 3415db2897SKrishnendu Sadhukhan - Sun Microsystems #include <time.h> 3515db2897SKrishnendu Sadhukhan - Sun Microsystems #include <wchar.h> 3615db2897SKrishnendu Sadhukhan - Sun Microsystems #include <ctype.h> 3715db2897SKrishnendu Sadhukhan - Sun Microsystems #include <stdarg.h> 3815db2897SKrishnendu Sadhukhan - Sun Microsystems #include <signal.h> 3915db2897SKrishnendu Sadhukhan - Sun Microsystems 4015db2897SKrishnendu Sadhukhan - Sun Microsystems #include "latencytop.h" 4115db2897SKrishnendu Sadhukhan - Sun Microsystems 4215db2897SKrishnendu Sadhukhan - Sun Microsystems #define LT_WINDOW_X 80 4315db2897SKrishnendu Sadhukhan - Sun Microsystems #define LT_WINDOW_Y 24 4415db2897SKrishnendu Sadhukhan - Sun Microsystems 4515db2897SKrishnendu Sadhukhan - Sun Microsystems #define LT_COLOR_DEFAULT 1 4615db2897SKrishnendu Sadhukhan - Sun Microsystems #define LT_COLOR_HEADER 2 4715db2897SKrishnendu Sadhukhan - Sun Microsystems 4815db2897SKrishnendu Sadhukhan - Sun Microsystems /* Windows created by libcurses */ 4915db2897SKrishnendu Sadhukhan - Sun Microsystems static WINDOW *titlebar = NULL; 5015db2897SKrishnendu Sadhukhan - Sun Microsystems static WINDOW *captionbar = NULL; 5115db2897SKrishnendu Sadhukhan - Sun Microsystems static WINDOW *sysglobal_window = NULL; 5215db2897SKrishnendu Sadhukhan - Sun Microsystems static WINDOW *taskbar = NULL; 5315db2897SKrishnendu Sadhukhan - Sun Microsystems static WINDOW *process_window = NULL; 5415db2897SKrishnendu Sadhukhan - Sun Microsystems static WINDOW *hintbar = NULL; 5515db2897SKrishnendu Sadhukhan - Sun Microsystems /* Screen dimension */ 5615db2897SKrishnendu Sadhukhan - Sun Microsystems static int screen_width = 1, screen_height = 1; 5715db2897SKrishnendu Sadhukhan - Sun Microsystems /* Is display initialized, i.e. are window pointers set up. */ 5815db2897SKrishnendu Sadhukhan - Sun Microsystems static int display_initialized = FALSE; 5915db2897SKrishnendu Sadhukhan - Sun Microsystems /* Is initscr() called */ 6015db2897SKrishnendu Sadhukhan - Sun Microsystems static int curses_inited = FALSE; 6115db2897SKrishnendu Sadhukhan - Sun Microsystems 6215db2897SKrishnendu Sadhukhan - Sun Microsystems /* To handle user key presses */ 6315db2897SKrishnendu Sadhukhan - Sun Microsystems static pid_t selected_pid = INVALID_PID; 6415db2897SKrishnendu Sadhukhan - Sun Microsystems static id_t selected_tid = INVALID_TID; 6515db2897SKrishnendu Sadhukhan - Sun Microsystems static lt_sort_t sort_type = LT_SORT_TOTAL; 6615db2897SKrishnendu Sadhukhan - Sun Microsystems static int thread_mode = FALSE; 6715db2897SKrishnendu Sadhukhan - Sun Microsystems /* Type of list being displayed */ 6815db2897SKrishnendu Sadhukhan - Sun Microsystems static int current_list_type = LT_LIST_CAUSE; 6915db2897SKrishnendu Sadhukhan - Sun Microsystems static int show_help = FALSE; 7015db2897SKrishnendu Sadhukhan - Sun Microsystems 7115db2897SKrishnendu Sadhukhan - Sun Microsystems /* Help functions that append/prepend a blank to the given string */ 7215db2897SKrishnendu Sadhukhan - Sun Microsystems #define fill_space_right(a, b, c) fill_space((a), (b), (c), TRUE) 7315db2897SKrishnendu Sadhukhan - Sun Microsystems #define fill_space_left(a, b, c) fill_space((a), (b), (c), FALSE) 7415db2897SKrishnendu Sadhukhan - Sun Microsystems 7515db2897SKrishnendu Sadhukhan - Sun Microsystems static void 7615db2897SKrishnendu Sadhukhan - Sun Microsystems fill_space(char *buffer, int len, int buffer_limit, int is_right) 7715db2897SKrishnendu Sadhukhan - Sun Microsystems { 7815db2897SKrishnendu Sadhukhan - Sun Microsystems int i = 0; 7915db2897SKrishnendu Sadhukhan - Sun Microsystems int tofill; 8015db2897SKrishnendu Sadhukhan - Sun Microsystems 8115db2897SKrishnendu Sadhukhan - Sun Microsystems if (len >= buffer_limit) { 8215db2897SKrishnendu Sadhukhan - Sun Microsystems len = buffer_limit - 1; 8315db2897SKrishnendu Sadhukhan - Sun Microsystems } 8415db2897SKrishnendu Sadhukhan - Sun Microsystems 8515db2897SKrishnendu Sadhukhan - Sun Microsystems i = strlen(buffer); 8615db2897SKrishnendu Sadhukhan - Sun Microsystems 8715db2897SKrishnendu Sadhukhan - Sun Microsystems if (i >= len) { 8815db2897SKrishnendu Sadhukhan - Sun Microsystems return; 8915db2897SKrishnendu Sadhukhan - Sun Microsystems } 9015db2897SKrishnendu Sadhukhan - Sun Microsystems 9115db2897SKrishnendu Sadhukhan - Sun Microsystems tofill = len - i; 9215db2897SKrishnendu Sadhukhan - Sun Microsystems 9315db2897SKrishnendu Sadhukhan - Sun Microsystems if (is_right) { 9415db2897SKrishnendu Sadhukhan - Sun Microsystems (void) memset(&buffer[i], ' ', tofill); 9515db2897SKrishnendu Sadhukhan - Sun Microsystems buffer[len] = '\0'; 9615db2897SKrishnendu Sadhukhan - Sun Microsystems } else { 9715db2897SKrishnendu Sadhukhan - Sun Microsystems (void) memmove(&buffer[tofill], buffer, i+1); 9815db2897SKrishnendu Sadhukhan - Sun Microsystems (void) memset(buffer, ' ', tofill); 9915db2897SKrishnendu Sadhukhan - Sun Microsystems } 10015db2897SKrishnendu Sadhukhan - Sun Microsystems } 10115db2897SKrishnendu Sadhukhan - Sun Microsystems 10215db2897SKrishnendu Sadhukhan - Sun Microsystems /* Convert the nanosecond value to a human readable string */ 10315db2897SKrishnendu Sadhukhan - Sun Microsystems static const char * 10415db2897SKrishnendu Sadhukhan - Sun Microsystems get_time_string(double nanoseconds, char *buffer, int len, int fill_width) 10515db2897SKrishnendu Sadhukhan - Sun Microsystems { 10615db2897SKrishnendu Sadhukhan - Sun Microsystems const double ONE_USEC = 1000.0; 10715db2897SKrishnendu Sadhukhan - Sun Microsystems const double ONE_MSEC = 1000000.0; 10815db2897SKrishnendu Sadhukhan - Sun Microsystems const double ONE_SEC = 1000000000.0; 10915db2897SKrishnendu Sadhukhan - Sun Microsystems 11015db2897SKrishnendu Sadhukhan - Sun Microsystems if (nanoseconds < (ONE_USEC - .5)) { 11115db2897SKrishnendu Sadhukhan - Sun Microsystems (void) snprintf(buffer, len, "%3.1f nsec", nanoseconds); 11215db2897SKrishnendu Sadhukhan - Sun Microsystems } else if (nanoseconds < (ONE_MSEC - .5 * ONE_USEC)) { 11315db2897SKrishnendu Sadhukhan - Sun Microsystems (void) snprintf(buffer, len, 11415db2897SKrishnendu Sadhukhan - Sun Microsystems "%3.1f usec", nanoseconds / ONE_USEC); 11515db2897SKrishnendu Sadhukhan - Sun Microsystems } else if (nanoseconds < (ONE_SEC - .5 * ONE_MSEC)) { 11615db2897SKrishnendu Sadhukhan - Sun Microsystems (void) snprintf(buffer, len, 11715db2897SKrishnendu Sadhukhan - Sun Microsystems "%3.1f msec", nanoseconds / ONE_MSEC); 11815db2897SKrishnendu Sadhukhan - Sun Microsystems } else if (nanoseconds < 999.5 * ONE_SEC) { 11915db2897SKrishnendu Sadhukhan - Sun Microsystems (void) snprintf(buffer, len, 12015db2897SKrishnendu Sadhukhan - Sun Microsystems "%3.1f sec", nanoseconds / ONE_SEC); 12115db2897SKrishnendu Sadhukhan - Sun Microsystems } else { 12215db2897SKrishnendu Sadhukhan - Sun Microsystems (void) snprintf(buffer, len, 12315db2897SKrishnendu Sadhukhan - Sun Microsystems "%.0e sec", nanoseconds / ONE_SEC); 12415db2897SKrishnendu Sadhukhan - Sun Microsystems } 12515db2897SKrishnendu Sadhukhan - Sun Microsystems 12615db2897SKrishnendu Sadhukhan - Sun Microsystems fill_space_left(buffer, fill_width, len); 12715db2897SKrishnendu Sadhukhan - Sun Microsystems return (buffer); 12815db2897SKrishnendu Sadhukhan - Sun Microsystems } 12915db2897SKrishnendu Sadhukhan - Sun Microsystems 13015db2897SKrishnendu Sadhukhan - Sun Microsystems /* Used in print_statistics below */ 13115db2897SKrishnendu Sadhukhan - Sun Microsystems #define WIDTH_REASON_STRING 36 13215db2897SKrishnendu Sadhukhan - Sun Microsystems #define WIDTH_COUNT 12 13315db2897SKrishnendu Sadhukhan - Sun Microsystems #define WIDTH_AVG 12 13415db2897SKrishnendu Sadhukhan - Sun Microsystems #define WIDTH_MAX 12 13515db2897SKrishnendu Sadhukhan - Sun Microsystems #define WIDTH_PCT 8 13615db2897SKrishnendu Sadhukhan - Sun Microsystems #define BEGIN_COUNT WIDTH_REASON_STRING 13715db2897SKrishnendu Sadhukhan - Sun Microsystems #define BEGIN_AVG (BEGIN_COUNT + WIDTH_COUNT) 13815db2897SKrishnendu Sadhukhan - Sun Microsystems #define BEGIN_MAX (BEGIN_AVG + WIDTH_AVG) 13915db2897SKrishnendu Sadhukhan - Sun Microsystems #define BEGIN_PCT (BEGIN_MAX + WIDTH_MAX) 14015db2897SKrishnendu Sadhukhan - Sun Microsystems 14115db2897SKrishnendu Sadhukhan - Sun Microsystems /* 14215db2897SKrishnendu Sadhukhan - Sun Microsystems * Print statistics in global/process pane. Called by print_sysglobal 14315db2897SKrishnendu Sadhukhan - Sun Microsystems * print_process. 14415db2897SKrishnendu Sadhukhan - Sun Microsystems * 14515db2897SKrishnendu Sadhukhan - Sun Microsystems * Parameters: 14615db2897SKrishnendu Sadhukhan - Sun Microsystems * window - the global or process statistics window. 14715db2897SKrishnendu Sadhukhan - Sun Microsystems * begin_line - where to start printing. 14815db2897SKrishnendu Sadhukhan - Sun Microsystems * count - how many lines should be printed. 14915db2897SKrishnendu Sadhukhan - Sun Microsystems * list - a stat_list. 15015db2897SKrishnendu Sadhukhan - Sun Microsystems */ 15115db2897SKrishnendu Sadhukhan - Sun Microsystems static void 15215db2897SKrishnendu Sadhukhan - Sun Microsystems print_statistics(WINDOW * window, int begin_line, int nlines, void *list) 15315db2897SKrishnendu Sadhukhan - Sun Microsystems { 15415db2897SKrishnendu Sadhukhan - Sun Microsystems uint64_t total; 15515db2897SKrishnendu Sadhukhan - Sun Microsystems int i = 0; 15615db2897SKrishnendu Sadhukhan - Sun Microsystems 15715db2897SKrishnendu Sadhukhan - Sun Microsystems if (!display_initialized) { 15815db2897SKrishnendu Sadhukhan - Sun Microsystems return; 15915db2897SKrishnendu Sadhukhan - Sun Microsystems } 16015db2897SKrishnendu Sadhukhan - Sun Microsystems 16115db2897SKrishnendu Sadhukhan - Sun Microsystems total = lt_stat_list_get_gtotal(list); 16215db2897SKrishnendu Sadhukhan - Sun Microsystems 16315db2897SKrishnendu Sadhukhan - Sun Microsystems if (total == 0) { 16415db2897SKrishnendu Sadhukhan - Sun Microsystems return; 16515db2897SKrishnendu Sadhukhan - Sun Microsystems } 16615db2897SKrishnendu Sadhukhan - Sun Microsystems 16715db2897SKrishnendu Sadhukhan - Sun Microsystems while (i < nlines && lt_stat_list_has_item(list, i)) { 16815db2897SKrishnendu Sadhukhan - Sun Microsystems 16915db2897SKrishnendu Sadhukhan - Sun Microsystems char tmp[WIDTH_REASON_STRING]; 17015db2897SKrishnendu Sadhukhan - Sun Microsystems const char *reason = lt_stat_list_get_reason(list, i); 17115db2897SKrishnendu Sadhukhan - Sun Microsystems uint64_t count = lt_stat_list_get_count(list, i); 17215db2897SKrishnendu Sadhukhan - Sun Microsystems 17315db2897SKrishnendu Sadhukhan - Sun Microsystems if (count == 0) { 17415db2897SKrishnendu Sadhukhan - Sun Microsystems continue; 17515db2897SKrishnendu Sadhukhan - Sun Microsystems } 17615db2897SKrishnendu Sadhukhan - Sun Microsystems 17715db2897SKrishnendu Sadhukhan - Sun Microsystems (void) snprintf(tmp, sizeof (tmp), "%s", reason); 17815db2897SKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(window, i + begin_line, 0, "%s", tmp); 17915db2897SKrishnendu Sadhukhan - Sun Microsystems 18015db2897SKrishnendu Sadhukhan - Sun Microsystems (void) snprintf(tmp, sizeof (tmp), "%llu", count); 18115db2897SKrishnendu Sadhukhan - Sun Microsystems fill_space_left(tmp, WIDTH_COUNT, sizeof (tmp)); 18215db2897SKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(window, i + begin_line, BEGIN_COUNT, 18315db2897SKrishnendu Sadhukhan - Sun Microsystems "%s", tmp); 18415db2897SKrishnendu Sadhukhan - Sun Microsystems 18515db2897SKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(window, i + begin_line, BEGIN_AVG, 18615db2897SKrishnendu Sadhukhan - Sun Microsystems "%s", get_time_string( 18715db2897SKrishnendu Sadhukhan - Sun Microsystems (double)lt_stat_list_get_sum(list, i) / count, 18815db2897SKrishnendu Sadhukhan - Sun Microsystems tmp, sizeof (tmp), WIDTH_AVG)); 18915db2897SKrishnendu Sadhukhan - Sun Microsystems 19015db2897SKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(window, i + begin_line, BEGIN_MAX, 19115db2897SKrishnendu Sadhukhan - Sun Microsystems "%s", get_time_string( 19215db2897SKrishnendu Sadhukhan - Sun Microsystems (double)lt_stat_list_get_max(list, i), 19315db2897SKrishnendu Sadhukhan - Sun Microsystems tmp, sizeof (tmp), WIDTH_MAX)); 19415db2897SKrishnendu Sadhukhan - Sun Microsystems 19515db2897SKrishnendu Sadhukhan - Sun Microsystems if (LT_LIST_SPECIALS != current_list_type) { 19615db2897SKrishnendu Sadhukhan - Sun Microsystems (void) snprintf(tmp, sizeof (tmp), "%.1f %%", 19715db2897SKrishnendu Sadhukhan - Sun Microsystems (double)lt_stat_list_get_sum(list, i) 19815db2897SKrishnendu Sadhukhan - Sun Microsystems / total * 100.0); 19915db2897SKrishnendu Sadhukhan - Sun Microsystems } else { 20015db2897SKrishnendu Sadhukhan - Sun Microsystems (void) snprintf(tmp, sizeof (tmp), "--- "); 20115db2897SKrishnendu Sadhukhan - Sun Microsystems } 20215db2897SKrishnendu Sadhukhan - Sun Microsystems 20315db2897SKrishnendu Sadhukhan - Sun Microsystems fill_space_left(tmp, WIDTH_PCT, sizeof (tmp)); 20415db2897SKrishnendu Sadhukhan - Sun Microsystems 20515db2897SKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(window, i + begin_line, BEGIN_PCT, 20615db2897SKrishnendu Sadhukhan - Sun Microsystems "%s", tmp); 20715db2897SKrishnendu Sadhukhan - Sun Microsystems i++; 20815db2897SKrishnendu Sadhukhan - Sun Microsystems } 20915db2897SKrishnendu Sadhukhan - Sun Microsystems } 21015db2897SKrishnendu Sadhukhan - Sun Microsystems 21115db2897SKrishnendu Sadhukhan - Sun Microsystems /* 21215db2897SKrishnendu Sadhukhan - Sun Microsystems * Print statistics in global pane. 21315db2897SKrishnendu Sadhukhan - Sun Microsystems */ 21415db2897SKrishnendu Sadhukhan - Sun Microsystems static void 21515db2897SKrishnendu Sadhukhan - Sun Microsystems print_sysglobal(void) 21615db2897SKrishnendu Sadhukhan - Sun Microsystems { 21715db2897SKrishnendu Sadhukhan - Sun Microsystems void *list; 21815db2897SKrishnendu Sadhukhan - Sun Microsystems char header[256]; 21915db2897SKrishnendu Sadhukhan - Sun Microsystems 22015db2897SKrishnendu Sadhukhan - Sun Microsystems if (!display_initialized) { 22115db2897SKrishnendu Sadhukhan - Sun Microsystems return; 22215db2897SKrishnendu Sadhukhan - Sun Microsystems } 22315db2897SKrishnendu Sadhukhan - Sun Microsystems 22415db2897SKrishnendu Sadhukhan - Sun Microsystems (void) werase(sysglobal_window); 22515db2897SKrishnendu Sadhukhan - Sun Microsystems 22615db2897SKrishnendu Sadhukhan - Sun Microsystems (void) wattron(sysglobal_window, A_REVERSE); 22715db2897SKrishnendu Sadhukhan - Sun Microsystems (void) snprintf(header, sizeof (header), 22815db2897SKrishnendu Sadhukhan - Sun Microsystems "%s", "System wide latencies"); 22915db2897SKrishnendu Sadhukhan - Sun Microsystems fill_space_right(header, screen_width, sizeof (header)); 23015db2897SKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(sysglobal_window, 0, 0, "%s", header); 23115db2897SKrishnendu Sadhukhan - Sun Microsystems (void) wattroff(sysglobal_window, A_REVERSE); 23215db2897SKrishnendu Sadhukhan - Sun Microsystems 23315db2897SKrishnendu Sadhukhan - Sun Microsystems list = lt_stat_list_create(current_list_type, 23415db2897SKrishnendu Sadhukhan - Sun Microsystems LT_LEVEL_GLOBAL, 0, 0, 10, sort_type); 23515db2897SKrishnendu Sadhukhan - Sun Microsystems print_statistics(sysglobal_window, 1, 10, list); 23615db2897SKrishnendu Sadhukhan - Sun Microsystems lt_stat_list_free(list); 23715db2897SKrishnendu Sadhukhan - Sun Microsystems 23815db2897SKrishnendu Sadhukhan - Sun Microsystems (void) wrefresh(sysglobal_window); 23915db2897SKrishnendu Sadhukhan - Sun Microsystems } 24015db2897SKrishnendu Sadhukhan - Sun Microsystems 24115db2897SKrishnendu Sadhukhan - Sun Microsystems /* 24215db2897SKrishnendu Sadhukhan - Sun Microsystems * Prints current operation mode. Mode is combination of: 24315db2897SKrishnendu Sadhukhan - Sun Microsystems * 24415db2897SKrishnendu Sadhukhan - Sun Microsystems * "Process or Thread", and "1 or 2 or 3". 24515db2897SKrishnendu Sadhukhan - Sun Microsystems */ 24615db2897SKrishnendu Sadhukhan - Sun Microsystems static void 24715db2897SKrishnendu Sadhukhan - Sun Microsystems print_current_mode() 24815db2897SKrishnendu Sadhukhan - Sun Microsystems { 24915db2897SKrishnendu Sadhukhan - Sun Microsystems char type; 25015db2897SKrishnendu Sadhukhan - Sun Microsystems 25115db2897SKrishnendu Sadhukhan - Sun Microsystems if (!display_initialized) { 25215db2897SKrishnendu Sadhukhan - Sun Microsystems return; 25315db2897SKrishnendu Sadhukhan - Sun Microsystems } 25415db2897SKrishnendu Sadhukhan - Sun Microsystems 25515db2897SKrishnendu Sadhukhan - Sun Microsystems switch (current_list_type) { 25615db2897SKrishnendu Sadhukhan - Sun Microsystems case LT_LIST_CAUSE: 25715db2897SKrishnendu Sadhukhan - Sun Microsystems type = '1'; 25815db2897SKrishnendu Sadhukhan - Sun Microsystems break; 25915db2897SKrishnendu Sadhukhan - Sun Microsystems case LT_LIST_SPECIALS: 26015db2897SKrishnendu Sadhukhan - Sun Microsystems type = '2'; 26115db2897SKrishnendu Sadhukhan - Sun Microsystems break; 26215db2897SKrishnendu Sadhukhan - Sun Microsystems case LT_LIST_SOBJ: 26315db2897SKrishnendu Sadhukhan - Sun Microsystems type = '3'; 26415db2897SKrishnendu Sadhukhan - Sun Microsystems break; 26515db2897SKrishnendu Sadhukhan - Sun Microsystems default: 26615db2897SKrishnendu Sadhukhan - Sun Microsystems type = '?'; 26715db2897SKrishnendu Sadhukhan - Sun Microsystems break; 26815db2897SKrishnendu Sadhukhan - Sun Microsystems } 26915db2897SKrishnendu Sadhukhan - Sun Microsystems 27015db2897SKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(process_window, 0, screen_width - 8, "View: %c%c", 27115db2897SKrishnendu Sadhukhan - Sun Microsystems type, thread_mode ? 'T' : 'P'); 27215db2897SKrishnendu Sadhukhan - Sun Microsystems } 27315db2897SKrishnendu Sadhukhan - Sun Microsystems 27415db2897SKrishnendu Sadhukhan - Sun Microsystems /* 275*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems * Print process window bar when the list is empty. 276*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems */ 277*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems static void 278*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems print_empty_process_bar() 279*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems { 280*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems char header[256]; 281*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 282*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems if (!display_initialized) { 283*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems return; 284*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems } 285*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 286*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems (void) werase(process_window); 287*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems (void) wattron(process_window, A_REVERSE); 288*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems (void) snprintf(header, sizeof (header), 289*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems "No process/thread data is available"); 290*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems fill_space_right(header, screen_width, sizeof (header)); 291*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(process_window, 0, 0, "%s", header); 292*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 293*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems print_current_mode(); 294*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems (void) wattroff(process_window, A_REVERSE); 295*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 296*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems (void) wrefresh(process_window); 297*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems } 298*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 299*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems /* 30015db2897SKrishnendu Sadhukhan - Sun Microsystems * Print per-process statistics in process pane. 30115db2897SKrishnendu Sadhukhan - Sun Microsystems * This is called when mode of operation is process. 30215db2897SKrishnendu Sadhukhan - Sun Microsystems */ 30315db2897SKrishnendu Sadhukhan - Sun Microsystems static void 30415db2897SKrishnendu Sadhukhan - Sun Microsystems print_process(unsigned int pid) 30515db2897SKrishnendu Sadhukhan - Sun Microsystems { 30615db2897SKrishnendu Sadhukhan - Sun Microsystems void *list; 30715db2897SKrishnendu Sadhukhan - Sun Microsystems char header[256]; 30815db2897SKrishnendu Sadhukhan - Sun Microsystems char tmp[30]; 30915db2897SKrishnendu Sadhukhan - Sun Microsystems 31015db2897SKrishnendu Sadhukhan - Sun Microsystems if (!display_initialized) { 31115db2897SKrishnendu Sadhukhan - Sun Microsystems return; 31215db2897SKrishnendu Sadhukhan - Sun Microsystems } 31315db2897SKrishnendu Sadhukhan - Sun Microsystems 31415db2897SKrishnendu Sadhukhan - Sun Microsystems list = lt_stat_list_create(current_list_type, LT_LEVEL_PROCESS, 31515db2897SKrishnendu Sadhukhan - Sun Microsystems pid, 0, 8, sort_type); 31615db2897SKrishnendu Sadhukhan - Sun Microsystems 31715db2897SKrishnendu Sadhukhan - Sun Microsystems (void) werase(process_window); 31815db2897SKrishnendu Sadhukhan - Sun Microsystems (void) wattron(process_window, A_REVERSE); 31915db2897SKrishnendu Sadhukhan - Sun Microsystems (void) snprintf(header, sizeof (header), "Process %s (%i), %d threads", 32015db2897SKrishnendu Sadhukhan - Sun Microsystems lt_stat_proc_get_name(pid), pid, lt_stat_proc_get_nthreads(pid)); 32115db2897SKrishnendu Sadhukhan - Sun Microsystems fill_space_right(header, screen_width, sizeof (header)); 32215db2897SKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(process_window, 0, 0, "%s", header); 32315db2897SKrishnendu Sadhukhan - Sun Microsystems 32415db2897SKrishnendu Sadhukhan - Sun Microsystems if (current_list_type != LT_LIST_SPECIALS) { 32515db2897SKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(process_window, 0, 48, "Total: %s", 32615db2897SKrishnendu Sadhukhan - Sun Microsystems get_time_string((double)lt_stat_list_get_gtotal(list), 32715db2897SKrishnendu Sadhukhan - Sun Microsystems tmp, sizeof (tmp), 12)); 32815db2897SKrishnendu Sadhukhan - Sun Microsystems } 32915db2897SKrishnendu Sadhukhan - Sun Microsystems 33015db2897SKrishnendu Sadhukhan - Sun Microsystems print_current_mode(); 33115db2897SKrishnendu Sadhukhan - Sun Microsystems (void) wattroff(process_window, A_REVERSE); 33215db2897SKrishnendu Sadhukhan - Sun Microsystems print_statistics(process_window, 1, 8, list); 33315db2897SKrishnendu Sadhukhan - Sun Microsystems lt_stat_list_free(list); 33415db2897SKrishnendu Sadhukhan - Sun Microsystems 33515db2897SKrishnendu Sadhukhan - Sun Microsystems (void) wrefresh(process_window); 33615db2897SKrishnendu Sadhukhan - Sun Microsystems } 33715db2897SKrishnendu Sadhukhan - Sun Microsystems 33815db2897SKrishnendu Sadhukhan - Sun Microsystems /* 33915db2897SKrishnendu Sadhukhan - Sun Microsystems * Display the list of processes that are tracked, in task bar. 34015db2897SKrishnendu Sadhukhan - Sun Microsystems * This one is called when mode of operation is process. 34115db2897SKrishnendu Sadhukhan - Sun Microsystems */ 34215db2897SKrishnendu Sadhukhan - Sun Microsystems static void 34315db2897SKrishnendu Sadhukhan - Sun Microsystems print_taskbar_process(pid_t *pidlist, int pidlist_len, int pidlist_index) 34415db2897SKrishnendu Sadhukhan - Sun Microsystems { 34515db2897SKrishnendu Sadhukhan - Sun Microsystems const int ITEM_WIDTH = 8; 34615db2897SKrishnendu Sadhukhan - Sun Microsystems 34715db2897SKrishnendu Sadhukhan - Sun Microsystems int number_item; 34815db2897SKrishnendu Sadhukhan - Sun Microsystems int i; 34915db2897SKrishnendu Sadhukhan - Sun Microsystems int xpos = 0; 35015db2897SKrishnendu Sadhukhan - Sun Microsystems 35115db2897SKrishnendu Sadhukhan - Sun Microsystems if (!display_initialized) { 35215db2897SKrishnendu Sadhukhan - Sun Microsystems return; 35315db2897SKrishnendu Sadhukhan - Sun Microsystems } 35415db2897SKrishnendu Sadhukhan - Sun Microsystems 35515db2897SKrishnendu Sadhukhan - Sun Microsystems number_item = (screen_width / ITEM_WIDTH) - 1; 35615db2897SKrishnendu Sadhukhan - Sun Microsystems i = pidlist_index - (pidlist_index % number_item); 35715db2897SKrishnendu Sadhukhan - Sun Microsystems 35815db2897SKrishnendu Sadhukhan - Sun Microsystems (void) werase(taskbar); 35915db2897SKrishnendu Sadhukhan - Sun Microsystems 36015db2897SKrishnendu Sadhukhan - Sun Microsystems if (i != 0) { 36115db2897SKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(taskbar, 0, xpos, "<-"); 36215db2897SKrishnendu Sadhukhan - Sun Microsystems } 36315db2897SKrishnendu Sadhukhan - Sun Microsystems 36415db2897SKrishnendu Sadhukhan - Sun Microsystems xpos = ITEM_WIDTH / 2; 36515db2897SKrishnendu Sadhukhan - Sun Microsystems 36615db2897SKrishnendu Sadhukhan - Sun Microsystems while (xpos + ITEM_WIDTH <= screen_width && i < pidlist_len) { 36715db2897SKrishnendu Sadhukhan - Sun Microsystems char str[ITEM_WIDTH+1]; 36815db2897SKrishnendu Sadhukhan - Sun Microsystems int slen; 36915db2897SKrishnendu Sadhukhan - Sun Microsystems const char *pname = lt_stat_proc_get_name(pidlist[i]); 37015db2897SKrishnendu Sadhukhan - Sun Microsystems 37115db2897SKrishnendu Sadhukhan - Sun Microsystems if (pname && pname[0]) { 37215db2897SKrishnendu Sadhukhan - Sun Microsystems (void) snprintf(str, sizeof (str) - 1, "%s", pname); 37315db2897SKrishnendu Sadhukhan - Sun Microsystems } else { 37415db2897SKrishnendu Sadhukhan - Sun Microsystems (void) snprintf(str, sizeof (str) - 1, 37515db2897SKrishnendu Sadhukhan - Sun Microsystems "<%d>", pidlist[i]); 37615db2897SKrishnendu Sadhukhan - Sun Microsystems } 37715db2897SKrishnendu Sadhukhan - Sun Microsystems 37815db2897SKrishnendu Sadhukhan - Sun Microsystems slen = strlen(str); 37915db2897SKrishnendu Sadhukhan - Sun Microsystems 38015db2897SKrishnendu Sadhukhan - Sun Microsystems if (slen < ITEM_WIDTH) { 38115db2897SKrishnendu Sadhukhan - Sun Microsystems (void) memset(&str[slen], ' ', ITEM_WIDTH - slen); 38215db2897SKrishnendu Sadhukhan - Sun Microsystems } 38315db2897SKrishnendu Sadhukhan - Sun Microsystems 38415db2897SKrishnendu Sadhukhan - Sun Microsystems str[sizeof (str) - 1] = '\0'; 38515db2897SKrishnendu Sadhukhan - Sun Microsystems 38615db2897SKrishnendu Sadhukhan - Sun Microsystems if (i == pidlist_index) { 38715db2897SKrishnendu Sadhukhan - Sun Microsystems (void) wattron(taskbar, A_REVERSE); 38815db2897SKrishnendu Sadhukhan - Sun Microsystems } 38915db2897SKrishnendu Sadhukhan - Sun Microsystems 39015db2897SKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(taskbar, 0, xpos, "%s", str); 39115db2897SKrishnendu Sadhukhan - Sun Microsystems 39215db2897SKrishnendu Sadhukhan - Sun Microsystems if (i == pidlist_index) { 39315db2897SKrishnendu Sadhukhan - Sun Microsystems (void) wattroff(taskbar, A_REVERSE); 39415db2897SKrishnendu Sadhukhan - Sun Microsystems } 39515db2897SKrishnendu Sadhukhan - Sun Microsystems 39615db2897SKrishnendu Sadhukhan - Sun Microsystems xpos += ITEM_WIDTH; 39715db2897SKrishnendu Sadhukhan - Sun Microsystems i++; 39815db2897SKrishnendu Sadhukhan - Sun Microsystems } 39915db2897SKrishnendu Sadhukhan - Sun Microsystems 40015db2897SKrishnendu Sadhukhan - Sun Microsystems if (i != pidlist_len) { 40115db2897SKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(taskbar, 0, screen_width - 2, "->"); 40215db2897SKrishnendu Sadhukhan - Sun Microsystems } 40315db2897SKrishnendu Sadhukhan - Sun Microsystems 40415db2897SKrishnendu Sadhukhan - Sun Microsystems (void) wrefresh(taskbar); 40515db2897SKrishnendu Sadhukhan - Sun Microsystems } 40615db2897SKrishnendu Sadhukhan - Sun Microsystems 40715db2897SKrishnendu Sadhukhan - Sun Microsystems /* 40815db2897SKrishnendu Sadhukhan - Sun Microsystems * Display the list of processes that are tracked, in task bar. 40915db2897SKrishnendu Sadhukhan - Sun Microsystems * This one is called when mode of operation is thread. 41015db2897SKrishnendu Sadhukhan - Sun Microsystems */ 41115db2897SKrishnendu Sadhukhan - Sun Microsystems static void 41215db2897SKrishnendu Sadhukhan - Sun Microsystems print_taskbar_thread(pid_t *pidlist, id_t *tidlist, int list_len, 41315db2897SKrishnendu Sadhukhan - Sun Microsystems int list_index) 41415db2897SKrishnendu Sadhukhan - Sun Microsystems { 41515db2897SKrishnendu Sadhukhan - Sun Microsystems const int ITEM_WIDTH = 12; 41615db2897SKrishnendu Sadhukhan - Sun Microsystems 41715db2897SKrishnendu Sadhukhan - Sun Microsystems int number_item; 41815db2897SKrishnendu Sadhukhan - Sun Microsystems int i; 41915db2897SKrishnendu Sadhukhan - Sun Microsystems int xpos = 0; 42015db2897SKrishnendu Sadhukhan - Sun Microsystems const char *pname = NULL; 42115db2897SKrishnendu Sadhukhan - Sun Microsystems pid_t last_pid = INVALID_PID; 42215db2897SKrishnendu Sadhukhan - Sun Microsystems 42315db2897SKrishnendu Sadhukhan - Sun Microsystems 42415db2897SKrishnendu Sadhukhan - Sun Microsystems if (!display_initialized) { 42515db2897SKrishnendu Sadhukhan - Sun Microsystems return; 42615db2897SKrishnendu Sadhukhan - Sun Microsystems } 42715db2897SKrishnendu Sadhukhan - Sun Microsystems 42815db2897SKrishnendu Sadhukhan - Sun Microsystems number_item = (screen_width - 8) / ITEM_WIDTH; 42915db2897SKrishnendu Sadhukhan - Sun Microsystems i = list_index - (list_index % number_item); 43015db2897SKrishnendu Sadhukhan - Sun Microsystems 43115db2897SKrishnendu Sadhukhan - Sun Microsystems (void) werase(taskbar); 43215db2897SKrishnendu Sadhukhan - Sun Microsystems 43315db2897SKrishnendu Sadhukhan - Sun Microsystems if (i != 0) { 43415db2897SKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(taskbar, 0, xpos, "<-"); 43515db2897SKrishnendu Sadhukhan - Sun Microsystems } 43615db2897SKrishnendu Sadhukhan - Sun Microsystems 43715db2897SKrishnendu Sadhukhan - Sun Microsystems xpos = 4; 43815db2897SKrishnendu Sadhukhan - Sun Microsystems 43915db2897SKrishnendu Sadhukhan - Sun Microsystems while (xpos + ITEM_WIDTH <= screen_width && i < list_len) { 44015db2897SKrishnendu Sadhukhan - Sun Microsystems char str[ITEM_WIDTH+1]; 44115db2897SKrishnendu Sadhukhan - Sun Microsystems int slen, tlen; 44215db2897SKrishnendu Sadhukhan - Sun Microsystems 44315db2897SKrishnendu Sadhukhan - Sun Microsystems if (pidlist[i] != last_pid) { 44415db2897SKrishnendu Sadhukhan - Sun Microsystems pname = lt_stat_proc_get_name(pidlist[i]); 44515db2897SKrishnendu Sadhukhan - Sun Microsystems last_pid = pidlist[i]; 44615db2897SKrishnendu Sadhukhan - Sun Microsystems } 44715db2897SKrishnendu Sadhukhan - Sun Microsystems 44815db2897SKrishnendu Sadhukhan - Sun Microsystems /* 44915db2897SKrishnendu Sadhukhan - Sun Microsystems * Calculate length of thread's ID; use shorter process name 45015db2897SKrishnendu Sadhukhan - Sun Microsystems * in order to save space on the screen. 45115db2897SKrishnendu Sadhukhan - Sun Microsystems */ 45215db2897SKrishnendu Sadhukhan - Sun Microsystems tlen = snprintf(NULL, 0, "_%d", tidlist[i]); 45315db2897SKrishnendu Sadhukhan - Sun Microsystems 45415db2897SKrishnendu Sadhukhan - Sun Microsystems if (pname && pname[0]) { 45515db2897SKrishnendu Sadhukhan - Sun Microsystems (void) snprintf(str, sizeof (str) - tlen - 1, 45615db2897SKrishnendu Sadhukhan - Sun Microsystems "%s", pname); 45715db2897SKrishnendu Sadhukhan - Sun Microsystems } else { 45815db2897SKrishnendu Sadhukhan - Sun Microsystems (void) snprintf(str, sizeof (str) - tlen - 1, 45915db2897SKrishnendu Sadhukhan - Sun Microsystems "<%d>", pidlist[i]); 46015db2897SKrishnendu Sadhukhan - Sun Microsystems } 46115db2897SKrishnendu Sadhukhan - Sun Microsystems 46215db2897SKrishnendu Sadhukhan - Sun Microsystems slen = strlen(str); 46315db2897SKrishnendu Sadhukhan - Sun Microsystems 46415db2897SKrishnendu Sadhukhan - Sun Microsystems (void) snprintf(&str[slen], sizeof (str) - slen, 46515db2897SKrishnendu Sadhukhan - Sun Microsystems "_%d", tidlist[i]); 46615db2897SKrishnendu Sadhukhan - Sun Microsystems 46715db2897SKrishnendu Sadhukhan - Sun Microsystems slen += tlen; 46815db2897SKrishnendu Sadhukhan - Sun Microsystems 46915db2897SKrishnendu Sadhukhan - Sun Microsystems if (slen < ITEM_WIDTH) { 47015db2897SKrishnendu Sadhukhan - Sun Microsystems (void) memset(&str[slen], ' ', ITEM_WIDTH - slen); 47115db2897SKrishnendu Sadhukhan - Sun Microsystems } 47215db2897SKrishnendu Sadhukhan - Sun Microsystems 47315db2897SKrishnendu Sadhukhan - Sun Microsystems str[sizeof (str) - 1] = '\0'; 47415db2897SKrishnendu Sadhukhan - Sun Microsystems 47515db2897SKrishnendu Sadhukhan - Sun Microsystems if (i == list_index) { 47615db2897SKrishnendu Sadhukhan - Sun Microsystems (void) wattron(taskbar, A_REVERSE); 47715db2897SKrishnendu Sadhukhan - Sun Microsystems } 47815db2897SKrishnendu Sadhukhan - Sun Microsystems 47915db2897SKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(taskbar, 0, xpos, "%s", str); 48015db2897SKrishnendu Sadhukhan - Sun Microsystems 48115db2897SKrishnendu Sadhukhan - Sun Microsystems if (i == list_index) { 48215db2897SKrishnendu Sadhukhan - Sun Microsystems (void) wattroff(taskbar, A_REVERSE); 48315db2897SKrishnendu Sadhukhan - Sun Microsystems } 48415db2897SKrishnendu Sadhukhan - Sun Microsystems 48515db2897SKrishnendu Sadhukhan - Sun Microsystems xpos += ITEM_WIDTH; 48615db2897SKrishnendu Sadhukhan - Sun Microsystems i++; 48715db2897SKrishnendu Sadhukhan - Sun Microsystems } 48815db2897SKrishnendu Sadhukhan - Sun Microsystems 48915db2897SKrishnendu Sadhukhan - Sun Microsystems if (i != list_len) { 49015db2897SKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(taskbar, 0, screen_width - 2, "->"); 49115db2897SKrishnendu Sadhukhan - Sun Microsystems } 49215db2897SKrishnendu Sadhukhan - Sun Microsystems 49315db2897SKrishnendu Sadhukhan - Sun Microsystems (void) wrefresh(taskbar); 49415db2897SKrishnendu Sadhukhan - Sun Microsystems } 49515db2897SKrishnendu Sadhukhan - Sun Microsystems 49615db2897SKrishnendu Sadhukhan - Sun Microsystems /* 49715db2897SKrishnendu Sadhukhan - Sun Microsystems * Print per-thread statistics in process pane. 49815db2897SKrishnendu Sadhukhan - Sun Microsystems * This is called when mode of operation is thread. 49915db2897SKrishnendu Sadhukhan - Sun Microsystems */ 50015db2897SKrishnendu Sadhukhan - Sun Microsystems static void 50115db2897SKrishnendu Sadhukhan - Sun Microsystems print_thread(pid_t pid, id_t tid) 50215db2897SKrishnendu Sadhukhan - Sun Microsystems { 50315db2897SKrishnendu Sadhukhan - Sun Microsystems void *list; 50415db2897SKrishnendu Sadhukhan - Sun Microsystems char header[256]; 50515db2897SKrishnendu Sadhukhan - Sun Microsystems char tmp[30]; 50615db2897SKrishnendu Sadhukhan - Sun Microsystems 50715db2897SKrishnendu Sadhukhan - Sun Microsystems if (!display_initialized) { 50815db2897SKrishnendu Sadhukhan - Sun Microsystems return; 50915db2897SKrishnendu Sadhukhan - Sun Microsystems } 51015db2897SKrishnendu Sadhukhan - Sun Microsystems 51115db2897SKrishnendu Sadhukhan - Sun Microsystems list = lt_stat_list_create(current_list_type, LT_LEVEL_THREAD, 51215db2897SKrishnendu Sadhukhan - Sun Microsystems pid, tid, 8, sort_type); 51315db2897SKrishnendu Sadhukhan - Sun Microsystems 51415db2897SKrishnendu Sadhukhan - Sun Microsystems (void) werase(process_window); 51515db2897SKrishnendu Sadhukhan - Sun Microsystems (void) wattron(process_window, A_REVERSE); 51615db2897SKrishnendu Sadhukhan - Sun Microsystems (void) snprintf(header, sizeof (header), 51715db2897SKrishnendu Sadhukhan - Sun Microsystems "Process %s (%i), LWP %d", 51815db2897SKrishnendu Sadhukhan - Sun Microsystems lt_stat_proc_get_name(pid), pid, tid); 51915db2897SKrishnendu Sadhukhan - Sun Microsystems fill_space_right(header, screen_width, sizeof (header)); 52015db2897SKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(process_window, 0, 0, "%s", header); 52115db2897SKrishnendu Sadhukhan - Sun Microsystems 52215db2897SKrishnendu Sadhukhan - Sun Microsystems if (current_list_type != LT_LIST_SPECIALS) { 52315db2897SKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(process_window, 0, 48, "Total: %s", 52415db2897SKrishnendu Sadhukhan - Sun Microsystems get_time_string( 52515db2897SKrishnendu Sadhukhan - Sun Microsystems (double)lt_stat_list_get_gtotal(list), 52615db2897SKrishnendu Sadhukhan - Sun Microsystems tmp, sizeof (tmp), 12)); 52715db2897SKrishnendu Sadhukhan - Sun Microsystems } 52815db2897SKrishnendu Sadhukhan - Sun Microsystems 52915db2897SKrishnendu Sadhukhan - Sun Microsystems print_current_mode(); 53015db2897SKrishnendu Sadhukhan - Sun Microsystems (void) wattroff(process_window, A_REVERSE); 53115db2897SKrishnendu Sadhukhan - Sun Microsystems print_statistics(process_window, 1, 8, list); 53215db2897SKrishnendu Sadhukhan - Sun Microsystems lt_stat_list_free(list); 53315db2897SKrishnendu Sadhukhan - Sun Microsystems (void) wrefresh(process_window); 53415db2897SKrishnendu Sadhukhan - Sun Microsystems } 53515db2897SKrishnendu Sadhukhan - Sun Microsystems 53615db2897SKrishnendu Sadhukhan - Sun Microsystems /* 53715db2897SKrishnendu Sadhukhan - Sun Microsystems * Update hint string at the bottom line. The message to print is stored in 53815db2897SKrishnendu Sadhukhan - Sun Microsystems * hint. If hint is NULL, the function will display its own message. 53915db2897SKrishnendu Sadhukhan - Sun Microsystems */ 54015db2897SKrishnendu Sadhukhan - Sun Microsystems static void 54115db2897SKrishnendu Sadhukhan - Sun Microsystems print_hint(const char *hint) 54215db2897SKrishnendu Sadhukhan - Sun Microsystems { 54315db2897SKrishnendu Sadhukhan - Sun Microsystems const char *HINTS[] = { 54415db2897SKrishnendu Sadhukhan - Sun Microsystems "Press '<' or '>' to switch between processes.", 54515db2897SKrishnendu Sadhukhan - Sun Microsystems "Press 'q' to exit.", 54615db2897SKrishnendu Sadhukhan - Sun Microsystems "Press 'r' to refresh immediately.", 54715db2897SKrishnendu Sadhukhan - Sun Microsystems "Press 't' to toggle Process/Thread display mode.", 54815db2897SKrishnendu Sadhukhan - Sun Microsystems "Press 'h' for help.", 549*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems "Use 'c', 'a', 'm', 'p' to change sort criteria.", 55015db2897SKrishnendu Sadhukhan - Sun Microsystems "Use '1', '2', '3' to switch between windows." 55115db2897SKrishnendu Sadhukhan - Sun Microsystems }; 55215db2897SKrishnendu Sadhukhan - Sun Microsystems const uint64_t update_interval = 5000; /* 5 seconds */ 55315db2897SKrishnendu Sadhukhan - Sun Microsystems 55415db2897SKrishnendu Sadhukhan - Sun Microsystems static int index = 0; 55515db2897SKrishnendu Sadhukhan - Sun Microsystems static uint64_t next_hint = 0; 55615db2897SKrishnendu Sadhukhan - Sun Microsystems uint64_t now = lt_millisecond(); 55715db2897SKrishnendu Sadhukhan - Sun Microsystems 55815db2897SKrishnendu Sadhukhan - Sun Microsystems if (!display_initialized) { 55915db2897SKrishnendu Sadhukhan - Sun Microsystems return; 56015db2897SKrishnendu Sadhukhan - Sun Microsystems } 56115db2897SKrishnendu Sadhukhan - Sun Microsystems 56215db2897SKrishnendu Sadhukhan - Sun Microsystems if (hint == NULL) { 56315db2897SKrishnendu Sadhukhan - Sun Microsystems if (now < next_hint) { 56415db2897SKrishnendu Sadhukhan - Sun Microsystems return; 56515db2897SKrishnendu Sadhukhan - Sun Microsystems } 56615db2897SKrishnendu Sadhukhan - Sun Microsystems 56715db2897SKrishnendu Sadhukhan - Sun Microsystems hint = HINTS[index]; 56815db2897SKrishnendu Sadhukhan - Sun Microsystems index = (index + 1) % (sizeof (HINTS) / sizeof (HINTS[0])); 56915db2897SKrishnendu Sadhukhan - Sun Microsystems next_hint = now + update_interval; 57015db2897SKrishnendu Sadhukhan - Sun Microsystems } else { 57115db2897SKrishnendu Sadhukhan - Sun Microsystems /* 57215db2897SKrishnendu Sadhukhan - Sun Microsystems * Important messages are displayed at least every 2 cycles. 57315db2897SKrishnendu Sadhukhan - Sun Microsystems */ 57415db2897SKrishnendu Sadhukhan - Sun Microsystems next_hint = now + update_interval * 2; 57515db2897SKrishnendu Sadhukhan - Sun Microsystems } 57615db2897SKrishnendu Sadhukhan - Sun Microsystems 57715db2897SKrishnendu Sadhukhan - Sun Microsystems (void) werase(hintbar); 57815db2897SKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(hintbar, 0, (screen_width - strlen(hint)) / 2, 57915db2897SKrishnendu Sadhukhan - Sun Microsystems "%s", hint); 58015db2897SKrishnendu Sadhukhan - Sun Microsystems (void) wrefresh(hintbar); 58115db2897SKrishnendu Sadhukhan - Sun Microsystems } 58215db2897SKrishnendu Sadhukhan - Sun Microsystems 58315db2897SKrishnendu Sadhukhan - Sun Microsystems /* 58415db2897SKrishnendu Sadhukhan - Sun Microsystems * Create a PID list or a PID/TID list (if operation mode is thread) from 58515db2897SKrishnendu Sadhukhan - Sun Microsystems * available statistics. 58615db2897SKrishnendu Sadhukhan - Sun Microsystems */ 58715db2897SKrishnendu Sadhukhan - Sun Microsystems static void 58815db2897SKrishnendu Sadhukhan - Sun Microsystems get_plist(pid_t **plist, id_t **tlist, int *list_len, int *list_index) 58915db2897SKrishnendu Sadhukhan - Sun Microsystems { 59015db2897SKrishnendu Sadhukhan - Sun Microsystems if (!thread_mode) { 59115db2897SKrishnendu Sadhukhan - Sun Microsystems /* Per-process mode */ 59215db2897SKrishnendu Sadhukhan - Sun Microsystems *list_len = lt_stat_proc_list_create(plist, NULL); 59315db2897SKrishnendu Sadhukhan - Sun Microsystems /* Search for previously selected PID */ 59415db2897SKrishnendu Sadhukhan - Sun Microsystems for (*list_index = 0; *list_index < *list_len && 59515db2897SKrishnendu Sadhukhan - Sun Microsystems (*plist)[*list_index] != selected_pid; 59615db2897SKrishnendu Sadhukhan - Sun Microsystems ++*list_index) { 59715db2897SKrishnendu Sadhukhan - Sun Microsystems } 59815db2897SKrishnendu Sadhukhan - Sun Microsystems 59915db2897SKrishnendu Sadhukhan - Sun Microsystems if (*list_index >= *list_len) { 60015db2897SKrishnendu Sadhukhan - Sun Microsystems /* 60115db2897SKrishnendu Sadhukhan - Sun Microsystems * The previously selected pid is gone. 60215db2897SKrishnendu Sadhukhan - Sun Microsystems * Select the first one. 60315db2897SKrishnendu Sadhukhan - Sun Microsystems */ 60415db2897SKrishnendu Sadhukhan - Sun Microsystems *list_index = 0; 60515db2897SKrishnendu Sadhukhan - Sun Microsystems } 60615db2897SKrishnendu Sadhukhan - Sun Microsystems } else { 60715db2897SKrishnendu Sadhukhan - Sun Microsystems /* Per-thread mode */ 60815db2897SKrishnendu Sadhukhan - Sun Microsystems *list_len = lt_stat_proc_list_create(plist, tlist); 60915db2897SKrishnendu Sadhukhan - Sun Microsystems 61015db2897SKrishnendu Sadhukhan - Sun Microsystems /* Search for previously selected PID & TID */ 61115db2897SKrishnendu Sadhukhan - Sun Microsystems for (*list_index = 0; *list_index < *list_len; 61215db2897SKrishnendu Sadhukhan - Sun Microsystems ++*list_index) { 61315db2897SKrishnendu Sadhukhan - Sun Microsystems if ((*plist)[*list_index] == selected_pid && 61415db2897SKrishnendu Sadhukhan - Sun Microsystems (*tlist)[*list_index] == selected_tid) { 61515db2897SKrishnendu Sadhukhan - Sun Microsystems break; 61615db2897SKrishnendu Sadhukhan - Sun Microsystems } 61715db2897SKrishnendu Sadhukhan - Sun Microsystems } 61815db2897SKrishnendu Sadhukhan - Sun Microsystems 61915db2897SKrishnendu Sadhukhan - Sun Microsystems if (*list_index >= *list_len) { 62015db2897SKrishnendu Sadhukhan - Sun Microsystems /* 62115db2897SKrishnendu Sadhukhan - Sun Microsystems * The previously selected pid/tid is gone. 62215db2897SKrishnendu Sadhukhan - Sun Microsystems * Select the first one. 62315db2897SKrishnendu Sadhukhan - Sun Microsystems */ 62415db2897SKrishnendu Sadhukhan - Sun Microsystems for (*list_index = 0; 62515db2897SKrishnendu Sadhukhan - Sun Microsystems *list_index < *list_len && 62615db2897SKrishnendu Sadhukhan - Sun Microsystems (*plist)[*list_index] != selected_pid; 62715db2897SKrishnendu Sadhukhan - Sun Microsystems ++*list_index) { 62815db2897SKrishnendu Sadhukhan - Sun Microsystems } 62915db2897SKrishnendu Sadhukhan - Sun Microsystems } 63015db2897SKrishnendu Sadhukhan - Sun Microsystems 63115db2897SKrishnendu Sadhukhan - Sun Microsystems if (*list_index >= *list_len) { 63215db2897SKrishnendu Sadhukhan - Sun Microsystems /* 63315db2897SKrishnendu Sadhukhan - Sun Microsystems * The previously selected pid is gone. 63415db2897SKrishnendu Sadhukhan - Sun Microsystems * Select the first one 63515db2897SKrishnendu Sadhukhan - Sun Microsystems */ 63615db2897SKrishnendu Sadhukhan - Sun Microsystems *list_index = 0; 63715db2897SKrishnendu Sadhukhan - Sun Microsystems } 63815db2897SKrishnendu Sadhukhan - Sun Microsystems } 63915db2897SKrishnendu Sadhukhan - Sun Microsystems } 64015db2897SKrishnendu Sadhukhan - Sun Microsystems 64115db2897SKrishnendu Sadhukhan - Sun Microsystems /* Print help message when user presses 'h' hot key */ 64215db2897SKrishnendu Sadhukhan - Sun Microsystems static void 64315db2897SKrishnendu Sadhukhan - Sun Microsystems print_help(void) 64415db2897SKrishnendu Sadhukhan - Sun Microsystems { 64515db2897SKrishnendu Sadhukhan - Sun Microsystems const char *HELP[] = { 64615db2897SKrishnendu Sadhukhan - Sun Microsystems TITLE, 64715db2897SKrishnendu Sadhukhan - Sun Microsystems COPYRIGHT, 64815db2897SKrishnendu Sadhukhan - Sun Microsystems "", 64915db2897SKrishnendu Sadhukhan - Sun Microsystems "These single-character commands are available:", 65015db2897SKrishnendu Sadhukhan - Sun Microsystems "< - Move to previous process/thread.", 65115db2897SKrishnendu Sadhukhan - Sun Microsystems "> - Move to next process/thread.", 65215db2897SKrishnendu Sadhukhan - Sun Microsystems "q - Exit.", 65315db2897SKrishnendu Sadhukhan - Sun Microsystems "r - Refresh.", 65415db2897SKrishnendu Sadhukhan - Sun Microsystems "t - Toggle process/thread mode.", 65515db2897SKrishnendu Sadhukhan - Sun Microsystems "c - Sort by count.", 65615db2897SKrishnendu Sadhukhan - Sun Microsystems "a - Sort by average.", 65715db2897SKrishnendu Sadhukhan - Sun Microsystems "m - Sort by maximum.", 65815db2897SKrishnendu Sadhukhan - Sun Microsystems "p - Sort by percent.", 65915db2897SKrishnendu Sadhukhan - Sun Microsystems "1 - Show list by causes.", 66015db2897SKrishnendu Sadhukhan - Sun Microsystems "2 - Show list of special entries.", 66115db2897SKrishnendu Sadhukhan - Sun Microsystems "3 - Show list by synchronization objects.", 66215db2897SKrishnendu Sadhukhan - Sun Microsystems "h - Show this help.", 66315db2897SKrishnendu Sadhukhan - Sun Microsystems "", 66415db2897SKrishnendu Sadhukhan - Sun Microsystems "Press any key to continue..." 66515db2897SKrishnendu Sadhukhan - Sun Microsystems }; 66615db2897SKrishnendu Sadhukhan - Sun Microsystems int i; 66715db2897SKrishnendu Sadhukhan - Sun Microsystems 66815db2897SKrishnendu Sadhukhan - Sun Microsystems if (!display_initialized) { 66915db2897SKrishnendu Sadhukhan - Sun Microsystems return; 67015db2897SKrishnendu Sadhukhan - Sun Microsystems } 67115db2897SKrishnendu Sadhukhan - Sun Microsystems 67215db2897SKrishnendu Sadhukhan - Sun Microsystems for (i = 0; i < sizeof (HELP) / sizeof (HELP[0]); ++i) { 67315db2897SKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(stdscr, i, 0, "%s", HELP[i]); 67415db2897SKrishnendu Sadhukhan - Sun Microsystems } 67515db2897SKrishnendu Sadhukhan - Sun Microsystems 67615db2897SKrishnendu Sadhukhan - Sun Microsystems (void) refresh(); 67715db2897SKrishnendu Sadhukhan - Sun Microsystems } 67815db2897SKrishnendu Sadhukhan - Sun Microsystems 67915db2897SKrishnendu Sadhukhan - Sun Microsystems /* 68015db2897SKrishnendu Sadhukhan - Sun Microsystems * Print title on screen 68115db2897SKrishnendu Sadhukhan - Sun Microsystems */ 68215db2897SKrishnendu Sadhukhan - Sun Microsystems static void 68315db2897SKrishnendu Sadhukhan - Sun Microsystems print_title(void) 68415db2897SKrishnendu Sadhukhan - Sun Microsystems { 68515db2897SKrishnendu Sadhukhan - Sun Microsystems if (!display_initialized) { 68615db2897SKrishnendu Sadhukhan - Sun Microsystems return; 68715db2897SKrishnendu Sadhukhan - Sun Microsystems } 68815db2897SKrishnendu Sadhukhan - Sun Microsystems 68915db2897SKrishnendu Sadhukhan - Sun Microsystems (void) wattrset(titlebar, COLOR_PAIR(LT_COLOR_HEADER)); 69015db2897SKrishnendu Sadhukhan - Sun Microsystems (void) wbkgd(titlebar, COLOR_PAIR(LT_COLOR_HEADER)); 69115db2897SKrishnendu Sadhukhan - Sun Microsystems (void) werase(titlebar); 69215db2897SKrishnendu Sadhukhan - Sun Microsystems 69315db2897SKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(titlebar, 0, (screen_width - strlen(TITLE)) / 2, 69415db2897SKrishnendu Sadhukhan - Sun Microsystems "%s", TITLE); 69515db2897SKrishnendu Sadhukhan - Sun Microsystems (void) wrefresh(titlebar); 69615db2897SKrishnendu Sadhukhan - Sun Microsystems 69715db2897SKrishnendu Sadhukhan - Sun Microsystems (void) werase(captionbar); 69815db2897SKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(captionbar, 0, 0, "%s", 69915db2897SKrishnendu Sadhukhan - Sun Microsystems " Cause " 70015db2897SKrishnendu Sadhukhan - Sun Microsystems "Count Average Maximum Percent"); 70115db2897SKrishnendu Sadhukhan - Sun Microsystems (void) wrefresh(captionbar); 70215db2897SKrishnendu Sadhukhan - Sun Microsystems 70315db2897SKrishnendu Sadhukhan - Sun Microsystems (void) wattrset(hintbar, COLOR_PAIR(LT_COLOR_HEADER)); 70415db2897SKrishnendu Sadhukhan - Sun Microsystems (void) wbkgd(hintbar, COLOR_PAIR(LT_COLOR_HEADER)); 70515db2897SKrishnendu Sadhukhan - Sun Microsystems } 70615db2897SKrishnendu Sadhukhan - Sun Microsystems 70715db2897SKrishnendu Sadhukhan - Sun Microsystems /* 70815db2897SKrishnendu Sadhukhan - Sun Microsystems * Handle signal from terminal resize 70915db2897SKrishnendu Sadhukhan - Sun Microsystems */ 71015db2897SKrishnendu Sadhukhan - Sun Microsystems /* ARGSUSED */ 71115db2897SKrishnendu Sadhukhan - Sun Microsystems static void 71215db2897SKrishnendu Sadhukhan - Sun Microsystems on_resize(int sig) 71315db2897SKrishnendu Sadhukhan - Sun Microsystems { 71415db2897SKrishnendu Sadhukhan - Sun Microsystems lt_gpipe_break("r"); 71515db2897SKrishnendu Sadhukhan - Sun Microsystems } 71615db2897SKrishnendu Sadhukhan - Sun Microsystems 71715db2897SKrishnendu Sadhukhan - Sun Microsystems /* 71815db2897SKrishnendu Sadhukhan - Sun Microsystems * Initialize display. Display will be cleared when this function returns. 71915db2897SKrishnendu Sadhukhan - Sun Microsystems */ 72015db2897SKrishnendu Sadhukhan - Sun Microsystems void 72115db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_init(void) 72215db2897SKrishnendu Sadhukhan - Sun Microsystems { 72315db2897SKrishnendu Sadhukhan - Sun Microsystems if (display_initialized) { 72415db2897SKrishnendu Sadhukhan - Sun Microsystems return; 72515db2897SKrishnendu Sadhukhan - Sun Microsystems } 72615db2897SKrishnendu Sadhukhan - Sun Microsystems 72715db2897SKrishnendu Sadhukhan - Sun Microsystems /* Window resize signal */ 72815db2897SKrishnendu Sadhukhan - Sun Microsystems (void) signal(SIGWINCH, on_resize); 72915db2897SKrishnendu Sadhukhan - Sun Microsystems 73015db2897SKrishnendu Sadhukhan - Sun Microsystems /* Initialize curses library */ 73115db2897SKrishnendu Sadhukhan - Sun Microsystems (void) initscr(); 73215db2897SKrishnendu Sadhukhan - Sun Microsystems (void) start_color(); 73315db2897SKrishnendu Sadhukhan - Sun Microsystems (void) keypad(stdscr, TRUE); 73415db2897SKrishnendu Sadhukhan - Sun Microsystems (void) nonl(); 73515db2897SKrishnendu Sadhukhan - Sun Microsystems (void) cbreak(); 73615db2897SKrishnendu Sadhukhan - Sun Microsystems (void) noecho(); 73715db2897SKrishnendu Sadhukhan - Sun Microsystems (void) curs_set(0); 73815db2897SKrishnendu Sadhukhan - Sun Microsystems 73915db2897SKrishnendu Sadhukhan - Sun Microsystems /* Set up color pairs */ 74015db2897SKrishnendu Sadhukhan - Sun Microsystems (void) init_pair(LT_COLOR_DEFAULT, COLOR_WHITE, COLOR_BLACK); 74115db2897SKrishnendu Sadhukhan - Sun Microsystems (void) init_pair(LT_COLOR_HEADER, COLOR_BLACK, COLOR_WHITE); 74215db2897SKrishnendu Sadhukhan - Sun Microsystems 74315db2897SKrishnendu Sadhukhan - Sun Microsystems curses_inited = TRUE; 74415db2897SKrishnendu Sadhukhan - Sun Microsystems getmaxyx(stdscr, screen_height, screen_width); 74515db2897SKrishnendu Sadhukhan - Sun Microsystems 74615db2897SKrishnendu Sadhukhan - Sun Microsystems if (screen_width < LT_WINDOW_X || screen_height < LT_WINDOW_Y) { 74715db2897SKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(stdscr, 0, 0, "Terminal size is too small."); 74815db2897SKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(stdscr, 1, 0, 74915db2897SKrishnendu Sadhukhan - Sun Microsystems "Please resize it to 80x24 or larger."); 75015db2897SKrishnendu Sadhukhan - Sun Microsystems (void) mvwprintw(stdscr, 2, 0, "Press q to quit."); 75115db2897SKrishnendu Sadhukhan - Sun Microsystems (void) refresh(); 75215db2897SKrishnendu Sadhukhan - Sun Microsystems return; 75315db2897SKrishnendu Sadhukhan - Sun Microsystems } 75415db2897SKrishnendu Sadhukhan - Sun Microsystems 75515db2897SKrishnendu Sadhukhan - Sun Microsystems /* Set up all window panes */ 75615db2897SKrishnendu Sadhukhan - Sun Microsystems titlebar = subwin(stdscr, 1, screen_width, 0, 0); 75715db2897SKrishnendu Sadhukhan - Sun Microsystems captionbar = subwin(stdscr, 1, screen_width, 1, 0); 75815db2897SKrishnendu Sadhukhan - Sun Microsystems sysglobal_window = subwin(stdscr, screen_height / 2 - 1, 75915db2897SKrishnendu Sadhukhan - Sun Microsystems screen_width, 2, 0); 76015db2897SKrishnendu Sadhukhan - Sun Microsystems process_window = subwin(stdscr, screen_height / 2 - 3, 76115db2897SKrishnendu Sadhukhan - Sun Microsystems screen_width, screen_height / 2 + 1, 0); 76215db2897SKrishnendu Sadhukhan - Sun Microsystems taskbar = subwin(stdscr, 1, screen_width, screen_height - 2, 0); 76315db2897SKrishnendu Sadhukhan - Sun Microsystems hintbar = subwin(stdscr, 1, screen_width, screen_height - 1, 0); 76415db2897SKrishnendu Sadhukhan - Sun Microsystems (void) werase(stdscr); 76515db2897SKrishnendu Sadhukhan - Sun Microsystems (void) refresh(); 76615db2897SKrishnendu Sadhukhan - Sun Microsystems 76715db2897SKrishnendu Sadhukhan - Sun Microsystems display_initialized = TRUE; 76815db2897SKrishnendu Sadhukhan - Sun Microsystems 76915db2897SKrishnendu Sadhukhan - Sun Microsystems print_title(); 77015db2897SKrishnendu Sadhukhan - Sun Microsystems } 77115db2897SKrishnendu Sadhukhan - Sun Microsystems 77215db2897SKrishnendu Sadhukhan - Sun Microsystems /* 77315db2897SKrishnendu Sadhukhan - Sun Microsystems * The event loop for display. It displays data on screen and handles hotkey 77415db2897SKrishnendu Sadhukhan - Sun Microsystems * presses. 77515db2897SKrishnendu Sadhukhan - Sun Microsystems * 77615db2897SKrishnendu Sadhukhan - Sun Microsystems * Parameter : 77715db2897SKrishnendu Sadhukhan - Sun Microsystems * duration - returns after 'duration' 77815db2897SKrishnendu Sadhukhan - Sun Microsystems * 77915db2897SKrishnendu Sadhukhan - Sun Microsystems * The function also returns if user presses 'q', 'Ctrl+C' or 'r'. 78015db2897SKrishnendu Sadhukhan - Sun Microsystems * 78115db2897SKrishnendu Sadhukhan - Sun Microsystems * Return value: 78215db2897SKrishnendu Sadhukhan - Sun Microsystems * 0 - main() exits 78315db2897SKrishnendu Sadhukhan - Sun Microsystems * 1 - main() calls it again 78415db2897SKrishnendu Sadhukhan - Sun Microsystems */ 78515db2897SKrishnendu Sadhukhan - Sun Microsystems int 78615db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_loop(int duration) 78715db2897SKrishnendu Sadhukhan - Sun Microsystems { 78815db2897SKrishnendu Sadhukhan - Sun Microsystems uint64_t start; 78915db2897SKrishnendu Sadhukhan - Sun Microsystems int remaining; 79015db2897SKrishnendu Sadhukhan - Sun Microsystems struct timeval timeout; 79115db2897SKrishnendu Sadhukhan - Sun Microsystems fd_set read_fd; 79215db2897SKrishnendu Sadhukhan - Sun Microsystems int need_refresh = TRUE; 79315db2897SKrishnendu Sadhukhan - Sun Microsystems pid_t *plist = NULL; 79415db2897SKrishnendu Sadhukhan - Sun Microsystems id_t *tlist = NULL; 79515db2897SKrishnendu Sadhukhan - Sun Microsystems int list_len = 0; 79615db2897SKrishnendu Sadhukhan - Sun Microsystems int list_index = 0; 79715db2897SKrishnendu Sadhukhan - Sun Microsystems int retval = 1; 79815db2897SKrishnendu Sadhukhan - Sun Microsystems int next_snap; 79915db2897SKrishnendu Sadhukhan - Sun Microsystems int gpipe; 80015db2897SKrishnendu Sadhukhan - Sun Microsystems 80115db2897SKrishnendu Sadhukhan - Sun Microsystems start = lt_millisecond(); 80215db2897SKrishnendu Sadhukhan - Sun Microsystems gpipe = lt_gpipe_readfd(); 80315db2897SKrishnendu Sadhukhan - Sun Microsystems 80415db2897SKrishnendu Sadhukhan - Sun Microsystems if (!show_help) { 80515db2897SKrishnendu Sadhukhan - Sun Microsystems print_hint(NULL); 80615db2897SKrishnendu Sadhukhan - Sun Microsystems print_sysglobal(); 80715db2897SKrishnendu Sadhukhan - Sun Microsystems } 80815db2897SKrishnendu Sadhukhan - Sun Microsystems 80915db2897SKrishnendu Sadhukhan - Sun Microsystems get_plist(&plist, &tlist, &list_len, &list_index); 81015db2897SKrishnendu Sadhukhan - Sun Microsystems 81115db2897SKrishnendu Sadhukhan - Sun Microsystems for (;;) { 812*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems if (need_refresh && !show_help) { 813*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems if (list_len != 0) { 81415db2897SKrishnendu Sadhukhan - Sun Microsystems if (!thread_mode) { 81515db2897SKrishnendu Sadhukhan - Sun Microsystems print_taskbar_process(plist, list_len, 81615db2897SKrishnendu Sadhukhan - Sun Microsystems list_index); 81715db2897SKrishnendu Sadhukhan - Sun Microsystems print_process(plist[list_index]); 81815db2897SKrishnendu Sadhukhan - Sun Microsystems } else { 81915db2897SKrishnendu Sadhukhan - Sun Microsystems print_taskbar_thread(plist, tlist, 82015db2897SKrishnendu Sadhukhan - Sun Microsystems list_len, list_index); 82115db2897SKrishnendu Sadhukhan - Sun Microsystems print_thread(plist[list_index], 82215db2897SKrishnendu Sadhukhan - Sun Microsystems tlist[list_index]); 82315db2897SKrishnendu Sadhukhan - Sun Microsystems } 824*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems } else { 825*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems print_empty_process_bar(); 826*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems } 82715db2897SKrishnendu Sadhukhan - Sun Microsystems } 82815db2897SKrishnendu Sadhukhan - Sun Microsystems 82915db2897SKrishnendu Sadhukhan - Sun Microsystems need_refresh = TRUE; /* Usually we need refresh. */ 83015db2897SKrishnendu Sadhukhan - Sun Microsystems remaining = duration - (int)(lt_millisecond() - start); 83115db2897SKrishnendu Sadhukhan - Sun Microsystems 83215db2897SKrishnendu Sadhukhan - Sun Microsystems if (remaining <= 0) { 83315db2897SKrishnendu Sadhukhan - Sun Microsystems break; 83415db2897SKrishnendu Sadhukhan - Sun Microsystems } 83515db2897SKrishnendu Sadhukhan - Sun Microsystems 83615db2897SKrishnendu Sadhukhan - Sun Microsystems /* Embedded dtrace snap action here. */ 83715db2897SKrishnendu Sadhukhan - Sun Microsystems next_snap = lt_dtrace_work(0); 83815db2897SKrishnendu Sadhukhan - Sun Microsystems 83915db2897SKrishnendu Sadhukhan - Sun Microsystems if (next_snap == 0) { 84015db2897SKrishnendu Sadhukhan - Sun Microsystems /* 84115db2897SKrishnendu Sadhukhan - Sun Microsystems * Just did a snap, check time for the next one. 84215db2897SKrishnendu Sadhukhan - Sun Microsystems */ 84315db2897SKrishnendu Sadhukhan - Sun Microsystems next_snap = lt_dtrace_work(0); 84415db2897SKrishnendu Sadhukhan - Sun Microsystems } 84515db2897SKrishnendu Sadhukhan - Sun Microsystems 84615db2897SKrishnendu Sadhukhan - Sun Microsystems if (next_snap > 0 && remaining > next_snap) { 84715db2897SKrishnendu Sadhukhan - Sun Microsystems remaining = next_snap; 84815db2897SKrishnendu Sadhukhan - Sun Microsystems } 84915db2897SKrishnendu Sadhukhan - Sun Microsystems 85015db2897SKrishnendu Sadhukhan - Sun Microsystems timeout.tv_sec = remaining / 1000; 85115db2897SKrishnendu Sadhukhan - Sun Microsystems timeout.tv_usec = (remaining % 1000) * 1000; 85215db2897SKrishnendu Sadhukhan - Sun Microsystems 85315db2897SKrishnendu Sadhukhan - Sun Microsystems FD_ZERO(&read_fd); 85415db2897SKrishnendu Sadhukhan - Sun Microsystems FD_SET(0, &read_fd); 85515db2897SKrishnendu Sadhukhan - Sun Microsystems FD_SET(gpipe, &read_fd); 85615db2897SKrishnendu Sadhukhan - Sun Microsystems 85715db2897SKrishnendu Sadhukhan - Sun Microsystems /* Wait for keyboard input, or signal from gpipe */ 85815db2897SKrishnendu Sadhukhan - Sun Microsystems if (select(gpipe + 1, &read_fd, NULL, NULL, &timeout) > 0) { 85915db2897SKrishnendu Sadhukhan - Sun Microsystems int k = 0; 86015db2897SKrishnendu Sadhukhan - Sun Microsystems 86115db2897SKrishnendu Sadhukhan - Sun Microsystems if (FD_ISSET(gpipe, &read_fd)) { 86215db2897SKrishnendu Sadhukhan - Sun Microsystems /* Data from pipe has priority */ 86315db2897SKrishnendu Sadhukhan - Sun Microsystems char ch; 86415db2897SKrishnendu Sadhukhan - Sun Microsystems (void) read(gpipe, &ch, 1); 86515db2897SKrishnendu Sadhukhan - Sun Microsystems k = ch; /* Need this for big-endianness */ 86615db2897SKrishnendu Sadhukhan - Sun Microsystems } else { 86715db2897SKrishnendu Sadhukhan - Sun Microsystems k = getch(); 86815db2897SKrishnendu Sadhukhan - Sun Microsystems } 86915db2897SKrishnendu Sadhukhan - Sun Microsystems 87015db2897SKrishnendu Sadhukhan - Sun Microsystems /* 87115db2897SKrishnendu Sadhukhan - Sun Microsystems * Check if we need to update the hint line whenever we 87215db2897SKrishnendu Sadhukhan - Sun Microsystems * get a chance. 87315db2897SKrishnendu Sadhukhan - Sun Microsystems * NOTE: current implementation depends on 87415db2897SKrishnendu Sadhukhan - Sun Microsystems * g_config.lt_cfg_snap_interval, but it's OK because it 87515db2897SKrishnendu Sadhukhan - Sun Microsystems * doesn't have to be precise. 87615db2897SKrishnendu Sadhukhan - Sun Microsystems */ 87715db2897SKrishnendu Sadhukhan - Sun Microsystems print_hint(NULL); 87815db2897SKrishnendu Sadhukhan - Sun Microsystems /* 87915db2897SKrishnendu Sadhukhan - Sun Microsystems * If help is on display right now, and a key press 88015db2897SKrishnendu Sadhukhan - Sun Microsystems * happens, we need to clear the help and continue. 88115db2897SKrishnendu Sadhukhan - Sun Microsystems */ 88215db2897SKrishnendu Sadhukhan - Sun Microsystems if (show_help) { 88315db2897SKrishnendu Sadhukhan - Sun Microsystems (void) werase(stdscr); 88415db2897SKrishnendu Sadhukhan - Sun Microsystems (void) refresh(); 88515db2897SKrishnendu Sadhukhan - Sun Microsystems print_title(); 88615db2897SKrishnendu Sadhukhan - Sun Microsystems print_sysglobal(); 88715db2897SKrishnendu Sadhukhan - Sun Microsystems show_help = FALSE; 88815db2897SKrishnendu Sadhukhan - Sun Microsystems /* Drop this key and continue */ 88915db2897SKrishnendu Sadhukhan - Sun Microsystems continue; 89015db2897SKrishnendu Sadhukhan - Sun Microsystems } 89115db2897SKrishnendu Sadhukhan - Sun Microsystems 89215db2897SKrishnendu Sadhukhan - Sun Microsystems switch (k) { 89315db2897SKrishnendu Sadhukhan - Sun Microsystems case 'Q': 89415db2897SKrishnendu Sadhukhan - Sun Microsystems case 'q': 89515db2897SKrishnendu Sadhukhan - Sun Microsystems retval = 0; 89615db2897SKrishnendu Sadhukhan - Sun Microsystems goto quit; 89715db2897SKrishnendu Sadhukhan - Sun Microsystems case 'R': 89815db2897SKrishnendu Sadhukhan - Sun Microsystems case 'r': 89915db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_deinit(); 90015db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_init(); 90115db2897SKrishnendu Sadhukhan - Sun Microsystems goto quit; 90215db2897SKrishnendu Sadhukhan - Sun Microsystems case 'H': 90315db2897SKrishnendu Sadhukhan - Sun Microsystems case 'h': 90415db2897SKrishnendu Sadhukhan - Sun Microsystems show_help = TRUE; 90515db2897SKrishnendu Sadhukhan - Sun Microsystems (void) werase(stdscr); 90615db2897SKrishnendu Sadhukhan - Sun Microsystems (void) refresh(); 90715db2897SKrishnendu Sadhukhan - Sun Microsystems print_help(); 90815db2897SKrishnendu Sadhukhan - Sun Microsystems break; 90915db2897SKrishnendu Sadhukhan - Sun Microsystems case ',': 91015db2897SKrishnendu Sadhukhan - Sun Microsystems case '<': 91115db2897SKrishnendu Sadhukhan - Sun Microsystems case KEY_LEFT: 91215db2897SKrishnendu Sadhukhan - Sun Microsystems --list_index; 91315db2897SKrishnendu Sadhukhan - Sun Microsystems 91415db2897SKrishnendu Sadhukhan - Sun Microsystems if (list_index < 0) { 91515db2897SKrishnendu Sadhukhan - Sun Microsystems list_index = 0; 91615db2897SKrishnendu Sadhukhan - Sun Microsystems } 91715db2897SKrishnendu Sadhukhan - Sun Microsystems 91815db2897SKrishnendu Sadhukhan - Sun Microsystems break; 91915db2897SKrishnendu Sadhukhan - Sun Microsystems case '.': 92015db2897SKrishnendu Sadhukhan - Sun Microsystems case '>': 92115db2897SKrishnendu Sadhukhan - Sun Microsystems case KEY_RIGHT: 92215db2897SKrishnendu Sadhukhan - Sun Microsystems ++list_index; 92315db2897SKrishnendu Sadhukhan - Sun Microsystems 92415db2897SKrishnendu Sadhukhan - Sun Microsystems if (list_index >= list_len) { 92515db2897SKrishnendu Sadhukhan - Sun Microsystems list_index = list_len - 1; 92615db2897SKrishnendu Sadhukhan - Sun Microsystems } 92715db2897SKrishnendu Sadhukhan - Sun Microsystems 92815db2897SKrishnendu Sadhukhan - Sun Microsystems break; 92915db2897SKrishnendu Sadhukhan - Sun Microsystems case 'a': 93015db2897SKrishnendu Sadhukhan - Sun Microsystems case 'A': 93115db2897SKrishnendu Sadhukhan - Sun Microsystems sort_type = LT_SORT_AVG; 93215db2897SKrishnendu Sadhukhan - Sun Microsystems print_sysglobal(); 93315db2897SKrishnendu Sadhukhan - Sun Microsystems break; 93415db2897SKrishnendu Sadhukhan - Sun Microsystems case 'p': 93515db2897SKrishnendu Sadhukhan - Sun Microsystems case 'P': 93615db2897SKrishnendu Sadhukhan - Sun Microsystems sort_type = LT_SORT_TOTAL; 93715db2897SKrishnendu Sadhukhan - Sun Microsystems print_sysglobal(); 93815db2897SKrishnendu Sadhukhan - Sun Microsystems break; 93915db2897SKrishnendu Sadhukhan - Sun Microsystems case 'm': 94015db2897SKrishnendu Sadhukhan - Sun Microsystems case 'M': 94115db2897SKrishnendu Sadhukhan - Sun Microsystems sort_type = LT_SORT_MAX; 94215db2897SKrishnendu Sadhukhan - Sun Microsystems print_sysglobal(); 94315db2897SKrishnendu Sadhukhan - Sun Microsystems break; 94415db2897SKrishnendu Sadhukhan - Sun Microsystems case 'c': 94515db2897SKrishnendu Sadhukhan - Sun Microsystems case 'C': 94615db2897SKrishnendu Sadhukhan - Sun Microsystems sort_type = LT_SORT_COUNT; 94715db2897SKrishnendu Sadhukhan - Sun Microsystems print_sysglobal(); 94815db2897SKrishnendu Sadhukhan - Sun Microsystems break; 94915db2897SKrishnendu Sadhukhan - Sun Microsystems case 't': 95015db2897SKrishnendu Sadhukhan - Sun Microsystems case 'T': 95115db2897SKrishnendu Sadhukhan - Sun Microsystems if (plist != NULL) { 95215db2897SKrishnendu Sadhukhan - Sun Microsystems selected_pid = plist[list_index]; 95315db2897SKrishnendu Sadhukhan - Sun Microsystems } 95415db2897SKrishnendu Sadhukhan - Sun Microsystems 95515db2897SKrishnendu Sadhukhan - Sun Microsystems selected_tid = INVALID_TID; 95615db2897SKrishnendu Sadhukhan - Sun Microsystems thread_mode = !thread_mode; 95715db2897SKrishnendu Sadhukhan - Sun Microsystems get_plist(&plist, &tlist, 95815db2897SKrishnendu Sadhukhan - Sun Microsystems &list_len, &list_index); 95915db2897SKrishnendu Sadhukhan - Sun Microsystems break; 96015db2897SKrishnendu Sadhukhan - Sun Microsystems case '1': 96115db2897SKrishnendu Sadhukhan - Sun Microsystems case '!': 96215db2897SKrishnendu Sadhukhan - Sun Microsystems current_list_type = LT_LIST_CAUSE; 96315db2897SKrishnendu Sadhukhan - Sun Microsystems print_sysglobal(); 96415db2897SKrishnendu Sadhukhan - Sun Microsystems break; 96515db2897SKrishnendu Sadhukhan - Sun Microsystems case '2': 96615db2897SKrishnendu Sadhukhan - Sun Microsystems case '@': 96715db2897SKrishnendu Sadhukhan - Sun Microsystems if (g_config.lt_cfg_low_overhead_mode) { 96815db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_error("Switching mode is " 96915db2897SKrishnendu Sadhukhan - Sun Microsystems "not available for '-f low'."); 97015db2897SKrishnendu Sadhukhan - Sun Microsystems } else { 97115db2897SKrishnendu Sadhukhan - Sun Microsystems current_list_type = LT_LIST_SPECIALS; 97215db2897SKrishnendu Sadhukhan - Sun Microsystems print_sysglobal(); 97315db2897SKrishnendu Sadhukhan - Sun Microsystems } 97415db2897SKrishnendu Sadhukhan - Sun Microsystems 97515db2897SKrishnendu Sadhukhan - Sun Microsystems break; 97615db2897SKrishnendu Sadhukhan - Sun Microsystems case '3': 97715db2897SKrishnendu Sadhukhan - Sun Microsystems case '#': 97815db2897SKrishnendu Sadhukhan - Sun Microsystems if (g_config.lt_cfg_trace_syncobj) { 97915db2897SKrishnendu Sadhukhan - Sun Microsystems current_list_type = LT_LIST_SOBJ; 98015db2897SKrishnendu Sadhukhan - Sun Microsystems print_sysglobal(); 98115db2897SKrishnendu Sadhukhan - Sun Microsystems } else if (g_config.lt_cfg_low_overhead_mode) { 98215db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_error("Switching mode is " 98315db2897SKrishnendu Sadhukhan - Sun Microsystems "not available for '-f low'."); 98415db2897SKrishnendu Sadhukhan - Sun Microsystems } else { 98515db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_error("Tracing " 98615db2897SKrishnendu Sadhukhan - Sun Microsystems "synchronization objects is " 98715db2897SKrishnendu Sadhukhan - Sun Microsystems "disabled."); 98815db2897SKrishnendu Sadhukhan - Sun Microsystems } 98915db2897SKrishnendu Sadhukhan - Sun Microsystems 99015db2897SKrishnendu Sadhukhan - Sun Microsystems break; 99115db2897SKrishnendu Sadhukhan - Sun Microsystems default: 99215db2897SKrishnendu Sadhukhan - Sun Microsystems /* Wake up for nothing; no refresh is needed */ 99315db2897SKrishnendu Sadhukhan - Sun Microsystems need_refresh = FALSE; 99415db2897SKrishnendu Sadhukhan - Sun Microsystems break; 99515db2897SKrishnendu Sadhukhan - Sun Microsystems } 99615db2897SKrishnendu Sadhukhan - Sun Microsystems } else { 99715db2897SKrishnendu Sadhukhan - Sun Microsystems need_refresh = FALSE; 99815db2897SKrishnendu Sadhukhan - Sun Microsystems } 99915db2897SKrishnendu Sadhukhan - Sun Microsystems } 100015db2897SKrishnendu Sadhukhan - Sun Microsystems 100115db2897SKrishnendu Sadhukhan - Sun Microsystems quit: 100215db2897SKrishnendu Sadhukhan - Sun Microsystems if (plist != NULL) { 100315db2897SKrishnendu Sadhukhan - Sun Microsystems selected_pid = plist[list_index]; 100415db2897SKrishnendu Sadhukhan - Sun Microsystems } 100515db2897SKrishnendu Sadhukhan - Sun Microsystems 100615db2897SKrishnendu Sadhukhan - Sun Microsystems if (tlist != NULL) { 100715db2897SKrishnendu Sadhukhan - Sun Microsystems selected_tid = tlist[list_index]; 100815db2897SKrishnendu Sadhukhan - Sun Microsystems } 100915db2897SKrishnendu Sadhukhan - Sun Microsystems 101015db2897SKrishnendu Sadhukhan - Sun Microsystems lt_stat_proc_list_free(plist, tlist); 101115db2897SKrishnendu Sadhukhan - Sun Microsystems 101215db2897SKrishnendu Sadhukhan - Sun Microsystems return (retval); 101315db2897SKrishnendu Sadhukhan - Sun Microsystems } 101415db2897SKrishnendu Sadhukhan - Sun Microsystems 101515db2897SKrishnendu Sadhukhan - Sun Microsystems /* 101615db2897SKrishnendu Sadhukhan - Sun Microsystems * Clean up display. 101715db2897SKrishnendu Sadhukhan - Sun Microsystems */ 101815db2897SKrishnendu Sadhukhan - Sun Microsystems void 101915db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_deinit(void) 102015db2897SKrishnendu Sadhukhan - Sun Microsystems { 102115db2897SKrishnendu Sadhukhan - Sun Microsystems if (curses_inited) { 102215db2897SKrishnendu Sadhukhan - Sun Microsystems (void) clear(); 102315db2897SKrishnendu Sadhukhan - Sun Microsystems (void) refresh(); 102415db2897SKrishnendu Sadhukhan - Sun Microsystems (void) endwin(); 102515db2897SKrishnendu Sadhukhan - Sun Microsystems } 102615db2897SKrishnendu Sadhukhan - Sun Microsystems 102715db2897SKrishnendu Sadhukhan - Sun Microsystems titlebar = NULL; 102815db2897SKrishnendu Sadhukhan - Sun Microsystems captionbar = NULL; 102915db2897SKrishnendu Sadhukhan - Sun Microsystems sysglobal_window = NULL; 103015db2897SKrishnendu Sadhukhan - Sun Microsystems taskbar = NULL; 103115db2897SKrishnendu Sadhukhan - Sun Microsystems process_window = NULL; 103215db2897SKrishnendu Sadhukhan - Sun Microsystems hintbar = NULL; 103315db2897SKrishnendu Sadhukhan - Sun Microsystems screen_width = 1; 103415db2897SKrishnendu Sadhukhan - Sun Microsystems screen_height = 1; 103515db2897SKrishnendu Sadhukhan - Sun Microsystems 103615db2897SKrishnendu Sadhukhan - Sun Microsystems display_initialized = FALSE; 103715db2897SKrishnendu Sadhukhan - Sun Microsystems curses_inited = FALSE; 103815db2897SKrishnendu Sadhukhan - Sun Microsystems } 103915db2897SKrishnendu Sadhukhan - Sun Microsystems 104015db2897SKrishnendu Sadhukhan - Sun Microsystems /* 104115db2897SKrishnendu Sadhukhan - Sun Microsystems * Print message when display error happens. 104215db2897SKrishnendu Sadhukhan - Sun Microsystems */ 104315db2897SKrishnendu Sadhukhan - Sun Microsystems /* ARGSUSED */ 104415db2897SKrishnendu Sadhukhan - Sun Microsystems void 104515db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_error(const char *fmt, ...) 104615db2897SKrishnendu Sadhukhan - Sun Microsystems { 104715db2897SKrishnendu Sadhukhan - Sun Microsystems va_list vl; 104815db2897SKrishnendu Sadhukhan - Sun Microsystems char tmp[81]; 104915db2897SKrishnendu Sadhukhan - Sun Microsystems int l; 105015db2897SKrishnendu Sadhukhan - Sun Microsystems 105115db2897SKrishnendu Sadhukhan - Sun Microsystems va_start(vl, fmt); 105215db2897SKrishnendu Sadhukhan - Sun Microsystems (void) vsnprintf(tmp, sizeof (tmp), fmt, vl); 105315db2897SKrishnendu Sadhukhan - Sun Microsystems va_end(vl); 105415db2897SKrishnendu Sadhukhan - Sun Microsystems 105515db2897SKrishnendu Sadhukhan - Sun Microsystems l = strlen(tmp); 105615db2897SKrishnendu Sadhukhan - Sun Microsystems 105715db2897SKrishnendu Sadhukhan - Sun Microsystems while (l > 0 && (tmp[l - 1] == '\n' || tmp[l - 1] == '\r')) { 105815db2897SKrishnendu Sadhukhan - Sun Microsystems tmp[l - 1] = '\0'; 105915db2897SKrishnendu Sadhukhan - Sun Microsystems --l; 106015db2897SKrishnendu Sadhukhan - Sun Microsystems } 106115db2897SKrishnendu Sadhukhan - Sun Microsystems 106215db2897SKrishnendu Sadhukhan - Sun Microsystems if (!display_initialized) { 106315db2897SKrishnendu Sadhukhan - Sun Microsystems (void) fprintf(stderr, "%s\n", tmp); 106415db2897SKrishnendu Sadhukhan - Sun Microsystems } else if (!show_help) { 106515db2897SKrishnendu Sadhukhan - Sun Microsystems print_hint(tmp); 106615db2897SKrishnendu Sadhukhan - Sun Microsystems } 106715db2897SKrishnendu Sadhukhan - Sun Microsystems 106815db2897SKrishnendu Sadhukhan - Sun Microsystems } 1069