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
fill_space(char * buffer,int len,int buffer_limit,int is_right)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 *
get_time_string(double nanoseconds,char * buffer,int len,int fill_width)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
print_statistics(WINDOW * window,int begin_line,int nlines,void * list)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
print_sysglobal(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
print_current_mode()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 
274*a9c12afdSKrishnendu 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
print_empty_process_bar()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 
29915db2897SKrishnendu 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
print_process(unsigned int pid)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
print_taskbar_process(pid_t * pidlist,int pidlist_len,int pidlist_index)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
print_taskbar_thread(pid_t * pidlist,id_t * tidlist,int list_len,int list_index)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
print_thread(pid_t pid,id_t tid)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
print_hint(const char * hint)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
get_plist(pid_t ** plist,id_t ** tlist,int * list_len,int * list_index)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
print_help(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
print_title(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
on_resize(int sig)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
lt_display_init(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
lt_display_loop(int duration)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) {
814*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 				if (!thread_mode) {
815*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 					print_taskbar_process(plist, list_len,
816*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 					    list_index);
817*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 					print_process(plist[list_index]);
818*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 				} else {
819*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 					print_taskbar_thread(plist, tlist,
820*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 					    list_len, list_index);
821*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 					print_thread(plist[list_index],
822*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 					    tlist[list_index]);
823*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 				}
82415db2897SKrishnendu Sadhukhan - Sun Microsystems 			} else {
825*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 				print_empty_process_bar();
82615db2897SKrishnendu 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
lt_display_deinit(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
lt_display_error(const char * fmt,...)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