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