xref: /titanic_41/usr/src/cmd/latencytop/common/latencytop.c (revision a9c12afde877c596eed286ac3f1d518246e5cd1e)
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 <unistd.h>
2715db2897SKrishnendu Sadhukhan - Sun Microsystems #include <getopt.h>
2815db2897SKrishnendu Sadhukhan - Sun Microsystems #include <stdio.h>
2915db2897SKrishnendu Sadhukhan - Sun Microsystems #include <string.h>
3015db2897SKrishnendu Sadhukhan - Sun Microsystems #include <stdlib.h>
3115db2897SKrishnendu Sadhukhan - Sun Microsystems #include <limits.h>
3215db2897SKrishnendu Sadhukhan - Sun Microsystems #include <libgen.h>
3315db2897SKrishnendu Sadhukhan - Sun Microsystems #include <signal.h>
3415db2897SKrishnendu Sadhukhan - Sun Microsystems #include "latencytop.h"
3515db2897SKrishnendu Sadhukhan - Sun Microsystems 
3615db2897SKrishnendu Sadhukhan - Sun Microsystems #define	CMPOPT(a, b)	strncmp((a), (b), sizeof (b))
3715db2897SKrishnendu Sadhukhan - Sun Microsystems 
381a1f79f5SKrishnendu Sadhukhan - Sun Microsystems /*
391a1f79f5SKrishnendu Sadhukhan - Sun Microsystems  * This variable is used to check if "dynamic variable drop" in dtrace
401a1f79f5SKrishnendu Sadhukhan - Sun Microsystems  * has happened.
411a1f79f5SKrishnendu Sadhukhan - Sun Microsystems  */
421a1f79f5SKrishnendu Sadhukhan - Sun Microsystems boolean_t lt_drop_detected = 0;
431a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 
4415db2897SKrishnendu Sadhukhan - Sun Microsystems lt_config_t g_config;
4515db2897SKrishnendu Sadhukhan - Sun Microsystems 
4615db2897SKrishnendu Sadhukhan - Sun Microsystems typedef enum {
4715db2897SKrishnendu Sadhukhan - Sun Microsystems 	LT_CMDOPT_INTERVAL,
4815db2897SKrishnendu Sadhukhan - Sun Microsystems 	LT_CMDOPT_LOG_FILE,
4915db2897SKrishnendu Sadhukhan - Sun Microsystems 	LT_CMDOPT_LOG_LEVEL,
5015db2897SKrishnendu Sadhukhan - Sun Microsystems 	LT_CMDOPT_LOG_INTERVAL,
5115db2897SKrishnendu Sadhukhan - Sun Microsystems 	LT_CMDOPT_CONFIG_FILE,
5215db2897SKrishnendu Sadhukhan - Sun Microsystems 	LT_CMDOPT_F_FILTER,
5315db2897SKrishnendu Sadhukhan - Sun Microsystems 	LT_CMDOPT_F_SCHED,
5415db2897SKrishnendu Sadhukhan - Sun Microsystems 	LT_CMDOPT_F_SOBJ,
5515db2897SKrishnendu Sadhukhan - Sun Microsystems 	LT_CMDOPT_F_LOW,
56*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 	LT_CMDOPT_SELECT,
57*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 	LT_CMDOPT__LAST	/* Must be the last one */
5815db2897SKrishnendu Sadhukhan - Sun Microsystems } lt_cmd_option_id_t;
5915db2897SKrishnendu Sadhukhan - Sun Microsystems 
6015db2897SKrishnendu Sadhukhan - Sun Microsystems /*
6115db2897SKrishnendu Sadhukhan - Sun Microsystems  * Check for duplicate command line options.
6215db2897SKrishnendu Sadhukhan - Sun Microsystems  * Returns TRUE if duplicate options with different values are found,
6315db2897SKrishnendu Sadhukhan - Sun Microsystems  * returns FALSE otherwise.
6415db2897SKrishnendu Sadhukhan - Sun Microsystems  */
6515db2897SKrishnendu Sadhukhan - Sun Microsystems static int
check_opt_dup(lt_cmd_option_id_t id,uint64_t value)6615db2897SKrishnendu Sadhukhan - Sun Microsystems check_opt_dup(lt_cmd_option_id_t id, uint64_t value) {
6715db2897SKrishnendu Sadhukhan - Sun Microsystems 
6815db2897SKrishnendu Sadhukhan - Sun Microsystems 	static int opt_set[(int)LT_CMDOPT__LAST];
6915db2897SKrishnendu Sadhukhan - Sun Microsystems 	static uint64_t opt_val[(int)LT_CMDOPT__LAST];
7015db2897SKrishnendu Sadhukhan - Sun Microsystems 
7115db2897SKrishnendu Sadhukhan - Sun Microsystems 	const char *errmsg[] = {
7215db2897SKrishnendu Sadhukhan - Sun Microsystems 		"-t is set more than once with different values.",
7315db2897SKrishnendu Sadhukhan - Sun Microsystems 		"-o is set more than once.",
7415db2897SKrishnendu Sadhukhan - Sun Microsystems 		"-k is set more than once with different values.",
7515db2897SKrishnendu Sadhukhan - Sun Microsystems 		"-l is set more than once with different values.",
7615db2897SKrishnendu Sadhukhan - Sun Microsystems 		"-c is set more than once.",
7715db2897SKrishnendu Sadhukhan - Sun Microsystems 		"-f [no]filter is set more than once with different values.",
7815db2897SKrishnendu Sadhukhan - Sun Microsystems 		"-f [no]sched is set more than once with different values.",
7915db2897SKrishnendu Sadhukhan - Sun Microsystems 		"-f [no]sobj is set more than once with different values.",
8015db2897SKrishnendu Sadhukhan - Sun Microsystems 		"-f [no]low is set more than once with different values.",
81*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 		"-s is set more than once with different values."
8215db2897SKrishnendu Sadhukhan - Sun Microsystems 	};
8315db2897SKrishnendu Sadhukhan - Sun Microsystems 
8415db2897SKrishnendu Sadhukhan - Sun Microsystems 	g_assert(sizeof (errmsg)/sizeof (errmsg[0]) == (int)LT_CMDOPT__LAST);
8515db2897SKrishnendu Sadhukhan - Sun Microsystems 
8615db2897SKrishnendu Sadhukhan - Sun Microsystems 	if (!opt_set[(int)id]) {
8715db2897SKrishnendu Sadhukhan - Sun Microsystems 		opt_set[(int)id] = TRUE;
8815db2897SKrishnendu Sadhukhan - Sun Microsystems 		opt_val[(int)id] = value;
8915db2897SKrishnendu Sadhukhan - Sun Microsystems 		return (FALSE);
9015db2897SKrishnendu Sadhukhan - Sun Microsystems 	}
9115db2897SKrishnendu Sadhukhan - Sun Microsystems 
9215db2897SKrishnendu Sadhukhan - Sun Microsystems 	if (opt_val[(int)id] != value) {
9315db2897SKrishnendu Sadhukhan - Sun Microsystems 		(void) fprintf(stderr, "%s\n", errmsg[(int)id]);
9415db2897SKrishnendu Sadhukhan - Sun Microsystems 		return (TRUE);
9515db2897SKrishnendu Sadhukhan - Sun Microsystems 	}
9615db2897SKrishnendu Sadhukhan - Sun Microsystems 
9715db2897SKrishnendu Sadhukhan - Sun Microsystems 	return (FALSE);
9815db2897SKrishnendu Sadhukhan - Sun Microsystems }
9915db2897SKrishnendu Sadhukhan - Sun Microsystems 
10015db2897SKrishnendu Sadhukhan - Sun Microsystems /*
10115db2897SKrishnendu Sadhukhan - Sun Microsystems  * Print command-line help message.
10215db2897SKrishnendu Sadhukhan - Sun Microsystems  */
10315db2897SKrishnendu Sadhukhan - Sun Microsystems static void
print_usage(const char * execname,int long_help)10415db2897SKrishnendu Sadhukhan - Sun Microsystems print_usage(const char *execname, int long_help)
10515db2897SKrishnendu Sadhukhan - Sun Microsystems {
10615db2897SKrishnendu Sadhukhan - Sun Microsystems 	char buffer[PATH_MAX];
10715db2897SKrishnendu Sadhukhan - Sun Microsystems 	(void) snprintf(buffer, sizeof (buffer), "%s", execname);
10815db2897SKrishnendu Sadhukhan - Sun Microsystems 
10915db2897SKrishnendu Sadhukhan - Sun Microsystems 	if (!long_help) {
11015db2897SKrishnendu Sadhukhan - Sun Microsystems 		/* Print short help to stderr. */
11115db2897SKrishnendu Sadhukhan - Sun Microsystems 		(void) fprintf(stderr, "Usage: %s [option(s)], ",
11215db2897SKrishnendu Sadhukhan - Sun Microsystems 		    basename(buffer));
11315db2897SKrishnendu Sadhukhan - Sun Microsystems 		(void) fprintf(stderr, "use '%s -h' for details.\n",
11415db2897SKrishnendu Sadhukhan - Sun Microsystems 		    basename(buffer));
11515db2897SKrishnendu Sadhukhan - Sun Microsystems 		return;
11615db2897SKrishnendu Sadhukhan - Sun Microsystems 	}
11715db2897SKrishnendu Sadhukhan - Sun Microsystems 
11815db2897SKrishnendu Sadhukhan - Sun Microsystems 	(void) printf("Usage: %s [option(s)]\n", basename(buffer));
11915db2897SKrishnendu Sadhukhan - Sun Microsystems 	(void) printf("Options:\n"
12015db2897SKrishnendu Sadhukhan - Sun Microsystems 	    "    -h, --help\n"
12115db2897SKrishnendu Sadhukhan - Sun Microsystems 	    "        Print this help.\n"
12215db2897SKrishnendu Sadhukhan - Sun Microsystems 	    "    -t, --interval TIME\n"
12315db2897SKrishnendu Sadhukhan - Sun Microsystems 	    "        Set refresh interval to TIME. "
12415db2897SKrishnendu Sadhukhan - Sun Microsystems 	    "Valid range [1...60] seconds, default = 5\n"
12515db2897SKrishnendu Sadhukhan - Sun Microsystems 	/*
12615db2897SKrishnendu Sadhukhan - Sun Microsystems 	 * Option "-c, --config FILE" is not user-visible for now.
12715db2897SKrishnendu Sadhukhan - Sun Microsystems 	 * When we have chance to properly document the format of translation
12815db2897SKrishnendu Sadhukhan - Sun Microsystems 	 * rules, we'll make it user-visible.
12915db2897SKrishnendu Sadhukhan - Sun Microsystems 	 */
13015db2897SKrishnendu Sadhukhan - Sun Microsystems 	    "    -o, --output-log-file FILE\n"
13115db2897SKrishnendu Sadhukhan - Sun Microsystems 	    "        Output kernel log to FILE. Default = "
13215db2897SKrishnendu Sadhukhan - Sun Microsystems 	    DEFAULT_KLOG_FILE "\n"
13315db2897SKrishnendu Sadhukhan - Sun Microsystems 	    "    -k, --kernel-log-level LEVEL\n"
13415db2897SKrishnendu Sadhukhan - Sun Microsystems 	    "        Set kernel log level to LEVEL.\n"
13515db2897SKrishnendu Sadhukhan - Sun Microsystems 	    "        0(default) = None, 1 = Unmapped, 2 = Mapped, 3 = All.\n"
13615db2897SKrishnendu Sadhukhan - Sun Microsystems 	    "    -f, --feature [no]feature1,[no]feature2,...\n"
13715db2897SKrishnendu Sadhukhan - Sun Microsystems 	    "        Enable/disable features in LatencyTOP.\n"
13815db2897SKrishnendu Sadhukhan - Sun Microsystems 	    "        [no]filter:\n"
13915db2897SKrishnendu Sadhukhan - Sun Microsystems 	    "        Filter large interruptible latencies, e.g. sleep.\n"
14015db2897SKrishnendu Sadhukhan - Sun Microsystems 	    "        [no]sched:\n"
14115db2897SKrishnendu Sadhukhan - Sun Microsystems 	    "        Monitors sched (PID=0).\n"
14215db2897SKrishnendu Sadhukhan - Sun Microsystems 	    "        [no]sobj:\n"
14315db2897SKrishnendu Sadhukhan - Sun Microsystems 	    "        Monitors synchronization objects.\n"
14415db2897SKrishnendu Sadhukhan - Sun Microsystems 	    "        [no]low:\n"
14515db2897SKrishnendu Sadhukhan - Sun Microsystems 	    "        Lower overhead by sampling small latencies.\n"
14615db2897SKrishnendu Sadhukhan - Sun Microsystems 	    "    -l, --log-period TIME\n"
147*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 	    "        Write and restart log every TIME seconds, TIME >= 60\n"
148*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 	    "    -s --select [ pid=<pid> | pgid=<pgid> ]\n"
149*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 	    "        Monitor only the given process or processes in the "
150*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 	    "given process group.\n");
15115db2897SKrishnendu Sadhukhan - Sun Microsystems }
15215db2897SKrishnendu Sadhukhan - Sun Microsystems 
15315db2897SKrishnendu Sadhukhan - Sun Microsystems /*
15415db2897SKrishnendu Sadhukhan - Sun Microsystems  * Properly exit latencytop when it receives SIGINT or SIGTERM.
15515db2897SKrishnendu Sadhukhan - Sun Microsystems  */
15615db2897SKrishnendu Sadhukhan - Sun Microsystems /* ARGSUSED */
15715db2897SKrishnendu Sadhukhan - Sun Microsystems static void
signal_handler(int sig)15815db2897SKrishnendu Sadhukhan - Sun Microsystems signal_handler(int sig)
15915db2897SKrishnendu Sadhukhan - Sun Microsystems {
16015db2897SKrishnendu Sadhukhan - Sun Microsystems 	lt_gpipe_break("q");
16115db2897SKrishnendu Sadhukhan - Sun Microsystems }
16215db2897SKrishnendu Sadhukhan - Sun Microsystems 
16315db2897SKrishnendu Sadhukhan - Sun Microsystems /*
16415db2897SKrishnendu Sadhukhan - Sun Microsystems  * Convert string to integer. It returns error if extra characters are found.
16515db2897SKrishnendu Sadhukhan - Sun Microsystems  */
16615db2897SKrishnendu Sadhukhan - Sun Microsystems static int
to_int(const char * str,int * result)16715db2897SKrishnendu Sadhukhan - Sun Microsystems to_int(const char *str, int *result)
16815db2897SKrishnendu Sadhukhan - Sun Microsystems {
16915db2897SKrishnendu Sadhukhan - Sun Microsystems 	char *tail = NULL;
17015db2897SKrishnendu Sadhukhan - Sun Microsystems 	long ret;
17115db2897SKrishnendu Sadhukhan - Sun Microsystems 
17215db2897SKrishnendu Sadhukhan - Sun Microsystems 	if (str == NULL || result == NULL) {
17315db2897SKrishnendu Sadhukhan - Sun Microsystems 		return (-1);
17415db2897SKrishnendu Sadhukhan - Sun Microsystems 	}
17515db2897SKrishnendu Sadhukhan - Sun Microsystems 
17615db2897SKrishnendu Sadhukhan - Sun Microsystems 	ret = strtol(str, &tail, 10);
17715db2897SKrishnendu Sadhukhan - Sun Microsystems 
17815db2897SKrishnendu Sadhukhan - Sun Microsystems 	if (tail != NULL && *tail != '\0') {
17915db2897SKrishnendu Sadhukhan - Sun Microsystems 		return (-1);
18015db2897SKrishnendu Sadhukhan - Sun Microsystems 	}
18115db2897SKrishnendu Sadhukhan - Sun Microsystems 
18215db2897SKrishnendu Sadhukhan - Sun Microsystems 	*result = (int)ret;
18315db2897SKrishnendu Sadhukhan - Sun Microsystems 
18415db2897SKrishnendu Sadhukhan - Sun Microsystems 	return (0);
18515db2897SKrishnendu Sadhukhan - Sun Microsystems }
18615db2897SKrishnendu Sadhukhan - Sun Microsystems 
18715db2897SKrishnendu Sadhukhan - Sun Microsystems /*
18815db2897SKrishnendu Sadhukhan - Sun Microsystems  * The main function.
18915db2897SKrishnendu Sadhukhan - Sun Microsystems  */
19015db2897SKrishnendu Sadhukhan - Sun Microsystems int
main(int argc,char * argv[])19115db2897SKrishnendu Sadhukhan - Sun Microsystems main(int argc, char *argv[])
19215db2897SKrishnendu Sadhukhan - Sun Microsystems {
193*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 	const char *opt_string = "t:o:k:hf:l:c:s:";
19415db2897SKrishnendu Sadhukhan - Sun Microsystems 	struct option const longopts[] = {
19515db2897SKrishnendu Sadhukhan - Sun Microsystems 		{"interval", required_argument, NULL, 't'},
19615db2897SKrishnendu Sadhukhan - Sun Microsystems 		{"output-log-file", required_argument, NULL, 'o'},
19715db2897SKrishnendu Sadhukhan - Sun Microsystems 		{"kernel-log-level", required_argument, NULL, 'k'},
19815db2897SKrishnendu Sadhukhan - Sun Microsystems 		{"help", no_argument, NULL, 'h'},
19915db2897SKrishnendu Sadhukhan - Sun Microsystems 		{"feature", required_argument, NULL, 'f'},
20015db2897SKrishnendu Sadhukhan - Sun Microsystems 		{"log-period", required_argument, NULL, 'l'},
20115db2897SKrishnendu Sadhukhan - Sun Microsystems 		{"config", required_argument, NULL, 'c'},
202*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 		{"select", required_argument, NULL, 's'},
20315db2897SKrishnendu Sadhukhan - Sun Microsystems 		{NULL, 0, NULL, 0}
20415db2897SKrishnendu Sadhukhan - Sun Microsystems 	};
20515db2897SKrishnendu Sadhukhan - Sun Microsystems 
20615db2897SKrishnendu Sadhukhan - Sun Microsystems 	int optc;
20715db2897SKrishnendu Sadhukhan - Sun Microsystems 	int longind = 0;
20815db2897SKrishnendu Sadhukhan - Sun Microsystems 	int running = 1;
20915db2897SKrishnendu Sadhukhan - Sun Microsystems 	int unknown_option = FALSE;
21015db2897SKrishnendu Sadhukhan - Sun Microsystems 	int refresh_interval = 5;
21115db2897SKrishnendu Sadhukhan - Sun Microsystems 	int klog_level = 0;
21215db2897SKrishnendu Sadhukhan - Sun Microsystems 	int log_interval = 0;
21315db2897SKrishnendu Sadhukhan - Sun Microsystems 	long long last_logged = 0;
21415db2897SKrishnendu Sadhukhan - Sun Microsystems 	char *token = NULL;
21515db2897SKrishnendu Sadhukhan - Sun Microsystems 	int retval = 0;
21615db2897SKrishnendu Sadhukhan - Sun Microsystems 	int gpipe;
21715db2897SKrishnendu Sadhukhan - Sun Microsystems 	int err;
21815db2897SKrishnendu Sadhukhan - Sun Microsystems 	uint64_t collect_end;
21915db2897SKrishnendu Sadhukhan - Sun Microsystems 	uint64_t current_time;
22015db2897SKrishnendu Sadhukhan - Sun Microsystems 	uint64_t delta_time;
22115db2897SKrishnendu Sadhukhan - Sun Microsystems 	char logfile[PATH_MAX] = "";
222*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 	int select_id;
223*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 	int select_value;
224*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 	char *select_str;
2251a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 	boolean_t no_dtrace_cleanup = B_TRUE;
22615db2897SKrishnendu Sadhukhan - Sun Microsystems 
22715db2897SKrishnendu Sadhukhan - Sun Microsystems 	lt_gpipe_init();
22815db2897SKrishnendu Sadhukhan - Sun Microsystems 	(void) signal(SIGINT, signal_handler);
22915db2897SKrishnendu Sadhukhan - Sun Microsystems 	(void) signal(SIGTERM, signal_handler);
23015db2897SKrishnendu Sadhukhan - Sun Microsystems 
23115db2897SKrishnendu Sadhukhan - Sun Microsystems 	/* Default global settings */
23215db2897SKrishnendu Sadhukhan - Sun Microsystems 	g_config.lt_cfg_enable_filter = 0;
23315db2897SKrishnendu Sadhukhan - Sun Microsystems 	g_config.lt_cfg_trace_sched = 0;
23415db2897SKrishnendu Sadhukhan - Sun Microsystems 	g_config.lt_cfg_trace_syncobj = 1;
23515db2897SKrishnendu Sadhukhan - Sun Microsystems 	g_config.lt_cfg_low_overhead_mode = 0;
236*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 	g_config.lt_cfg_trace_pid = 0;
237*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 	g_config.lt_cfg_trace_pgid = 0;
23815db2897SKrishnendu Sadhukhan - Sun Microsystems 	/* dtrace snapshot every 1 second */
23915db2897SKrishnendu Sadhukhan - Sun Microsystems 	g_config.lt_cfg_snap_interval = 1000;
24015db2897SKrishnendu Sadhukhan - Sun Microsystems #ifdef EMBED_CONFIGS
24115db2897SKrishnendu Sadhukhan - Sun Microsystems 	g_config.lt_cfg_config_name = NULL;
24215db2897SKrishnendu Sadhukhan - Sun Microsystems #else
24315db2897SKrishnendu Sadhukhan - Sun Microsystems 	g_config.lt_cfg_config_name = lt_strdup(DEFAULT_CONFIG_NAME);
24415db2897SKrishnendu Sadhukhan - Sun Microsystems #endif
24515db2897SKrishnendu Sadhukhan - Sun Microsystems 
24615db2897SKrishnendu Sadhukhan - Sun Microsystems 	/* Parse command line arguments. */
24715db2897SKrishnendu Sadhukhan - Sun Microsystems 	while ((optc = getopt_long(argc, argv, opt_string,
24815db2897SKrishnendu Sadhukhan - Sun Microsystems 	    longopts, &longind)) != -1) {
24915db2897SKrishnendu Sadhukhan - Sun Microsystems 		switch (optc) {
25015db2897SKrishnendu Sadhukhan - Sun Microsystems 		case 'h':
25115db2897SKrishnendu Sadhukhan - Sun Microsystems 			print_usage(argv[0], TRUE);
25215db2897SKrishnendu Sadhukhan - Sun Microsystems 			goto end_none;
25315db2897SKrishnendu Sadhukhan - Sun Microsystems 		case 't':
25415db2897SKrishnendu Sadhukhan - Sun Microsystems 			if (to_int(optarg, &refresh_interval) != 0 ||
25515db2897SKrishnendu Sadhukhan - Sun Microsystems 			    refresh_interval < 1 || refresh_interval > 60) {
25615db2897SKrishnendu Sadhukhan - Sun Microsystems 				lt_display_error(
25715db2897SKrishnendu Sadhukhan - Sun Microsystems 				    "Invalid refresh interval: %s\n", optarg);
25815db2897SKrishnendu Sadhukhan - Sun Microsystems 				unknown_option = TRUE;
25915db2897SKrishnendu Sadhukhan - Sun Microsystems 			} else if (check_opt_dup(LT_CMDOPT_INTERVAL,
26015db2897SKrishnendu Sadhukhan - Sun Microsystems 			    refresh_interval)) {
26115db2897SKrishnendu Sadhukhan - Sun Microsystems 				unknown_option = TRUE;
26215db2897SKrishnendu Sadhukhan - Sun Microsystems 			}
26315db2897SKrishnendu Sadhukhan - Sun Microsystems 
26415db2897SKrishnendu Sadhukhan - Sun Microsystems 			break;
26515db2897SKrishnendu Sadhukhan - Sun Microsystems 		case 'k':
26615db2897SKrishnendu Sadhukhan - Sun Microsystems 			if (to_int(optarg, &klog_level) != 0 ||
26715db2897SKrishnendu Sadhukhan - Sun Microsystems 			    lt_klog_set_log_level(klog_level) != 0) {
26815db2897SKrishnendu Sadhukhan - Sun Microsystems 				lt_display_error(
26915db2897SKrishnendu Sadhukhan - Sun Microsystems 				    "Invalid log level: %s\n", optarg);
27015db2897SKrishnendu Sadhukhan - Sun Microsystems 				unknown_option = TRUE;
27115db2897SKrishnendu Sadhukhan - Sun Microsystems 			} else if (check_opt_dup(LT_CMDOPT_LOG_LEVEL,
27215db2897SKrishnendu Sadhukhan - Sun Microsystems 			    refresh_interval)) {
27315db2897SKrishnendu Sadhukhan - Sun Microsystems 				unknown_option = TRUE;
27415db2897SKrishnendu Sadhukhan - Sun Microsystems 			}
27515db2897SKrishnendu Sadhukhan - Sun Microsystems 
27615db2897SKrishnendu Sadhukhan - Sun Microsystems 			break;
27715db2897SKrishnendu Sadhukhan - Sun Microsystems 		case 'o':
27815db2897SKrishnendu Sadhukhan - Sun Microsystems 			if (check_opt_dup(LT_CMDOPT_LOG_FILE, optind)) {
27915db2897SKrishnendu Sadhukhan - Sun Microsystems 				unknown_option = TRUE;
28015db2897SKrishnendu Sadhukhan - Sun Microsystems 			} else if (strlen(optarg) >= sizeof (logfile)) {
28115db2897SKrishnendu Sadhukhan - Sun Microsystems 				lt_display_error(
28215db2897SKrishnendu Sadhukhan - Sun Microsystems 				    "Log file name is too long: %s\n",
28315db2897SKrishnendu Sadhukhan - Sun Microsystems 				    optarg);
28415db2897SKrishnendu Sadhukhan - Sun Microsystems 				unknown_option = TRUE;
28515db2897SKrishnendu Sadhukhan - Sun Microsystems 			} else {
28615db2897SKrishnendu Sadhukhan - Sun Microsystems 				(void) strncpy(logfile, optarg,
28715db2897SKrishnendu Sadhukhan - Sun Microsystems 				    sizeof (logfile));
28815db2897SKrishnendu Sadhukhan - Sun Microsystems 			}
28915db2897SKrishnendu Sadhukhan - Sun Microsystems 
29015db2897SKrishnendu Sadhukhan - Sun Microsystems 			break;
29115db2897SKrishnendu Sadhukhan - Sun Microsystems 		case 'f':
29215db2897SKrishnendu Sadhukhan - Sun Microsystems 			for (token = strtok(optarg, ","); token != NULL;
29315db2897SKrishnendu Sadhukhan - Sun Microsystems 			    token = strtok(NULL, ",")) {
29415db2897SKrishnendu Sadhukhan - Sun Microsystems 				int v = TRUE;
29515db2897SKrishnendu Sadhukhan - Sun Microsystems 
29615db2897SKrishnendu Sadhukhan - Sun Microsystems 				if (strncmp(token, "no", 2) == 0) {
29715db2897SKrishnendu Sadhukhan - Sun Microsystems 					v = FALSE;
29815db2897SKrishnendu Sadhukhan - Sun Microsystems 					token = &token[2];
29915db2897SKrishnendu Sadhukhan - Sun Microsystems 				}
30015db2897SKrishnendu Sadhukhan - Sun Microsystems 
30115db2897SKrishnendu Sadhukhan - Sun Microsystems 				if (CMPOPT(token, "filter") == 0) {
30215db2897SKrishnendu Sadhukhan - Sun Microsystems 					if (check_opt_dup(LT_CMDOPT_F_FILTER,
30315db2897SKrishnendu Sadhukhan - Sun Microsystems 					    v)) {
30415db2897SKrishnendu Sadhukhan - Sun Microsystems 						unknown_option = TRUE;
30515db2897SKrishnendu Sadhukhan - Sun Microsystems 					} else {
30615db2897SKrishnendu Sadhukhan - Sun Microsystems 						g_config.lt_cfg_enable_filter
30715db2897SKrishnendu Sadhukhan - Sun Microsystems 						    = v;
30815db2897SKrishnendu Sadhukhan - Sun Microsystems 					}
30915db2897SKrishnendu Sadhukhan - Sun Microsystems 				} else if (CMPOPT(token, "sched") == 0) {
31015db2897SKrishnendu Sadhukhan - Sun Microsystems 					if (check_opt_dup(LT_CMDOPT_F_SCHED,
31115db2897SKrishnendu Sadhukhan - Sun Microsystems 					    v)) {
31215db2897SKrishnendu Sadhukhan - Sun Microsystems 						unknown_option = TRUE;
31315db2897SKrishnendu Sadhukhan - Sun Microsystems 					} else {
31415db2897SKrishnendu Sadhukhan - Sun Microsystems 						g_config.lt_cfg_trace_sched
31515db2897SKrishnendu Sadhukhan - Sun Microsystems 						    = v;
31615db2897SKrishnendu Sadhukhan - Sun Microsystems 					}
31715db2897SKrishnendu Sadhukhan - Sun Microsystems 				} else if (CMPOPT(token, "sobj") == 0) {
31815db2897SKrishnendu Sadhukhan - Sun Microsystems 					if (check_opt_dup(LT_CMDOPT_F_SOBJ,
31915db2897SKrishnendu Sadhukhan - Sun Microsystems 					    v)) {
32015db2897SKrishnendu Sadhukhan - Sun Microsystems 						unknown_option = TRUE;
32115db2897SKrishnendu Sadhukhan - Sun Microsystems 					} else {
32215db2897SKrishnendu Sadhukhan - Sun Microsystems 						g_config.lt_cfg_trace_syncobj
32315db2897SKrishnendu Sadhukhan - Sun Microsystems 						    = v;
32415db2897SKrishnendu Sadhukhan - Sun Microsystems 					}
32515db2897SKrishnendu Sadhukhan - Sun Microsystems 				} else if (CMPOPT(token, "low") == 0) {
32615db2897SKrishnendu Sadhukhan - Sun Microsystems 					if (check_opt_dup(LT_CMDOPT_F_LOW,
32715db2897SKrishnendu Sadhukhan - Sun Microsystems 					    v)) {
32815db2897SKrishnendu Sadhukhan - Sun Microsystems 						unknown_option = TRUE;
32915db2897SKrishnendu Sadhukhan - Sun Microsystems 					} else {
33015db2897SKrishnendu Sadhukhan - Sun Microsystems 						g_config.
33115db2897SKrishnendu Sadhukhan - Sun Microsystems 						    lt_cfg_low_overhead_mode
33215db2897SKrishnendu Sadhukhan - Sun Microsystems 						    = v;
33315db2897SKrishnendu Sadhukhan - Sun Microsystems 					}
33415db2897SKrishnendu Sadhukhan - Sun Microsystems 				} else {
33515db2897SKrishnendu Sadhukhan - Sun Microsystems 					lt_display_error(
33615db2897SKrishnendu Sadhukhan - Sun Microsystems 					    "Unknown feature: %s\n", token);
33715db2897SKrishnendu Sadhukhan - Sun Microsystems 					unknown_option = TRUE;
33815db2897SKrishnendu Sadhukhan - Sun Microsystems 				}
33915db2897SKrishnendu Sadhukhan - Sun Microsystems 			}
34015db2897SKrishnendu Sadhukhan - Sun Microsystems 
34115db2897SKrishnendu Sadhukhan - Sun Microsystems 			break;
34215db2897SKrishnendu Sadhukhan - Sun Microsystems 		case 'l':
34315db2897SKrishnendu Sadhukhan - Sun Microsystems 			if (to_int(optarg, &log_interval) != 0 ||
34415db2897SKrishnendu Sadhukhan - Sun Microsystems 			    log_interval < 60) {
34515db2897SKrishnendu Sadhukhan - Sun Microsystems 				lt_display_error(
34615db2897SKrishnendu Sadhukhan - Sun Microsystems 				    "Invalid log interval: %s\n", optarg);
34715db2897SKrishnendu Sadhukhan - Sun Microsystems 				unknown_option = TRUE;
34815db2897SKrishnendu Sadhukhan - Sun Microsystems 			} else if (check_opt_dup(LT_CMDOPT_LOG_INTERVAL,
34915db2897SKrishnendu Sadhukhan - Sun Microsystems 			    log_interval)) {
35015db2897SKrishnendu Sadhukhan - Sun Microsystems 				unknown_option = TRUE;
35115db2897SKrishnendu Sadhukhan - Sun Microsystems 			}
35215db2897SKrishnendu Sadhukhan - Sun Microsystems 
35315db2897SKrishnendu Sadhukhan - Sun Microsystems 			break;
35415db2897SKrishnendu Sadhukhan - Sun Microsystems 		case 'c':
35515db2897SKrishnendu Sadhukhan - Sun Microsystems 			if (strlen(optarg) >= PATH_MAX) {
35615db2897SKrishnendu Sadhukhan - Sun Microsystems 				lt_display_error(
35715db2897SKrishnendu Sadhukhan - Sun Microsystems 				    "Configuration name is too long.\n");
35815db2897SKrishnendu Sadhukhan - Sun Microsystems 				unknown_option = TRUE;
35915db2897SKrishnendu Sadhukhan - Sun Microsystems 			} else if (check_opt_dup(LT_CMDOPT_CONFIG_FILE,
36015db2897SKrishnendu Sadhukhan - Sun Microsystems 			    optind)) {
36115db2897SKrishnendu Sadhukhan - Sun Microsystems 				unknown_option = TRUE;
36215db2897SKrishnendu Sadhukhan - Sun Microsystems 			} else {
36315db2897SKrishnendu Sadhukhan - Sun Microsystems 				g_config.lt_cfg_config_name =
36415db2897SKrishnendu Sadhukhan - Sun Microsystems 				    lt_strdup(optarg);
36515db2897SKrishnendu Sadhukhan - Sun Microsystems 			}
36615db2897SKrishnendu Sadhukhan - Sun Microsystems 
36715db2897SKrishnendu Sadhukhan - Sun Microsystems 			break;
368*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 		case 's':
369*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 			if (strncmp(optarg, "pid=", 4) == 0) {
370*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 				select_id = 0;
371*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 				select_str = &optarg[4];
372*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 			} else if (strncmp(optarg, "pgid=", 5) == 0) {
373*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 				select_id = 1;
374*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 				select_str = &optarg[5];
375*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 			} else {
376*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 				lt_display_error(
377*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 				    "Invalid select option: %s\n", optarg);
378*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 				unknown_option = TRUE;
379*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 				break;
380*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 			}
381*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 
382*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 			if (to_int(select_str, &select_value) != 0) {
383*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 				lt_display_error(
384*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 				    "Invalid select option: %s\n", optarg);
385*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 				unknown_option = TRUE;
386*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 				break;
387*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 			}
388*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 
389*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 			if (select_value <= 0) {
390*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 				lt_display_error(
391*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 				    "Process/process group ID must be "
392*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 				    "greater than 0: %s\n", optarg);
393*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 				unknown_option = TRUE;
394*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 				break;
395*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 			}
396*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 
397*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 			if (check_opt_dup(LT_CMDOPT_SELECT,
398*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 			    (((uint64_t)select_id) << 32) | select_value)) {
399*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 				unknown_option = TRUE;
400*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 				break;
401*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 			}
402*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 
403*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 			if (select_id == 0) {
404*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 				g_config.lt_cfg_trace_pid = select_value;
405*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 			} else {
406*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 				g_config.lt_cfg_trace_pgid = select_value;
407*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 			}
408*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems 			break;
40915db2897SKrishnendu Sadhukhan - Sun Microsystems 		default:
41015db2897SKrishnendu Sadhukhan - Sun Microsystems 			unknown_option = TRUE;
41115db2897SKrishnendu Sadhukhan - Sun Microsystems 			break;
41215db2897SKrishnendu Sadhukhan - Sun Microsystems 		}
41315db2897SKrishnendu Sadhukhan - Sun Microsystems 	}
41415db2897SKrishnendu Sadhukhan - Sun Microsystems 
41515db2897SKrishnendu Sadhukhan - Sun Microsystems 	if (!unknown_option && strlen(logfile) > 0) {
41615db2897SKrishnendu Sadhukhan - Sun Microsystems 		err = lt_klog_set_log_file(logfile);
41715db2897SKrishnendu Sadhukhan - Sun Microsystems 
41815db2897SKrishnendu Sadhukhan - Sun Microsystems 		if (err == -1) {
41915db2897SKrishnendu Sadhukhan - Sun Microsystems 			lt_display_error("Log file name is too long: %s\n",
42015db2897SKrishnendu Sadhukhan - Sun Microsystems 			    logfile);
42115db2897SKrishnendu Sadhukhan - Sun Microsystems 			unknown_option = TRUE;
42215db2897SKrishnendu Sadhukhan - Sun Microsystems 		} else if (err == -2) {
42315db2897SKrishnendu Sadhukhan - Sun Microsystems 			lt_display_error("Cannot write to log file: %s\n",
42415db2897SKrishnendu Sadhukhan - Sun Microsystems 			    logfile);
42515db2897SKrishnendu Sadhukhan - Sun Microsystems 			unknown_option = TRUE;
42615db2897SKrishnendu Sadhukhan - Sun Microsystems 		}
42715db2897SKrishnendu Sadhukhan - Sun Microsystems 	}
42815db2897SKrishnendu Sadhukhan - Sun Microsystems 
42915db2897SKrishnendu Sadhukhan - Sun Microsystems 	/* Throw error for invalid/junk arguments */
43015db2897SKrishnendu Sadhukhan - Sun Microsystems 	if (optind  < argc) {
43115db2897SKrishnendu Sadhukhan - Sun Microsystems 		int tmpind = optind;
43215db2897SKrishnendu Sadhukhan - Sun Microsystems 		(void) fprintf(stderr, "Unknown option(s): ");
43315db2897SKrishnendu Sadhukhan - Sun Microsystems 
43415db2897SKrishnendu Sadhukhan - Sun Microsystems 		while (tmpind < argc) {
43515db2897SKrishnendu Sadhukhan - Sun Microsystems 			(void) fprintf(stderr, "%s ", argv[tmpind++]);
43615db2897SKrishnendu Sadhukhan - Sun Microsystems 		}
43715db2897SKrishnendu Sadhukhan - Sun Microsystems 
43815db2897SKrishnendu Sadhukhan - Sun Microsystems 		(void) fprintf(stderr, "\n");
43915db2897SKrishnendu Sadhukhan - Sun Microsystems 		unknown_option = TRUE;
44015db2897SKrishnendu Sadhukhan - Sun Microsystems 	}
44115db2897SKrishnendu Sadhukhan - Sun Microsystems 
44215db2897SKrishnendu Sadhukhan - Sun Microsystems 	if (unknown_option) {
44315db2897SKrishnendu Sadhukhan - Sun Microsystems 		print_usage(argv[0], FALSE);
44415db2897SKrishnendu Sadhukhan - Sun Microsystems 		retval = 1;
44515db2897SKrishnendu Sadhukhan - Sun Microsystems 		goto end_none;
44615db2897SKrishnendu Sadhukhan - Sun Microsystems 	}
44715db2897SKrishnendu Sadhukhan - Sun Microsystems 
44815db2897SKrishnendu Sadhukhan - Sun Microsystems 	(void) printf("%s\n%s\n", TITLE, COPYRIGHT);
44915db2897SKrishnendu Sadhukhan - Sun Microsystems 
45015db2897SKrishnendu Sadhukhan - Sun Microsystems 	/*
45115db2897SKrishnendu Sadhukhan - Sun Microsystems 	 * Initialization
45215db2897SKrishnendu Sadhukhan - Sun Microsystems 	 */
45315db2897SKrishnendu Sadhukhan - Sun Microsystems 	lt_klog_init();
45415db2897SKrishnendu Sadhukhan - Sun Microsystems 
45515db2897SKrishnendu Sadhukhan - Sun Microsystems 	if (lt_table_init() != 0) {
45615db2897SKrishnendu Sadhukhan - Sun Microsystems 		lt_display_error("Unable to load configuration table.\n");
45715db2897SKrishnendu Sadhukhan - Sun Microsystems 		retval = 1;
45815db2897SKrishnendu Sadhukhan - Sun Microsystems 		goto end_notable;
45915db2897SKrishnendu Sadhukhan - Sun Microsystems 	}
46015db2897SKrishnendu Sadhukhan - Sun Microsystems 
46115db2897SKrishnendu Sadhukhan - Sun Microsystems 	if (lt_dtrace_init() != 0) {
46215db2897SKrishnendu Sadhukhan - Sun Microsystems 		lt_display_error("Unable to initialize dtrace.\n");
46315db2897SKrishnendu Sadhukhan - Sun Microsystems 		retval = 1;
46415db2897SKrishnendu Sadhukhan - Sun Microsystems 		goto end_nodtrace;
46515db2897SKrishnendu Sadhukhan - Sun Microsystems 	}
46615db2897SKrishnendu Sadhukhan - Sun Microsystems 
46715db2897SKrishnendu Sadhukhan - Sun Microsystems 	last_logged = lt_millisecond();
46815db2897SKrishnendu Sadhukhan - Sun Microsystems 
46915db2897SKrishnendu Sadhukhan - Sun Microsystems 	(void) printf("Collecting data for %d seconds...\n",
47015db2897SKrishnendu Sadhukhan - Sun Microsystems 	    refresh_interval);
47115db2897SKrishnendu Sadhukhan - Sun Microsystems 
47215db2897SKrishnendu Sadhukhan - Sun Microsystems 	gpipe = lt_gpipe_readfd();
47315db2897SKrishnendu Sadhukhan - Sun Microsystems 	collect_end = last_logged + refresh_interval * 1000;
47415db2897SKrishnendu Sadhukhan - Sun Microsystems 	for (;;) {
47515db2897SKrishnendu Sadhukhan - Sun Microsystems 		fd_set read_fd;
47615db2897SKrishnendu Sadhukhan - Sun Microsystems 		struct timeval timeout;
47715db2897SKrishnendu Sadhukhan - Sun Microsystems 		int tsleep = collect_end - lt_millisecond();
47815db2897SKrishnendu Sadhukhan - Sun Microsystems 
47915db2897SKrishnendu Sadhukhan - Sun Microsystems 		if (tsleep <= 0) {
48015db2897SKrishnendu Sadhukhan - Sun Microsystems 			break;
48115db2897SKrishnendu Sadhukhan - Sun Microsystems 		}
48215db2897SKrishnendu Sadhukhan - Sun Microsystems 
4831a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 		/*
4841a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 		 * Interval when we call dtrace_status() and collect
4851a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 		 * aggregated data.
4861a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 		 */
4871a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 		if (tsleep > g_config.lt_cfg_snap_interval) {
4881a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 			tsleep = g_config.lt_cfg_snap_interval;
48915db2897SKrishnendu Sadhukhan - Sun Microsystems 		}
49015db2897SKrishnendu Sadhukhan - Sun Microsystems 
49115db2897SKrishnendu Sadhukhan - Sun Microsystems 		timeout.tv_sec = tsleep / 1000;
49215db2897SKrishnendu Sadhukhan - Sun Microsystems 		timeout.tv_usec = (tsleep % 1000) * 1000;
49315db2897SKrishnendu Sadhukhan - Sun Microsystems 
49415db2897SKrishnendu Sadhukhan - Sun Microsystems 		FD_ZERO(&read_fd);
49515db2897SKrishnendu Sadhukhan - Sun Microsystems 		FD_SET(gpipe, &read_fd);
49615db2897SKrishnendu Sadhukhan - Sun Microsystems 
49715db2897SKrishnendu Sadhukhan - Sun Microsystems 		if (select(gpipe + 1, &read_fd, NULL, NULL, &timeout) > 0) {
49815db2897SKrishnendu Sadhukhan - Sun Microsystems 			goto end_ubreak;
49915db2897SKrishnendu Sadhukhan - Sun Microsystems 		}
50015db2897SKrishnendu Sadhukhan - Sun Microsystems 
50115db2897SKrishnendu Sadhukhan - Sun Microsystems 		(void) lt_dtrace_work(0);
50215db2897SKrishnendu Sadhukhan - Sun Microsystems 	}
50315db2897SKrishnendu Sadhukhan - Sun Microsystems 
50415db2897SKrishnendu Sadhukhan - Sun Microsystems 	lt_display_init();
50515db2897SKrishnendu Sadhukhan - Sun Microsystems 
50615db2897SKrishnendu Sadhukhan - Sun Microsystems 	do {
50715db2897SKrishnendu Sadhukhan - Sun Microsystems 		current_time = lt_millisecond();
50815db2897SKrishnendu Sadhukhan - Sun Microsystems 
50915db2897SKrishnendu Sadhukhan - Sun Microsystems 		lt_stat_clear_all();
51015db2897SKrishnendu Sadhukhan - Sun Microsystems 		(void) lt_dtrace_collect();
51115db2897SKrishnendu Sadhukhan - Sun Microsystems 
51215db2897SKrishnendu Sadhukhan - Sun Microsystems 		delta_time = current_time;
51315db2897SKrishnendu Sadhukhan - Sun Microsystems 		current_time = lt_millisecond();
51415db2897SKrishnendu Sadhukhan - Sun Microsystems 		delta_time = current_time - delta_time;
51515db2897SKrishnendu Sadhukhan - Sun Microsystems 
51615db2897SKrishnendu Sadhukhan - Sun Microsystems 		if (log_interval > 0 &&
51715db2897SKrishnendu Sadhukhan - Sun Microsystems 		    current_time - last_logged > log_interval * 1000) {
51815db2897SKrishnendu Sadhukhan - Sun Microsystems 			lt_klog_write();
51915db2897SKrishnendu Sadhukhan - Sun Microsystems 			last_logged = current_time;
52015db2897SKrishnendu Sadhukhan - Sun Microsystems 		}
52115db2897SKrishnendu Sadhukhan - Sun Microsystems 
52215db2897SKrishnendu Sadhukhan - Sun Microsystems 		running = lt_display_loop(refresh_interval * 1000 -
52315db2897SKrishnendu Sadhukhan - Sun Microsystems 		    delta_time);
5241a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 
5251a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 		/*
5261a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 		 * This is to avoid dynamic variable drop
5271a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 		 * in DTrace.
5281a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 		 */
5291a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 		if (lt_drop_detected == B_TRUE) {
5301a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 			if (lt_dtrace_deinit() != 0) {
5311a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 				no_dtrace_cleanup = B_FALSE;
5321a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 				retval = 1;
5331a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 				break;
5341a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 			}
5351a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 
5361a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 			lt_drop_detected = B_FALSE;
5371a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 			if (lt_dtrace_init() != 0) {
5381a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 				retval = 1;
5391a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 				break;
5401a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 			}
5411a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 		}
54215db2897SKrishnendu Sadhukhan - Sun Microsystems 	} while (running != 0);
54315db2897SKrishnendu Sadhukhan - Sun Microsystems 
54415db2897SKrishnendu Sadhukhan - Sun Microsystems 	lt_klog_write();
54515db2897SKrishnendu Sadhukhan - Sun Microsystems 
54615db2897SKrishnendu Sadhukhan - Sun Microsystems 	/* Cleanup */
54715db2897SKrishnendu Sadhukhan - Sun Microsystems 	lt_display_deinit();
54815db2897SKrishnendu Sadhukhan - Sun Microsystems 
54915db2897SKrishnendu Sadhukhan - Sun Microsystems end_ubreak:
5501a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 	if (no_dtrace_cleanup == B_FALSE || lt_dtrace_deinit() != 0)
5511a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 		retval = 1;
5521a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 
55315db2897SKrishnendu Sadhukhan - Sun Microsystems 	lt_stat_free_all();
55415db2897SKrishnendu Sadhukhan - Sun Microsystems 
55515db2897SKrishnendu Sadhukhan - Sun Microsystems end_nodtrace:
55615db2897SKrishnendu Sadhukhan - Sun Microsystems 	lt_table_deinit();
55715db2897SKrishnendu Sadhukhan - Sun Microsystems 
55815db2897SKrishnendu Sadhukhan - Sun Microsystems end_notable:
55915db2897SKrishnendu Sadhukhan - Sun Microsystems 	lt_klog_deinit();
56015db2897SKrishnendu Sadhukhan - Sun Microsystems 
56115db2897SKrishnendu Sadhukhan - Sun Microsystems end_none:
56215db2897SKrishnendu Sadhukhan - Sun Microsystems 	lt_gpipe_deinit();
56315db2897SKrishnendu Sadhukhan - Sun Microsystems 
56415db2897SKrishnendu Sadhukhan - Sun Microsystems 	if (g_config.lt_cfg_config_name != NULL) {
56515db2897SKrishnendu Sadhukhan - Sun Microsystems 		free(g_config.lt_cfg_config_name);
56615db2897SKrishnendu Sadhukhan - Sun Microsystems 	}
56715db2897SKrishnendu Sadhukhan - Sun Microsystems 
56815db2897SKrishnendu Sadhukhan - Sun Microsystems 	return (retval);
56915db2897SKrishnendu Sadhukhan - Sun Microsystems }
570