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