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 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 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 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 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 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