xref: /titanic_50/usr/src/cmd/latencytop/common/latencytop.c (revision 1a1f79f5a554655d51ccfdc74953bc86dc99d174)
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 
38*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems /*
39*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems  * This variable is used to check if "dynamic variable drop" in dtrace
40*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems  * has happened.
41*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems  */
42*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems boolean_t lt_drop_detected = 0;
43*1a1f79f5SKrishnendu 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,
5615db2897SKrishnendu Sadhukhan - Sun Microsystems 	LT_CMDOPT__LAST	/* Must be last one */
5715db2897SKrishnendu Sadhukhan - Sun Microsystems } lt_cmd_option_id_t;
5815db2897SKrishnendu Sadhukhan - Sun Microsystems 
5915db2897SKrishnendu Sadhukhan - Sun Microsystems /*
6015db2897SKrishnendu Sadhukhan - Sun Microsystems  * Check for duplicate command line options.
6115db2897SKrishnendu Sadhukhan - Sun Microsystems  * Returns TRUE if duplicate options with different values are found,
6215db2897SKrishnendu Sadhukhan - Sun Microsystems  * returns FALSE otherwise.
6315db2897SKrishnendu Sadhukhan - Sun Microsystems  */
6415db2897SKrishnendu Sadhukhan - Sun Microsystems static int
6515db2897SKrishnendu Sadhukhan - Sun Microsystems check_opt_dup(lt_cmd_option_id_t id, uint64_t value) {
6615db2897SKrishnendu Sadhukhan - Sun Microsystems 
6715db2897SKrishnendu Sadhukhan - Sun Microsystems 	static int opt_set[(int)LT_CMDOPT__LAST];
6815db2897SKrishnendu Sadhukhan - Sun Microsystems 	static uint64_t opt_val[(int)LT_CMDOPT__LAST];
6915db2897SKrishnendu Sadhukhan - Sun Microsystems 
7015db2897SKrishnendu Sadhukhan - Sun Microsystems 	const char *errmsg[] = {
7115db2897SKrishnendu Sadhukhan - Sun Microsystems 		"-t is set more than once with different values.",
7215db2897SKrishnendu Sadhukhan - Sun Microsystems 		"-o is set more than once.",
7315db2897SKrishnendu Sadhukhan - Sun Microsystems 		"-k is set more than once with different values.",
7415db2897SKrishnendu Sadhukhan - Sun Microsystems 		"-l is set more than once with different values.",
7515db2897SKrishnendu Sadhukhan - Sun Microsystems 		"-c is set more than once.",
7615db2897SKrishnendu Sadhukhan - Sun Microsystems 		"-f [no]filter is set more than once with different values.",
7715db2897SKrishnendu Sadhukhan - Sun Microsystems 		"-f [no]sched is set more than once with different values.",
7815db2897SKrishnendu Sadhukhan - Sun Microsystems 		"-f [no]sobj is set more than once with different values.",
7915db2897SKrishnendu Sadhukhan - Sun Microsystems 		"-f [no]low is set more than once with different values.",
8015db2897SKrishnendu Sadhukhan - Sun Microsystems 	};
8115db2897SKrishnendu Sadhukhan - Sun Microsystems 
8215db2897SKrishnendu Sadhukhan - Sun Microsystems 	g_assert(sizeof (errmsg)/sizeof (errmsg[0]) == (int)LT_CMDOPT__LAST);
8315db2897SKrishnendu Sadhukhan - Sun Microsystems 
8415db2897SKrishnendu Sadhukhan - Sun Microsystems 	if (!opt_set[(int)id]) {
8515db2897SKrishnendu Sadhukhan - Sun Microsystems 		opt_set[(int)id] = TRUE;
8615db2897SKrishnendu Sadhukhan - Sun Microsystems 		opt_val[(int)id] = value;
8715db2897SKrishnendu Sadhukhan - Sun Microsystems 		return (FALSE);
8815db2897SKrishnendu Sadhukhan - Sun Microsystems 	}
8915db2897SKrishnendu Sadhukhan - Sun Microsystems 
9015db2897SKrishnendu Sadhukhan - Sun Microsystems 	if (opt_val[(int)id] != value) {
9115db2897SKrishnendu Sadhukhan - Sun Microsystems 		(void) fprintf(stderr, "%s\n", errmsg[(int)id]);
9215db2897SKrishnendu Sadhukhan - Sun Microsystems 		return (TRUE);
9315db2897SKrishnendu Sadhukhan - Sun Microsystems 	}
9415db2897SKrishnendu Sadhukhan - Sun Microsystems 
9515db2897SKrishnendu Sadhukhan - Sun Microsystems 	return (FALSE);
9615db2897SKrishnendu Sadhukhan - Sun Microsystems }
9715db2897SKrishnendu Sadhukhan - Sun Microsystems 
9815db2897SKrishnendu Sadhukhan - Sun Microsystems /*
9915db2897SKrishnendu Sadhukhan - Sun Microsystems  * Print command-line help message.
10015db2897SKrishnendu Sadhukhan - Sun Microsystems  */
10115db2897SKrishnendu Sadhukhan - Sun Microsystems static void
10215db2897SKrishnendu Sadhukhan - Sun Microsystems print_usage(const char *execname, int long_help)
10315db2897SKrishnendu Sadhukhan - Sun Microsystems {
10415db2897SKrishnendu Sadhukhan - Sun Microsystems 	char buffer[PATH_MAX];
10515db2897SKrishnendu Sadhukhan - Sun Microsystems 	(void) snprintf(buffer, sizeof (buffer), "%s", execname);
10615db2897SKrishnendu Sadhukhan - Sun Microsystems 
10715db2897SKrishnendu Sadhukhan - Sun Microsystems 	if (!long_help) {
10815db2897SKrishnendu Sadhukhan - Sun Microsystems 		/* Print short help to stderr. */
10915db2897SKrishnendu Sadhukhan - Sun Microsystems 		(void) fprintf(stderr, "Usage: %s [option(s)], ",
11015db2897SKrishnendu Sadhukhan - Sun Microsystems 		    basename(buffer));
11115db2897SKrishnendu Sadhukhan - Sun Microsystems 		(void) fprintf(stderr, "use '%s -h' for details.\n",
11215db2897SKrishnendu Sadhukhan - Sun Microsystems 		    basename(buffer));
11315db2897SKrishnendu Sadhukhan - Sun Microsystems 		return;
11415db2897SKrishnendu Sadhukhan - Sun Microsystems 	}
11515db2897SKrishnendu Sadhukhan - Sun Microsystems 
11615db2897SKrishnendu Sadhukhan - Sun Microsystems 	(void) printf("Usage: %s [option(s)]\n", basename(buffer));
11715db2897SKrishnendu Sadhukhan - Sun Microsystems 	(void) printf("Options:\n"
11815db2897SKrishnendu Sadhukhan - Sun Microsystems 	    "    -h, --help\n"
11915db2897SKrishnendu Sadhukhan - Sun Microsystems 	    "        Print this help.\n"
12015db2897SKrishnendu Sadhukhan - Sun Microsystems 	    "    -t, --interval TIME\n"
12115db2897SKrishnendu Sadhukhan - Sun Microsystems 	    "        Set refresh interval to TIME. "
12215db2897SKrishnendu Sadhukhan - Sun Microsystems 	    "Valid range [1...60] seconds, default = 5\n"
12315db2897SKrishnendu Sadhukhan - Sun Microsystems 	/*
12415db2897SKrishnendu Sadhukhan - Sun Microsystems 	 * Option "-c, --config FILE" is not user-visible for now.
12515db2897SKrishnendu Sadhukhan - Sun Microsystems 	 * When we have chance to properly document the format of translation
12615db2897SKrishnendu Sadhukhan - Sun Microsystems 	 * rules, we'll make it user-visible.
12715db2897SKrishnendu Sadhukhan - Sun Microsystems 	 */
12815db2897SKrishnendu Sadhukhan - Sun Microsystems 	    "    -o, --output-log-file FILE\n"
12915db2897SKrishnendu Sadhukhan - Sun Microsystems 	    "        Output kernel log to FILE. Default = "
13015db2897SKrishnendu Sadhukhan - Sun Microsystems 	    DEFAULT_KLOG_FILE "\n"
13115db2897SKrishnendu Sadhukhan - Sun Microsystems 	    "    -k, --kernel-log-level LEVEL\n"
13215db2897SKrishnendu Sadhukhan - Sun Microsystems 	    "        Set kernel log level to LEVEL.\n"
13315db2897SKrishnendu Sadhukhan - Sun Microsystems 	    "        0(default) = None, 1 = Unmapped, 2 = Mapped, 3 = All.\n"
13415db2897SKrishnendu Sadhukhan - Sun Microsystems 	    "    -f, --feature [no]feature1,[no]feature2,...\n"
13515db2897SKrishnendu Sadhukhan - Sun Microsystems 	    "        Enable/disable features in LatencyTOP.\n"
13615db2897SKrishnendu Sadhukhan - Sun Microsystems 	    "        [no]filter:\n"
13715db2897SKrishnendu Sadhukhan - Sun Microsystems 	    "        Filter large interruptible latencies, e.g. sleep.\n"
13815db2897SKrishnendu Sadhukhan - Sun Microsystems 	    "        [no]sched:\n"
13915db2897SKrishnendu Sadhukhan - Sun Microsystems 	    "        Monitors sched (PID=0).\n"
14015db2897SKrishnendu Sadhukhan - Sun Microsystems 	    "        [no]sobj:\n"
14115db2897SKrishnendu Sadhukhan - Sun Microsystems 	    "        Monitors synchronization objects.\n"
14215db2897SKrishnendu Sadhukhan - Sun Microsystems 	    "        [no]low:\n"
14315db2897SKrishnendu Sadhukhan - Sun Microsystems 	    "        Lower overhead by sampling small latencies.\n"
14415db2897SKrishnendu Sadhukhan - Sun Microsystems 	    "    -l, --log-period TIME\n"
14515db2897SKrishnendu Sadhukhan - Sun Microsystems 	    "        Write and restart log every TIME seconds, TIME >= 60\n");
14615db2897SKrishnendu Sadhukhan - Sun Microsystems }
14715db2897SKrishnendu Sadhukhan - Sun Microsystems 
14815db2897SKrishnendu Sadhukhan - Sun Microsystems /*
14915db2897SKrishnendu Sadhukhan - Sun Microsystems  * Properly exit latencytop when it receives SIGINT or SIGTERM.
15015db2897SKrishnendu Sadhukhan - Sun Microsystems  */
15115db2897SKrishnendu Sadhukhan - Sun Microsystems /* ARGSUSED */
15215db2897SKrishnendu Sadhukhan - Sun Microsystems static void
15315db2897SKrishnendu Sadhukhan - Sun Microsystems signal_handler(int sig)
15415db2897SKrishnendu Sadhukhan - Sun Microsystems {
15515db2897SKrishnendu Sadhukhan - Sun Microsystems 	lt_gpipe_break("q");
15615db2897SKrishnendu Sadhukhan - Sun Microsystems }
15715db2897SKrishnendu Sadhukhan - Sun Microsystems 
15815db2897SKrishnendu Sadhukhan - Sun Microsystems /*
15915db2897SKrishnendu Sadhukhan - Sun Microsystems  * Convert string to integer. It returns error if extra characters are found.
16015db2897SKrishnendu Sadhukhan - Sun Microsystems  */
16115db2897SKrishnendu Sadhukhan - Sun Microsystems static int
16215db2897SKrishnendu Sadhukhan - Sun Microsystems to_int(const char *str, int *result)
16315db2897SKrishnendu Sadhukhan - Sun Microsystems {
16415db2897SKrishnendu Sadhukhan - Sun Microsystems 	char *tail = NULL;
16515db2897SKrishnendu Sadhukhan - Sun Microsystems 	long ret;
16615db2897SKrishnendu Sadhukhan - Sun Microsystems 
16715db2897SKrishnendu Sadhukhan - Sun Microsystems 	if (str == NULL || result == NULL) {
16815db2897SKrishnendu Sadhukhan - Sun Microsystems 		return (-1);
16915db2897SKrishnendu Sadhukhan - Sun Microsystems 	}
17015db2897SKrishnendu Sadhukhan - Sun Microsystems 
17115db2897SKrishnendu Sadhukhan - Sun Microsystems 	ret = strtol(str, &tail, 10);
17215db2897SKrishnendu Sadhukhan - Sun Microsystems 
17315db2897SKrishnendu Sadhukhan - Sun Microsystems 	if (tail != NULL && *tail != '\0') {
17415db2897SKrishnendu Sadhukhan - Sun Microsystems 		return (-1);
17515db2897SKrishnendu Sadhukhan - Sun Microsystems 	}
17615db2897SKrishnendu Sadhukhan - Sun Microsystems 
17715db2897SKrishnendu Sadhukhan - Sun Microsystems 	*result = (int)ret;
17815db2897SKrishnendu Sadhukhan - Sun Microsystems 
17915db2897SKrishnendu Sadhukhan - Sun Microsystems 	return (0);
18015db2897SKrishnendu Sadhukhan - Sun Microsystems }
18115db2897SKrishnendu Sadhukhan - Sun Microsystems 
18215db2897SKrishnendu Sadhukhan - Sun Microsystems /*
18315db2897SKrishnendu Sadhukhan - Sun Microsystems  * The main function.
18415db2897SKrishnendu Sadhukhan - Sun Microsystems  */
18515db2897SKrishnendu Sadhukhan - Sun Microsystems int
18615db2897SKrishnendu Sadhukhan - Sun Microsystems main(int argc, char *argv[])
18715db2897SKrishnendu Sadhukhan - Sun Microsystems {
18815db2897SKrishnendu Sadhukhan - Sun Microsystems 	const char *opt_string = "t:o:k:hf:l:c:";
18915db2897SKrishnendu Sadhukhan - Sun Microsystems 	struct option const longopts[] = {
19015db2897SKrishnendu Sadhukhan - Sun Microsystems 		{"interval", required_argument, NULL, 't'},
19115db2897SKrishnendu Sadhukhan - Sun Microsystems 		{"output-log-file", required_argument, NULL, 'o'},
19215db2897SKrishnendu Sadhukhan - Sun Microsystems 		{"kernel-log-level", required_argument, NULL, 'k'},
19315db2897SKrishnendu Sadhukhan - Sun Microsystems 		{"help", no_argument, NULL, 'h'},
19415db2897SKrishnendu Sadhukhan - Sun Microsystems 		{"feature", required_argument, NULL, 'f'},
19515db2897SKrishnendu Sadhukhan - Sun Microsystems 		{"log-period", required_argument, NULL, 'l'},
19615db2897SKrishnendu Sadhukhan - Sun Microsystems 		{"config", required_argument, NULL, 'c'},
19715db2897SKrishnendu Sadhukhan - Sun Microsystems 		{NULL, 0, NULL, 0}
19815db2897SKrishnendu Sadhukhan - Sun Microsystems 	};
19915db2897SKrishnendu Sadhukhan - Sun Microsystems 
20015db2897SKrishnendu Sadhukhan - Sun Microsystems 	int optc;
20115db2897SKrishnendu Sadhukhan - Sun Microsystems 	int longind = 0;
20215db2897SKrishnendu Sadhukhan - Sun Microsystems 	int running = 1;
20315db2897SKrishnendu Sadhukhan - Sun Microsystems 	int unknown_option = FALSE;
20415db2897SKrishnendu Sadhukhan - Sun Microsystems 	int refresh_interval = 5;
20515db2897SKrishnendu Sadhukhan - Sun Microsystems 	int klog_level = 0;
20615db2897SKrishnendu Sadhukhan - Sun Microsystems 	int log_interval = 0;
20715db2897SKrishnendu Sadhukhan - Sun Microsystems 	long long last_logged = 0;
20815db2897SKrishnendu Sadhukhan - Sun Microsystems 	char *token = NULL;
20915db2897SKrishnendu Sadhukhan - Sun Microsystems 	int retval = 0;
21015db2897SKrishnendu Sadhukhan - Sun Microsystems 	int gpipe;
21115db2897SKrishnendu Sadhukhan - Sun Microsystems 	int err;
21215db2897SKrishnendu Sadhukhan - Sun Microsystems 	uint64_t collect_end;
21315db2897SKrishnendu Sadhukhan - Sun Microsystems 	uint64_t current_time;
21415db2897SKrishnendu Sadhukhan - Sun Microsystems 	uint64_t delta_time;
21515db2897SKrishnendu Sadhukhan - Sun Microsystems 	char logfile[PATH_MAX] = "";
216*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 	boolean_t no_dtrace_cleanup = B_TRUE;
21715db2897SKrishnendu Sadhukhan - Sun Microsystems 
21815db2897SKrishnendu Sadhukhan - Sun Microsystems 	lt_gpipe_init();
21915db2897SKrishnendu Sadhukhan - Sun Microsystems 	(void) signal(SIGINT, signal_handler);
22015db2897SKrishnendu Sadhukhan - Sun Microsystems 	(void) signal(SIGTERM, signal_handler);
22115db2897SKrishnendu Sadhukhan - Sun Microsystems 
22215db2897SKrishnendu Sadhukhan - Sun Microsystems 	/* Default global settings */
22315db2897SKrishnendu Sadhukhan - Sun Microsystems 	g_config.lt_cfg_enable_filter = 0;
22415db2897SKrishnendu Sadhukhan - Sun Microsystems 	g_config.lt_cfg_trace_sched = 0;
22515db2897SKrishnendu Sadhukhan - Sun Microsystems 	g_config.lt_cfg_trace_syncobj = 1;
22615db2897SKrishnendu Sadhukhan - Sun Microsystems 	g_config.lt_cfg_low_overhead_mode = 0;
22715db2897SKrishnendu Sadhukhan - Sun Microsystems 	/* dtrace snapshot every 1 second */
22815db2897SKrishnendu Sadhukhan - Sun Microsystems 	g_config.lt_cfg_snap_interval = 1000;
22915db2897SKrishnendu Sadhukhan - Sun Microsystems #ifdef EMBED_CONFIGS
23015db2897SKrishnendu Sadhukhan - Sun Microsystems 	g_config.lt_cfg_config_name = NULL;
23115db2897SKrishnendu Sadhukhan - Sun Microsystems #else
23215db2897SKrishnendu Sadhukhan - Sun Microsystems 	g_config.lt_cfg_config_name = lt_strdup(DEFAULT_CONFIG_NAME);
23315db2897SKrishnendu Sadhukhan - Sun Microsystems #endif
23415db2897SKrishnendu Sadhukhan - Sun Microsystems 
23515db2897SKrishnendu Sadhukhan - Sun Microsystems 	/* Parse command line arguments. */
23615db2897SKrishnendu Sadhukhan - Sun Microsystems 	while ((optc = getopt_long(argc, argv, opt_string,
23715db2897SKrishnendu Sadhukhan - Sun Microsystems 	    longopts, &longind)) != -1) {
23815db2897SKrishnendu Sadhukhan - Sun Microsystems 		switch (optc) {
23915db2897SKrishnendu Sadhukhan - Sun Microsystems 		case 'h':
24015db2897SKrishnendu Sadhukhan - Sun Microsystems 			print_usage(argv[0], TRUE);
24115db2897SKrishnendu Sadhukhan - Sun Microsystems 			goto end_none;
24215db2897SKrishnendu Sadhukhan - Sun Microsystems 		case 't':
24315db2897SKrishnendu Sadhukhan - Sun Microsystems 			if (to_int(optarg, &refresh_interval) != 0 ||
24415db2897SKrishnendu Sadhukhan - Sun Microsystems 			    refresh_interval < 1 || refresh_interval > 60) {
24515db2897SKrishnendu Sadhukhan - Sun Microsystems 				lt_display_error(
24615db2897SKrishnendu Sadhukhan - Sun Microsystems 				    "Invalid refresh interval: %s\n", optarg);
24715db2897SKrishnendu Sadhukhan - Sun Microsystems 				unknown_option = TRUE;
24815db2897SKrishnendu Sadhukhan - Sun Microsystems 			} else if (check_opt_dup(LT_CMDOPT_INTERVAL,
24915db2897SKrishnendu Sadhukhan - Sun Microsystems 			    refresh_interval)) {
25015db2897SKrishnendu Sadhukhan - Sun Microsystems 				unknown_option = TRUE;
25115db2897SKrishnendu Sadhukhan - Sun Microsystems 			}
25215db2897SKrishnendu Sadhukhan - Sun Microsystems 
25315db2897SKrishnendu Sadhukhan - Sun Microsystems 			break;
25415db2897SKrishnendu Sadhukhan - Sun Microsystems 		case 'k':
25515db2897SKrishnendu Sadhukhan - Sun Microsystems 			if (to_int(optarg, &klog_level) != 0 ||
25615db2897SKrishnendu Sadhukhan - Sun Microsystems 			    lt_klog_set_log_level(klog_level) != 0) {
25715db2897SKrishnendu Sadhukhan - Sun Microsystems 				lt_display_error(
25815db2897SKrishnendu Sadhukhan - Sun Microsystems 				    "Invalid log level: %s\n", optarg);
25915db2897SKrishnendu Sadhukhan - Sun Microsystems 				unknown_option = TRUE;
26015db2897SKrishnendu Sadhukhan - Sun Microsystems 			} else if (check_opt_dup(LT_CMDOPT_LOG_LEVEL,
26115db2897SKrishnendu Sadhukhan - Sun Microsystems 			    refresh_interval)) {
26215db2897SKrishnendu Sadhukhan - Sun Microsystems 				unknown_option = TRUE;
26315db2897SKrishnendu Sadhukhan - Sun Microsystems 			}
26415db2897SKrishnendu Sadhukhan - Sun Microsystems 
26515db2897SKrishnendu Sadhukhan - Sun Microsystems 			break;
26615db2897SKrishnendu Sadhukhan - Sun Microsystems 		case 'o':
26715db2897SKrishnendu Sadhukhan - Sun Microsystems 			if (check_opt_dup(LT_CMDOPT_LOG_FILE, optind)) {
26815db2897SKrishnendu Sadhukhan - Sun Microsystems 				unknown_option = TRUE;
26915db2897SKrishnendu Sadhukhan - Sun Microsystems 			} else if (strlen(optarg) >= sizeof (logfile)) {
27015db2897SKrishnendu Sadhukhan - Sun Microsystems 				lt_display_error(
27115db2897SKrishnendu Sadhukhan - Sun Microsystems 				    "Log file name is too long: %s\n",
27215db2897SKrishnendu Sadhukhan - Sun Microsystems 				    optarg);
27315db2897SKrishnendu Sadhukhan - Sun Microsystems 				unknown_option = TRUE;
27415db2897SKrishnendu Sadhukhan - Sun Microsystems 			} else {
27515db2897SKrishnendu Sadhukhan - Sun Microsystems 				(void) strncpy(logfile, optarg,
27615db2897SKrishnendu Sadhukhan - Sun Microsystems 				    sizeof (logfile));
27715db2897SKrishnendu Sadhukhan - Sun Microsystems 			}
27815db2897SKrishnendu Sadhukhan - Sun Microsystems 
27915db2897SKrishnendu Sadhukhan - Sun Microsystems 			break;
28015db2897SKrishnendu Sadhukhan - Sun Microsystems 		case 'f':
28115db2897SKrishnendu Sadhukhan - Sun Microsystems 			for (token = strtok(optarg, ","); token != NULL;
28215db2897SKrishnendu Sadhukhan - Sun Microsystems 			    token = strtok(NULL, ",")) {
28315db2897SKrishnendu Sadhukhan - Sun Microsystems 				int v = TRUE;
28415db2897SKrishnendu Sadhukhan - Sun Microsystems 
28515db2897SKrishnendu Sadhukhan - Sun Microsystems 				if (strncmp(token, "no", 2) == 0) {
28615db2897SKrishnendu Sadhukhan - Sun Microsystems 					v = FALSE;
28715db2897SKrishnendu Sadhukhan - Sun Microsystems 					token = &token[2];
28815db2897SKrishnendu Sadhukhan - Sun Microsystems 				}
28915db2897SKrishnendu Sadhukhan - Sun Microsystems 
29015db2897SKrishnendu Sadhukhan - Sun Microsystems 				if (CMPOPT(token, "filter") == 0) {
29115db2897SKrishnendu Sadhukhan - Sun Microsystems 					if (check_opt_dup(LT_CMDOPT_F_FILTER,
29215db2897SKrishnendu Sadhukhan - Sun Microsystems 					    v)) {
29315db2897SKrishnendu Sadhukhan - Sun Microsystems 						unknown_option = TRUE;
29415db2897SKrishnendu Sadhukhan - Sun Microsystems 					} else {
29515db2897SKrishnendu Sadhukhan - Sun Microsystems 						g_config.lt_cfg_enable_filter
29615db2897SKrishnendu Sadhukhan - Sun Microsystems 						    = v;
29715db2897SKrishnendu Sadhukhan - Sun Microsystems 					}
29815db2897SKrishnendu Sadhukhan - Sun Microsystems 				} else if (CMPOPT(token, "sched") == 0) {
29915db2897SKrishnendu Sadhukhan - Sun Microsystems 					if (check_opt_dup(LT_CMDOPT_F_SCHED,
30015db2897SKrishnendu Sadhukhan - Sun Microsystems 					    v)) {
30115db2897SKrishnendu Sadhukhan - Sun Microsystems 						unknown_option = TRUE;
30215db2897SKrishnendu Sadhukhan - Sun Microsystems 					} else {
30315db2897SKrishnendu Sadhukhan - Sun Microsystems 						g_config.lt_cfg_trace_sched
30415db2897SKrishnendu Sadhukhan - Sun Microsystems 						    = v;
30515db2897SKrishnendu Sadhukhan - Sun Microsystems 					}
30615db2897SKrishnendu Sadhukhan - Sun Microsystems 				} else if (CMPOPT(token, "sobj") == 0) {
30715db2897SKrishnendu Sadhukhan - Sun Microsystems 					if (check_opt_dup(LT_CMDOPT_F_SOBJ,
30815db2897SKrishnendu Sadhukhan - Sun Microsystems 					    v)) {
30915db2897SKrishnendu Sadhukhan - Sun Microsystems 						unknown_option = TRUE;
31015db2897SKrishnendu Sadhukhan - Sun Microsystems 					} else {
31115db2897SKrishnendu Sadhukhan - Sun Microsystems 						g_config.lt_cfg_trace_syncobj
31215db2897SKrishnendu Sadhukhan - Sun Microsystems 						    = v;
31315db2897SKrishnendu Sadhukhan - Sun Microsystems 					}
31415db2897SKrishnendu Sadhukhan - Sun Microsystems 				} else if (CMPOPT(token, "low") == 0) {
31515db2897SKrishnendu Sadhukhan - Sun Microsystems 					if (check_opt_dup(LT_CMDOPT_F_LOW,
31615db2897SKrishnendu Sadhukhan - Sun Microsystems 					    v)) {
31715db2897SKrishnendu Sadhukhan - Sun Microsystems 						unknown_option = TRUE;
31815db2897SKrishnendu Sadhukhan - Sun Microsystems 					} else {
31915db2897SKrishnendu Sadhukhan - Sun Microsystems 						g_config.
32015db2897SKrishnendu Sadhukhan - Sun Microsystems 						    lt_cfg_low_overhead_mode
32115db2897SKrishnendu Sadhukhan - Sun Microsystems 						    = v;
32215db2897SKrishnendu Sadhukhan - Sun Microsystems 					}
32315db2897SKrishnendu Sadhukhan - Sun Microsystems 				} else {
32415db2897SKrishnendu Sadhukhan - Sun Microsystems 					lt_display_error(
32515db2897SKrishnendu Sadhukhan - Sun Microsystems 					    "Unknown feature: %s\n", token);
32615db2897SKrishnendu Sadhukhan - Sun Microsystems 					unknown_option = TRUE;
32715db2897SKrishnendu Sadhukhan - Sun Microsystems 				}
32815db2897SKrishnendu Sadhukhan - Sun Microsystems 			}
32915db2897SKrishnendu Sadhukhan - Sun Microsystems 
33015db2897SKrishnendu Sadhukhan - Sun Microsystems 			break;
33115db2897SKrishnendu Sadhukhan - Sun Microsystems 		case 'l':
33215db2897SKrishnendu Sadhukhan - Sun Microsystems 			if (to_int(optarg, &log_interval) != 0 ||
33315db2897SKrishnendu Sadhukhan - Sun Microsystems 			    log_interval < 60) {
33415db2897SKrishnendu Sadhukhan - Sun Microsystems 				lt_display_error(
33515db2897SKrishnendu Sadhukhan - Sun Microsystems 				    "Invalid log interval: %s\n", optarg);
33615db2897SKrishnendu Sadhukhan - Sun Microsystems 				unknown_option = TRUE;
33715db2897SKrishnendu Sadhukhan - Sun Microsystems 			} else if (check_opt_dup(LT_CMDOPT_LOG_INTERVAL,
33815db2897SKrishnendu Sadhukhan - Sun Microsystems 			    log_interval)) {
33915db2897SKrishnendu Sadhukhan - Sun Microsystems 				unknown_option = TRUE;
34015db2897SKrishnendu Sadhukhan - Sun Microsystems 			}
34115db2897SKrishnendu Sadhukhan - Sun Microsystems 
34215db2897SKrishnendu Sadhukhan - Sun Microsystems 			break;
34315db2897SKrishnendu Sadhukhan - Sun Microsystems 		case 'c':
34415db2897SKrishnendu Sadhukhan - Sun Microsystems 			if (strlen(optarg) >= PATH_MAX) {
34515db2897SKrishnendu Sadhukhan - Sun Microsystems 				lt_display_error(
34615db2897SKrishnendu Sadhukhan - Sun Microsystems 				    "Configuration name is too long.\n");
34715db2897SKrishnendu Sadhukhan - Sun Microsystems 				unknown_option = TRUE;
34815db2897SKrishnendu Sadhukhan - Sun Microsystems 			} else if (check_opt_dup(LT_CMDOPT_CONFIG_FILE,
34915db2897SKrishnendu Sadhukhan - Sun Microsystems 			    optind)) {
35015db2897SKrishnendu Sadhukhan - Sun Microsystems 				unknown_option = TRUE;
35115db2897SKrishnendu Sadhukhan - Sun Microsystems 			} else {
35215db2897SKrishnendu Sadhukhan - Sun Microsystems 				g_config.lt_cfg_config_name =
35315db2897SKrishnendu Sadhukhan - Sun Microsystems 				    lt_strdup(optarg);
35415db2897SKrishnendu Sadhukhan - Sun Microsystems 			}
35515db2897SKrishnendu Sadhukhan - Sun Microsystems 
35615db2897SKrishnendu Sadhukhan - Sun Microsystems 			break;
35715db2897SKrishnendu Sadhukhan - Sun Microsystems 		default:
35815db2897SKrishnendu Sadhukhan - Sun Microsystems 			unknown_option = TRUE;
35915db2897SKrishnendu Sadhukhan - Sun Microsystems 			break;
36015db2897SKrishnendu Sadhukhan - Sun Microsystems 		}
36115db2897SKrishnendu Sadhukhan - Sun Microsystems 	}
36215db2897SKrishnendu Sadhukhan - Sun Microsystems 
36315db2897SKrishnendu Sadhukhan - Sun Microsystems 	if (!unknown_option && strlen(logfile) > 0) {
36415db2897SKrishnendu Sadhukhan - Sun Microsystems 		err = lt_klog_set_log_file(logfile);
36515db2897SKrishnendu Sadhukhan - Sun Microsystems 
36615db2897SKrishnendu Sadhukhan - Sun Microsystems 		if (err == -1) {
36715db2897SKrishnendu Sadhukhan - Sun Microsystems 			lt_display_error("Log file name is too long: %s\n",
36815db2897SKrishnendu Sadhukhan - Sun Microsystems 			    logfile);
36915db2897SKrishnendu Sadhukhan - Sun Microsystems 			unknown_option = TRUE;
37015db2897SKrishnendu Sadhukhan - Sun Microsystems 		} else if (err == -2) {
37115db2897SKrishnendu Sadhukhan - Sun Microsystems 			lt_display_error("Cannot write to log file: %s\n",
37215db2897SKrishnendu Sadhukhan - Sun Microsystems 			    logfile);
37315db2897SKrishnendu Sadhukhan - Sun Microsystems 			unknown_option = TRUE;
37415db2897SKrishnendu Sadhukhan - Sun Microsystems 		}
37515db2897SKrishnendu Sadhukhan - Sun Microsystems 	}
37615db2897SKrishnendu Sadhukhan - Sun Microsystems 
37715db2897SKrishnendu Sadhukhan - Sun Microsystems 	/* Throw error for invalid/junk arguments */
37815db2897SKrishnendu Sadhukhan - Sun Microsystems 	if (optind  < argc) {
37915db2897SKrishnendu Sadhukhan - Sun Microsystems 		int tmpind = optind;
38015db2897SKrishnendu Sadhukhan - Sun Microsystems 		(void) fprintf(stderr, "Unknown option(s): ");
38115db2897SKrishnendu Sadhukhan - Sun Microsystems 
38215db2897SKrishnendu Sadhukhan - Sun Microsystems 		while (tmpind < argc) {
38315db2897SKrishnendu Sadhukhan - Sun Microsystems 			(void) fprintf(stderr, "%s ", argv[tmpind++]);
38415db2897SKrishnendu Sadhukhan - Sun Microsystems 		}
38515db2897SKrishnendu Sadhukhan - Sun Microsystems 
38615db2897SKrishnendu Sadhukhan - Sun Microsystems 		(void) fprintf(stderr, "\n");
38715db2897SKrishnendu Sadhukhan - Sun Microsystems 		unknown_option = TRUE;
38815db2897SKrishnendu Sadhukhan - Sun Microsystems 	}
38915db2897SKrishnendu Sadhukhan - Sun Microsystems 
39015db2897SKrishnendu Sadhukhan - Sun Microsystems 	if (unknown_option) {
39115db2897SKrishnendu Sadhukhan - Sun Microsystems 		print_usage(argv[0], FALSE);
39215db2897SKrishnendu Sadhukhan - Sun Microsystems 		retval = 1;
39315db2897SKrishnendu Sadhukhan - Sun Microsystems 		goto end_none;
39415db2897SKrishnendu Sadhukhan - Sun Microsystems 	}
39515db2897SKrishnendu Sadhukhan - Sun Microsystems 
39615db2897SKrishnendu Sadhukhan - Sun Microsystems 	(void) printf("%s\n%s\n", TITLE, COPYRIGHT);
39715db2897SKrishnendu Sadhukhan - Sun Microsystems 
39815db2897SKrishnendu Sadhukhan - Sun Microsystems 	/*
39915db2897SKrishnendu Sadhukhan - Sun Microsystems 	 * Initialization
40015db2897SKrishnendu Sadhukhan - Sun Microsystems 	 */
40115db2897SKrishnendu Sadhukhan - Sun Microsystems 	lt_klog_init();
40215db2897SKrishnendu Sadhukhan - Sun Microsystems 
40315db2897SKrishnendu Sadhukhan - Sun Microsystems 	if (lt_table_init() != 0) {
40415db2897SKrishnendu Sadhukhan - Sun Microsystems 		lt_display_error("Unable to load configuration table.\n");
40515db2897SKrishnendu Sadhukhan - Sun Microsystems 		retval = 1;
40615db2897SKrishnendu Sadhukhan - Sun Microsystems 		goto end_notable;
40715db2897SKrishnendu Sadhukhan - Sun Microsystems 	}
40815db2897SKrishnendu Sadhukhan - Sun Microsystems 
40915db2897SKrishnendu Sadhukhan - Sun Microsystems 	if (lt_dtrace_init() != 0) {
41015db2897SKrishnendu Sadhukhan - Sun Microsystems 		lt_display_error("Unable to initialize dtrace.\n");
41115db2897SKrishnendu Sadhukhan - Sun Microsystems 		retval = 1;
41215db2897SKrishnendu Sadhukhan - Sun Microsystems 		goto end_nodtrace;
41315db2897SKrishnendu Sadhukhan - Sun Microsystems 	}
41415db2897SKrishnendu Sadhukhan - Sun Microsystems 
41515db2897SKrishnendu Sadhukhan - Sun Microsystems 	last_logged = lt_millisecond();
41615db2897SKrishnendu Sadhukhan - Sun Microsystems 
41715db2897SKrishnendu Sadhukhan - Sun Microsystems 	(void) printf("Collecting data for %d seconds...\n",
41815db2897SKrishnendu Sadhukhan - Sun Microsystems 	    refresh_interval);
41915db2897SKrishnendu Sadhukhan - Sun Microsystems 
42015db2897SKrishnendu Sadhukhan - Sun Microsystems 	gpipe = lt_gpipe_readfd();
42115db2897SKrishnendu Sadhukhan - Sun Microsystems 	collect_end = last_logged + refresh_interval * 1000;
42215db2897SKrishnendu Sadhukhan - Sun Microsystems 	for (;;) {
42315db2897SKrishnendu Sadhukhan - Sun Microsystems 		fd_set read_fd;
42415db2897SKrishnendu Sadhukhan - Sun Microsystems 		struct timeval timeout;
42515db2897SKrishnendu Sadhukhan - Sun Microsystems 		int tsleep = collect_end - lt_millisecond();
42615db2897SKrishnendu Sadhukhan - Sun Microsystems 
42715db2897SKrishnendu Sadhukhan - Sun Microsystems 		if (tsleep <= 0) {
42815db2897SKrishnendu Sadhukhan - Sun Microsystems 			break;
42915db2897SKrishnendu Sadhukhan - Sun Microsystems 		}
43015db2897SKrishnendu Sadhukhan - Sun Microsystems 
431*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 		/*
432*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 		 * Interval when we call dtrace_status() and collect
433*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 		 * aggregated data.
434*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 		 */
435*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 		if (tsleep > g_config.lt_cfg_snap_interval) {
436*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 			tsleep = g_config.lt_cfg_snap_interval;
43715db2897SKrishnendu Sadhukhan - Sun Microsystems 		}
43815db2897SKrishnendu Sadhukhan - Sun Microsystems 
43915db2897SKrishnendu Sadhukhan - Sun Microsystems 		timeout.tv_sec = tsleep / 1000;
44015db2897SKrishnendu Sadhukhan - Sun Microsystems 		timeout.tv_usec = (tsleep % 1000) * 1000;
44115db2897SKrishnendu Sadhukhan - Sun Microsystems 
44215db2897SKrishnendu Sadhukhan - Sun Microsystems 		FD_ZERO(&read_fd);
44315db2897SKrishnendu Sadhukhan - Sun Microsystems 		FD_SET(gpipe, &read_fd);
44415db2897SKrishnendu Sadhukhan - Sun Microsystems 
44515db2897SKrishnendu Sadhukhan - Sun Microsystems 		if (select(gpipe + 1, &read_fd, NULL, NULL, &timeout) > 0) {
44615db2897SKrishnendu Sadhukhan - Sun Microsystems 			goto end_ubreak;
44715db2897SKrishnendu Sadhukhan - Sun Microsystems 		}
44815db2897SKrishnendu Sadhukhan - Sun Microsystems 
44915db2897SKrishnendu Sadhukhan - Sun Microsystems 		(void) lt_dtrace_work(0);
45015db2897SKrishnendu Sadhukhan - Sun Microsystems 	}
45115db2897SKrishnendu Sadhukhan - Sun Microsystems 
45215db2897SKrishnendu Sadhukhan - Sun Microsystems 	lt_display_init();
45315db2897SKrishnendu Sadhukhan - Sun Microsystems 
45415db2897SKrishnendu Sadhukhan - Sun Microsystems 	do {
45515db2897SKrishnendu Sadhukhan - Sun Microsystems 		current_time = lt_millisecond();
45615db2897SKrishnendu Sadhukhan - Sun Microsystems 
45715db2897SKrishnendu Sadhukhan - Sun Microsystems 		lt_stat_clear_all();
45815db2897SKrishnendu Sadhukhan - Sun Microsystems 		(void) lt_dtrace_collect();
45915db2897SKrishnendu Sadhukhan - Sun Microsystems 
46015db2897SKrishnendu Sadhukhan - Sun Microsystems 		delta_time = current_time;
46115db2897SKrishnendu Sadhukhan - Sun Microsystems 		current_time = lt_millisecond();
46215db2897SKrishnendu Sadhukhan - Sun Microsystems 		delta_time = current_time - delta_time;
46315db2897SKrishnendu Sadhukhan - Sun Microsystems 
46415db2897SKrishnendu Sadhukhan - Sun Microsystems 		if (log_interval > 0 &&
46515db2897SKrishnendu Sadhukhan - Sun Microsystems 		    current_time - last_logged > log_interval * 1000) {
46615db2897SKrishnendu Sadhukhan - Sun Microsystems 			lt_klog_write();
46715db2897SKrishnendu Sadhukhan - Sun Microsystems 			last_logged = current_time;
46815db2897SKrishnendu Sadhukhan - Sun Microsystems 		}
46915db2897SKrishnendu Sadhukhan - Sun Microsystems 
47015db2897SKrishnendu Sadhukhan - Sun Microsystems 		running = lt_display_loop(refresh_interval * 1000 -
47115db2897SKrishnendu Sadhukhan - Sun Microsystems 		    delta_time);
472*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 
473*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 		/*
474*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 		 * This is to avoid dynamic variable drop
475*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 		 * in DTrace.
476*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 		 */
477*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 		if (lt_drop_detected == B_TRUE) {
478*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 			if (lt_dtrace_deinit() != 0) {
479*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 				no_dtrace_cleanup = B_FALSE;
480*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 				retval = 1;
481*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 				break;
482*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 			}
483*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 
484*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 			lt_drop_detected = B_FALSE;
485*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 			if (lt_dtrace_init() != 0) {
486*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 				retval = 1;
487*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 				break;
488*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 			}
489*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 		}
49015db2897SKrishnendu Sadhukhan - Sun Microsystems 	} while (running != 0);
49115db2897SKrishnendu Sadhukhan - Sun Microsystems 
49215db2897SKrishnendu Sadhukhan - Sun Microsystems 	lt_klog_write();
49315db2897SKrishnendu Sadhukhan - Sun Microsystems 
49415db2897SKrishnendu Sadhukhan - Sun Microsystems 	/* Cleanup */
49515db2897SKrishnendu Sadhukhan - Sun Microsystems 	lt_display_deinit();
49615db2897SKrishnendu Sadhukhan - Sun Microsystems 
49715db2897SKrishnendu Sadhukhan - Sun Microsystems end_ubreak:
498*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 	if (no_dtrace_cleanup == B_FALSE || lt_dtrace_deinit() != 0)
499*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 		retval = 1;
500*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 
50115db2897SKrishnendu Sadhukhan - Sun Microsystems 	lt_stat_free_all();
50215db2897SKrishnendu Sadhukhan - Sun Microsystems 
50315db2897SKrishnendu Sadhukhan - Sun Microsystems end_nodtrace:
50415db2897SKrishnendu Sadhukhan - Sun Microsystems 	lt_table_deinit();
50515db2897SKrishnendu Sadhukhan - Sun Microsystems 
50615db2897SKrishnendu Sadhukhan - Sun Microsystems end_notable:
50715db2897SKrishnendu Sadhukhan - Sun Microsystems 	lt_klog_deinit();
50815db2897SKrishnendu Sadhukhan - Sun Microsystems 
50915db2897SKrishnendu Sadhukhan - Sun Microsystems end_none:
51015db2897SKrishnendu Sadhukhan - Sun Microsystems 	lt_gpipe_deinit();
51115db2897SKrishnendu Sadhukhan - Sun Microsystems 
51215db2897SKrishnendu Sadhukhan - Sun Microsystems 	if (g_config.lt_cfg_config_name != NULL) {
51315db2897SKrishnendu Sadhukhan - Sun Microsystems 		free(g_config.lt_cfg_config_name);
51415db2897SKrishnendu Sadhukhan - Sun Microsystems 	}
51515db2897SKrishnendu Sadhukhan - Sun Microsystems 
51615db2897SKrishnendu Sadhukhan - Sun Microsystems 	return (retval);
51715db2897SKrishnendu Sadhukhan - Sun Microsystems }
518