1*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 2*15db2897SKrishnendu Sadhukhan - Sun Microsystems * CDDL HEADER START 3*15db2897SKrishnendu Sadhukhan - Sun Microsystems * 4*15db2897SKrishnendu Sadhukhan - Sun Microsystems * The contents of this file are subject to the terms of the 5*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Common Development and Distribution License (the "License"). 6*15db2897SKrishnendu Sadhukhan - Sun Microsystems * You may not use this file except in compliance with the License. 7*15db2897SKrishnendu Sadhukhan - Sun Microsystems * 8*15db2897SKrishnendu Sadhukhan - Sun Microsystems * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*15db2897SKrishnendu Sadhukhan - Sun Microsystems * or http://www.opensolaris.org/os/licensing. 10*15db2897SKrishnendu Sadhukhan - Sun Microsystems * See the License for the specific language governing permissions 11*15db2897SKrishnendu Sadhukhan - Sun Microsystems * and limitations under the License. 12*15db2897SKrishnendu Sadhukhan - Sun Microsystems * 13*15db2897SKrishnendu Sadhukhan - Sun Microsystems * When distributing Covered Code, include this CDDL HEADER in each 14*15db2897SKrishnendu Sadhukhan - Sun Microsystems * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*15db2897SKrishnendu Sadhukhan - Sun Microsystems * If applicable, add the following below this CDDL HEADER, with the 16*15db2897SKrishnendu Sadhukhan - Sun Microsystems * fields enclosed by brackets "[]" replaced with your own identifying 17*15db2897SKrishnendu Sadhukhan - Sun Microsystems * information: Portions Copyright [yyyy] [name of copyright owner] 18*15db2897SKrishnendu Sadhukhan - Sun Microsystems * 19*15db2897SKrishnendu Sadhukhan - Sun Microsystems * CDDL HEADER END 20*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 21*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 22*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Copyright (c) 2008-2009, Intel Corporation. 23*15db2897SKrishnendu Sadhukhan - Sun Microsystems * All Rights Reserved. 24*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 25*15db2897SKrishnendu Sadhukhan - Sun Microsystems 26*15db2897SKrishnendu Sadhukhan - Sun Microsystems #include <stdlib.h> 27*15db2897SKrishnendu Sadhukhan - Sun Microsystems #include <string.h> 28*15db2897SKrishnendu Sadhukhan - Sun Microsystems #include <memory.h> 29*15db2897SKrishnendu Sadhukhan - Sun Microsystems #include <stdio.h> 30*15db2897SKrishnendu Sadhukhan - Sun Microsystems #include <ctype.h> 31*15db2897SKrishnendu Sadhukhan - Sun Microsystems 32*15db2897SKrishnendu Sadhukhan - Sun Microsystems #include "latencytop.h" 33*15db2897SKrishnendu Sadhukhan - Sun Microsystems 34*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 35*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Structure that holds detail of a cause. 36*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 37*15db2897SKrishnendu Sadhukhan - Sun Microsystems typedef struct { 38*15db2897SKrishnendu Sadhukhan - Sun Microsystems int lt_c_cause_id; 39*15db2897SKrishnendu Sadhukhan - Sun Microsystems int lt_c_flags; 40*15db2897SKrishnendu Sadhukhan - Sun Microsystems char *lt_c_name; 41*15db2897SKrishnendu Sadhukhan - Sun Microsystems } lt_cause_t; 42*15db2897SKrishnendu Sadhukhan - Sun Microsystems 43*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 44*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Structure that represents a matched cause. 45*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 46*15db2897SKrishnendu Sadhukhan - Sun Microsystems typedef struct { 47*15db2897SKrishnendu Sadhukhan - Sun Microsystems int lt_mt_priority; 48*15db2897SKrishnendu Sadhukhan - Sun Microsystems int lt_mt_cause_id; 49*15db2897SKrishnendu Sadhukhan - Sun Microsystems } lt_match_t; 50*15db2897SKrishnendu Sadhukhan - Sun Microsystems 51*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* All lt_cause_t that are created. */ 52*15db2897SKrishnendu Sadhukhan - Sun Microsystems static GHashTable *cause_lookup = NULL; 53*15db2897SKrishnendu Sadhukhan - Sun Microsystems static GPtrArray *causes_array = NULL; 54*15db2897SKrishnendu Sadhukhan - Sun Microsystems static int causes_array_len = 0; 55*15db2897SKrishnendu Sadhukhan - Sun Microsystems 56*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 57*15db2897SKrishnendu Sadhukhan - Sun Microsystems * This hash table maps a symbol to a cause. 58*15db2897SKrishnendu Sadhukhan - Sun Microsystems * key is of type "char *" and value is of type "lt_match_t *". 59*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 60*15db2897SKrishnendu Sadhukhan - Sun Microsystems static GHashTable *symbol_lookup_table = NULL; 61*15db2897SKrishnendu Sadhukhan - Sun Microsystems 62*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 63*15db2897SKrishnendu Sadhukhan - Sun Microsystems * The dtrace translation rules we get from the script 64*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 65*15db2897SKrishnendu Sadhukhan - Sun Microsystems char *dtrans = NULL; 66*15db2897SKrishnendu Sadhukhan - Sun Microsystems 67*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 68*15db2897SKrishnendu Sadhukhan - Sun Microsystems * These structures are only used inside .trans parser. 69*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 70*15db2897SKrishnendu Sadhukhan - Sun Microsystems typedef struct { 71*15db2897SKrishnendu Sadhukhan - Sun Microsystems int lt_dm_priority; 72*15db2897SKrishnendu Sadhukhan - Sun Microsystems char *lt_dm_macro; 73*15db2897SKrishnendu Sadhukhan - Sun Microsystems } lt_dmacro_t; 74*15db2897SKrishnendu Sadhukhan - Sun Microsystems 75*15db2897SKrishnendu Sadhukhan - Sun Microsystems typedef struct { 76*15db2897SKrishnendu Sadhukhan - Sun Microsystems GSequence *lt_pr_cmd_disable; 77*15db2897SKrishnendu Sadhukhan - Sun Microsystems GHashTable *lt_pr_dmacro; 78*15db2897SKrishnendu Sadhukhan - Sun Microsystems } lt_parser_t; 79*15db2897SKrishnendu Sadhukhan - Sun Microsystems 80*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* ARGSUSED */ 81*15db2897SKrishnendu Sadhukhan - Sun Microsystems static void 82*15db2897SKrishnendu Sadhukhan - Sun Microsystems free_cause(lt_cause_t *cause, void *user) 83*15db2897SKrishnendu Sadhukhan - Sun Microsystems { 84*15db2897SKrishnendu Sadhukhan - Sun Microsystems g_assert(cause != NULL && cause->lt_c_name != NULL); 85*15db2897SKrishnendu Sadhukhan - Sun Microsystems 86*15db2897SKrishnendu Sadhukhan - Sun Microsystems free(cause->lt_c_name); 87*15db2897SKrishnendu Sadhukhan - Sun Microsystems free(cause); 88*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 89*15db2897SKrishnendu Sadhukhan - Sun Microsystems 90*15db2897SKrishnendu Sadhukhan - Sun Microsystems static void 91*15db2897SKrishnendu Sadhukhan - Sun Microsystems free_dmacro(lt_dmacro_t *d) 92*15db2897SKrishnendu Sadhukhan - Sun Microsystems { 93*15db2897SKrishnendu Sadhukhan - Sun Microsystems g_assert(d->lt_dm_macro != NULL); 94*15db2897SKrishnendu Sadhukhan - Sun Microsystems free(d->lt_dm_macro); 95*15db2897SKrishnendu Sadhukhan - Sun Microsystems free(d); 96*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 97*15db2897SKrishnendu Sadhukhan - Sun Microsystems 98*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 99*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Add a cause. 100*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 101*15db2897SKrishnendu Sadhukhan - Sun Microsystems static lt_cause_t * 102*15db2897SKrishnendu Sadhukhan - Sun Microsystems new_cause(char *name, int flags) 103*15db2897SKrishnendu Sadhukhan - Sun Microsystems { 104*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_cause_t *entry; 105*15db2897SKrishnendu Sadhukhan - Sun Microsystems 106*15db2897SKrishnendu Sadhukhan - Sun Microsystems g_assert(name != NULL); 107*15db2897SKrishnendu Sadhukhan - Sun Microsystems 108*15db2897SKrishnendu Sadhukhan - Sun Microsystems entry = (lt_cause_t *)lt_malloc(sizeof (lt_cause_t)); 109*15db2897SKrishnendu Sadhukhan - Sun Microsystems entry->lt_c_flags = flags; 110*15db2897SKrishnendu Sadhukhan - Sun Microsystems entry->lt_c_name = name; 111*15db2897SKrishnendu Sadhukhan - Sun Microsystems entry->lt_c_cause_id = causes_array_len; 112*15db2897SKrishnendu Sadhukhan - Sun Microsystems 113*15db2897SKrishnendu Sadhukhan - Sun Microsystems g_ptr_array_add(causes_array, entry); 114*15db2897SKrishnendu Sadhukhan - Sun Microsystems ++causes_array_len; 115*15db2897SKrishnendu Sadhukhan - Sun Microsystems 116*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (entry); 117*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 118*15db2897SKrishnendu Sadhukhan - Sun Microsystems 119*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 120*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Set a cause to "disabled" state. 121*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 122*15db2897SKrishnendu Sadhukhan - Sun Microsystems static void 123*15db2897SKrishnendu Sadhukhan - Sun Microsystems disable_cause(char *cause_str, GHashTable *cause_table) 124*15db2897SKrishnendu Sadhukhan - Sun Microsystems { 125*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_cause_t *cause; 126*15db2897SKrishnendu Sadhukhan - Sun Microsystems 127*15db2897SKrishnendu Sadhukhan - Sun Microsystems cause = (lt_cause_t *)g_hash_table_lookup(cause_table, cause_str); 128*15db2897SKrishnendu Sadhukhan - Sun Microsystems 129*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (cause != NULL) { 130*15db2897SKrishnendu Sadhukhan - Sun Microsystems cause->lt_c_flags |= CAUSE_FLAG_DISABLED; 131*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 132*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 133*15db2897SKrishnendu Sadhukhan - Sun Microsystems 134*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 135*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Helper functions that reads a line from a character array. 136*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 137*15db2897SKrishnendu Sadhukhan - Sun Microsystems static int 138*15db2897SKrishnendu Sadhukhan - Sun Microsystems read_line_from_mem(const char *mem, int mem_len, char *line, int line_len, 139*15db2897SKrishnendu Sadhukhan - Sun Microsystems int *index) 140*15db2897SKrishnendu Sadhukhan - Sun Microsystems { 141*15db2897SKrishnendu Sadhukhan - Sun Microsystems g_assert(mem != NULL && line != NULL && index != NULL); 142*15db2897SKrishnendu Sadhukhan - Sun Microsystems 143*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (line_len <= 0 || mem_len <= 0) { 144*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (0); 145*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 146*15db2897SKrishnendu Sadhukhan - Sun Microsystems 147*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (*index >= mem_len) { 148*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (0); 149*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 150*15db2897SKrishnendu Sadhukhan - Sun Microsystems 151*15db2897SKrishnendu Sadhukhan - Sun Microsystems while (line_len > 1 && *index < mem_len) { 152*15db2897SKrishnendu Sadhukhan - Sun Microsystems *line = mem[(*index)++]; 153*15db2897SKrishnendu Sadhukhan - Sun Microsystems --line_len; 154*15db2897SKrishnendu Sadhukhan - Sun Microsystems ++line; 155*15db2897SKrishnendu Sadhukhan - Sun Microsystems 156*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (*(line-1) == '\r' || *(line-1) == '\n') { 157*15db2897SKrishnendu Sadhukhan - Sun Microsystems break; 158*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 159*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 160*15db2897SKrishnendu Sadhukhan - Sun Microsystems *line = '\0'; 161*15db2897SKrishnendu Sadhukhan - Sun Microsystems 162*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (1); 163*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 164*15db2897SKrishnendu Sadhukhan - Sun Microsystems 165*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 166*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Parse special command from configuration file. Special command 167*15db2897SKrishnendu Sadhukhan - Sun Microsystems * has the following format : 168*15db2897SKrishnendu Sadhukhan - Sun Microsystems 169*15db2897SKrishnendu Sadhukhan - Sun Microsystems * disable_cause <cause name> 170*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 171*15db2897SKrishnendu Sadhukhan - Sun Microsystems static int 172*15db2897SKrishnendu Sadhukhan - Sun Microsystems parse_config_cmd(char *begin, lt_parser_t *parser) 173*15db2897SKrishnendu Sadhukhan - Sun Microsystems { 174*15db2897SKrishnendu Sadhukhan - Sun Microsystems char *tmp; 175*15db2897SKrishnendu Sadhukhan - Sun Microsystems char old_chr = 0; 176*15db2897SKrishnendu Sadhukhan - Sun Microsystems 177*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 178*15db2897SKrishnendu Sadhukhan - Sun Microsystems * disable_cause FSFlush Daemon 179*15db2897SKrishnendu Sadhukhan - Sun Microsystems * ^ 180*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 181*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (*begin == '\0') { 182*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (0); 183*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 184*15db2897SKrishnendu Sadhukhan - Sun Microsystems 185*15db2897SKrishnendu Sadhukhan - Sun Microsystems for (tmp = begin; 186*15db2897SKrishnendu Sadhukhan - Sun Microsystems *tmp != '\0' && !isspace(*tmp); 187*15db2897SKrishnendu Sadhukhan - Sun Microsystems ++tmp) { 188*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 189*15db2897SKrishnendu Sadhukhan - Sun Microsystems old_chr = *tmp; 190*15db2897SKrishnendu Sadhukhan - Sun Microsystems *tmp = '\0'; 191*15db2897SKrishnendu Sadhukhan - Sun Microsystems 192*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (strcmp("disable_cause", begin) == 0) { 193*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (old_chr == '\0') { 194*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* Must have an argument */ 195*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_error( 196*15db2897SKrishnendu Sadhukhan - Sun Microsystems "Invalid command format: %s\n", 197*15db2897SKrishnendu Sadhukhan - Sun Microsystems begin); 198*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (-1); 199*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 200*15db2897SKrishnendu Sadhukhan - Sun Microsystems 201*15db2897SKrishnendu Sadhukhan - Sun Microsystems begin = tmp+1; 202*15db2897SKrishnendu Sadhukhan - Sun Microsystems while (isspace(*begin)) { 203*15db2897SKrishnendu Sadhukhan - Sun Microsystems ++begin; 204*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 205*15db2897SKrishnendu Sadhukhan - Sun Microsystems 206*15db2897SKrishnendu Sadhukhan - Sun Microsystems g_sequence_append(parser->lt_pr_cmd_disable, 207*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_strdup(begin)); 208*15db2897SKrishnendu Sadhukhan - Sun Microsystems } else { 209*15db2897SKrishnendu Sadhukhan - Sun Microsystems *tmp = old_chr; 210*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_error( 211*15db2897SKrishnendu Sadhukhan - Sun Microsystems "Unknown command: %s\n", begin); 212*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (-1); 213*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 214*15db2897SKrishnendu Sadhukhan - Sun Microsystems 215*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (0); 216*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 217*15db2897SKrishnendu Sadhukhan - Sun Microsystems 218*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 219*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Parse symbol translation from configuration file. Symbol translation 220*15db2897SKrishnendu Sadhukhan - Sun Microsystems * has the following format : 221*15db2897SKrishnendu Sadhukhan - Sun Microsystems * 222*15db2897SKrishnendu Sadhukhan - Sun Microsystems * <priority> <symbol name> <cause> 223*15db2897SKrishnendu Sadhukhan - Sun Microsystems * 224*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Finally check if that cause has already been mapped. 225*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 226*15db2897SKrishnendu Sadhukhan - Sun Microsystems static int 227*15db2897SKrishnendu Sadhukhan - Sun Microsystems parse_sym_trans(char *begin) 228*15db2897SKrishnendu Sadhukhan - Sun Microsystems { 229*15db2897SKrishnendu Sadhukhan - Sun Microsystems int priority = 0; 230*15db2897SKrishnendu Sadhukhan - Sun Microsystems char *match; 231*15db2897SKrishnendu Sadhukhan - Sun Microsystems char *match_dup; 232*15db2897SKrishnendu Sadhukhan - Sun Microsystems char *cause_str; 233*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_cause_t *cause; 234*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_match_t *match_entry; 235*15db2897SKrishnendu Sadhukhan - Sun Microsystems char *tmp; 236*15db2897SKrishnendu Sadhukhan - Sun Microsystems 237*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 238*15db2897SKrishnendu Sadhukhan - Sun Microsystems * 10 genunix`pread Syscall pread 239*15db2897SKrishnendu Sadhukhan - Sun Microsystems * ^ 240*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 241*15db2897SKrishnendu Sadhukhan - Sun Microsystems priority = strtol(begin, &tmp, 10); 242*15db2897SKrishnendu Sadhukhan - Sun Microsystems 243*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (tmp == begin || priority == 0) { 244*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (-1); 245*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 246*15db2897SKrishnendu Sadhukhan - Sun Microsystems 247*15db2897SKrishnendu Sadhukhan - Sun Microsystems begin = tmp; 248*15db2897SKrishnendu Sadhukhan - Sun Microsystems 249*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 250*15db2897SKrishnendu Sadhukhan - Sun Microsystems * 10 genunix`pread Syscall pread 251*15db2897SKrishnendu Sadhukhan - Sun Microsystems * --^ 252*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 253*15db2897SKrishnendu Sadhukhan - Sun Microsystems 254*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (!isspace(*begin)) { 255*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* At least one space char after <priority> */ 256*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (-1); 257*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 258*15db2897SKrishnendu Sadhukhan - Sun Microsystems 259*15db2897SKrishnendu Sadhukhan - Sun Microsystems while (isspace(*begin)) { 260*15db2897SKrishnendu Sadhukhan - Sun Microsystems ++begin; 261*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 262*15db2897SKrishnendu Sadhukhan - Sun Microsystems 263*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (*begin == 0) { 264*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (-1); 265*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 266*15db2897SKrishnendu Sadhukhan - Sun Microsystems 267*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 268*15db2897SKrishnendu Sadhukhan - Sun Microsystems * 10 genunix`pread Syscall pread 269*15db2897SKrishnendu Sadhukhan - Sun Microsystems * -----^ 270*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 271*15db2897SKrishnendu Sadhukhan - Sun Microsystems for (tmp = begin; 272*15db2897SKrishnendu Sadhukhan - Sun Microsystems *tmp != '\0' && !isspace(*tmp); 273*15db2897SKrishnendu Sadhukhan - Sun Microsystems ++tmp) { 274*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 275*15db2897SKrishnendu Sadhukhan - Sun Microsystems 276*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (*tmp == '\0') { 277*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (-1); 278*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 279*15db2897SKrishnendu Sadhukhan - Sun Microsystems 280*15db2897SKrishnendu Sadhukhan - Sun Microsystems *tmp = '\0'; 281*15db2897SKrishnendu Sadhukhan - Sun Microsystems match = begin; 282*15db2897SKrishnendu Sadhukhan - Sun Microsystems 283*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* Check if we have mapped this function before. */ 284*15db2897SKrishnendu Sadhukhan - Sun Microsystems match_entry = (lt_match_t *) 285*15db2897SKrishnendu Sadhukhan - Sun Microsystems g_hash_table_lookup(symbol_lookup_table, match); 286*15db2897SKrishnendu Sadhukhan - Sun Microsystems 287*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (match_entry != NULL && 288*15db2897SKrishnendu Sadhukhan - Sun Microsystems HIGHER_PRIORITY(match_entry->lt_mt_priority, priority)) { 289*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* We already have a higher entry. Ignore this. */ 290*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (0); 291*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 292*15db2897SKrishnendu Sadhukhan - Sun Microsystems 293*15db2897SKrishnendu Sadhukhan - Sun Microsystems begin = tmp + 1; 294*15db2897SKrishnendu Sadhukhan - Sun Microsystems 295*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 296*15db2897SKrishnendu Sadhukhan - Sun Microsystems * 10 genunix`pread Syscall pread 297*15db2897SKrishnendu Sadhukhan - Sun Microsystems * -------------------------------------^ 298*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 299*15db2897SKrishnendu Sadhukhan - Sun Microsystems while (isspace(*begin)) { 300*15db2897SKrishnendu Sadhukhan - Sun Microsystems ++begin; 301*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 302*15db2897SKrishnendu Sadhukhan - Sun Microsystems 303*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (*begin == 0) { 304*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (-1); 305*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 306*15db2897SKrishnendu Sadhukhan - Sun Microsystems 307*15db2897SKrishnendu Sadhukhan - Sun Microsystems cause_str = begin; 308*15db2897SKrishnendu Sadhukhan - Sun Microsystems 309*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* Check if we have mapped this cause before. */ 310*15db2897SKrishnendu Sadhukhan - Sun Microsystems cause = (lt_cause_t *) 311*15db2897SKrishnendu Sadhukhan - Sun Microsystems g_hash_table_lookup(cause_lookup, cause_str); 312*15db2897SKrishnendu Sadhukhan - Sun Microsystems 313*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (cause == NULL) { 314*15db2897SKrishnendu Sadhukhan - Sun Microsystems char *cause_dup = lt_strdup(cause_str); 315*15db2897SKrishnendu Sadhukhan - Sun Microsystems cause = new_cause(cause_dup, 0); 316*15db2897SKrishnendu Sadhukhan - Sun Microsystems g_hash_table_insert(cause_lookup, cause_dup, cause); 317*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 318*15db2897SKrishnendu Sadhukhan - Sun Microsystems 319*15db2897SKrishnendu Sadhukhan - Sun Microsystems match_entry = (lt_match_t *)lt_malloc(sizeof (lt_match_t)); 320*15db2897SKrishnendu Sadhukhan - Sun Microsystems match_entry->lt_mt_priority = priority; 321*15db2897SKrishnendu Sadhukhan - Sun Microsystems match_entry->lt_mt_cause_id = cause->lt_c_cause_id; 322*15db2897SKrishnendu Sadhukhan - Sun Microsystems match_dup = lt_strdup(match); 323*15db2897SKrishnendu Sadhukhan - Sun Microsystems 324*15db2897SKrishnendu Sadhukhan - Sun Microsystems g_hash_table_insert(symbol_lookup_table, match_dup, 325*15db2897SKrishnendu Sadhukhan - Sun Microsystems match_entry); 326*15db2897SKrishnendu Sadhukhan - Sun Microsystems 327*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (0); 328*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 329*15db2897SKrishnendu Sadhukhan - Sun Microsystems 330*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 331*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Parse D macro. D macros have the following format : 332*15db2897SKrishnendu Sadhukhan - Sun Microsystems * 333*15db2897SKrishnendu Sadhukhan - Sun Microsystems * <priority> <entry probe> <return probe> <cause> 334*15db2897SKrishnendu Sadhukhan - Sun Microsystems * 335*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Finally check if that cause has already been mapped. 336*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 337*15db2897SKrishnendu Sadhukhan - Sun Microsystems static int 338*15db2897SKrishnendu Sadhukhan - Sun Microsystems parse_dmacro(char *begin, lt_parser_t *parser) 339*15db2897SKrishnendu Sadhukhan - Sun Microsystems { 340*15db2897SKrishnendu Sadhukhan - Sun Microsystems int priority = 0; 341*15db2897SKrishnendu Sadhukhan - Sun Microsystems char *entryprobe; 342*15db2897SKrishnendu Sadhukhan - Sun Microsystems char *returnprobe; 343*15db2897SKrishnendu Sadhukhan - Sun Microsystems char *cause_str; 344*15db2897SKrishnendu Sadhukhan - Sun Microsystems char buf[512]; 345*15db2897SKrishnendu Sadhukhan - Sun Microsystems char probepair[512]; 346*15db2897SKrishnendu Sadhukhan - Sun Microsystems char *tmp = NULL; 347*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_cause_t *cause; 348*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_dmacro_t *dmacro; 349*15db2897SKrishnendu Sadhukhan - Sun Microsystems 350*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 351*15db2897SKrishnendu Sadhukhan - Sun Microsystems * 10 syscall::pread:entry syscall::pread:return Syscall pread 352*15db2897SKrishnendu Sadhukhan - Sun Microsystems * ^ 353*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 354*15db2897SKrishnendu Sadhukhan - Sun Microsystems priority = strtol(begin, &tmp, 10); 355*15db2897SKrishnendu Sadhukhan - Sun Microsystems 356*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (tmp == begin || priority == 0) { 357*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (-1); 358*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 359*15db2897SKrishnendu Sadhukhan - Sun Microsystems 360*15db2897SKrishnendu Sadhukhan - Sun Microsystems begin = tmp; 361*15db2897SKrishnendu Sadhukhan - Sun Microsystems 362*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 363*15db2897SKrishnendu Sadhukhan - Sun Microsystems * 10 syscall::pread:entry syscall::pread:return Syscall pread 364*15db2897SKrishnendu Sadhukhan - Sun Microsystems * --^ 365*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 366*15db2897SKrishnendu Sadhukhan - Sun Microsystems while (isspace(*begin)) { 367*15db2897SKrishnendu Sadhukhan - Sun Microsystems ++begin; 368*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 369*15db2897SKrishnendu Sadhukhan - Sun Microsystems 370*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (*begin == 0) { 371*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (-1); 372*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 373*15db2897SKrishnendu Sadhukhan - Sun Microsystems 374*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 375*15db2897SKrishnendu Sadhukhan - Sun Microsystems * 10 syscall::pread:entry syscall::pread:return Syscall pread 376*15db2897SKrishnendu Sadhukhan - Sun Microsystems * -----^ 377*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 378*15db2897SKrishnendu Sadhukhan - Sun Microsystems for (tmp = begin; 379*15db2897SKrishnendu Sadhukhan - Sun Microsystems *tmp != '\0' && !isspace(*tmp); 380*15db2897SKrishnendu Sadhukhan - Sun Microsystems ++tmp) { 381*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 382*15db2897SKrishnendu Sadhukhan - Sun Microsystems 383*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (*tmp == '\0') { 384*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (-1); 385*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 386*15db2897SKrishnendu Sadhukhan - Sun Microsystems 387*15db2897SKrishnendu Sadhukhan - Sun Microsystems *tmp = '\0'; 388*15db2897SKrishnendu Sadhukhan - Sun Microsystems entryprobe = begin; 389*15db2897SKrishnendu Sadhukhan - Sun Microsystems begin = tmp + 1; 390*15db2897SKrishnendu Sadhukhan - Sun Microsystems 391*15db2897SKrishnendu Sadhukhan - Sun Microsystems while (isspace(*begin)) { 392*15db2897SKrishnendu Sadhukhan - Sun Microsystems ++begin; 393*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 394*15db2897SKrishnendu Sadhukhan - Sun Microsystems 395*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 396*15db2897SKrishnendu Sadhukhan - Sun Microsystems * 10 syscall::pread:entry syscall::pread:return Syscall pread 397*15db2897SKrishnendu Sadhukhan - Sun Microsystems * -----------------------------^ 398*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 399*15db2897SKrishnendu Sadhukhan - Sun Microsystems for (tmp = begin; 400*15db2897SKrishnendu Sadhukhan - Sun Microsystems *tmp != '\0' && !isspace(*tmp); 401*15db2897SKrishnendu Sadhukhan - Sun Microsystems ++tmp) { 402*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 403*15db2897SKrishnendu Sadhukhan - Sun Microsystems 404*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (*tmp == '\0') { 405*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (-1); 406*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 407*15db2897SKrishnendu Sadhukhan - Sun Microsystems 408*15db2897SKrishnendu Sadhukhan - Sun Microsystems *tmp = '\0'; 409*15db2897SKrishnendu Sadhukhan - Sun Microsystems returnprobe = begin; 410*15db2897SKrishnendu Sadhukhan - Sun Microsystems begin = tmp + 1; 411*15db2897SKrishnendu Sadhukhan - Sun Microsystems 412*15db2897SKrishnendu Sadhukhan - Sun Microsystems while (isspace(*begin)) { 413*15db2897SKrishnendu Sadhukhan - Sun Microsystems ++begin; 414*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 415*15db2897SKrishnendu Sadhukhan - Sun Microsystems 416*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 417*15db2897SKrishnendu Sadhukhan - Sun Microsystems * 10 syscall::pread:entry syscall::pread:return Syscall pread 418*15db2897SKrishnendu Sadhukhan - Sun Microsystems * -----------------------------------------------------^ 419*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 420*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (*begin == 0) { 421*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (-1); 422*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 423*15db2897SKrishnendu Sadhukhan - Sun Microsystems 424*15db2897SKrishnendu Sadhukhan - Sun Microsystems cause_str = begin; 425*15db2897SKrishnendu Sadhukhan - Sun Microsystems 426*15db2897SKrishnendu Sadhukhan - Sun Microsystems dmacro = NULL; 427*15db2897SKrishnendu Sadhukhan - Sun Microsystems 428*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* Check if we have mapped this cause before. */ 429*15db2897SKrishnendu Sadhukhan - Sun Microsystems cause = (lt_cause_t *) 430*15db2897SKrishnendu Sadhukhan - Sun Microsystems g_hash_table_lookup(cause_lookup, cause_str); 431*15db2897SKrishnendu Sadhukhan - Sun Microsystems 432*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (cause == NULL) { 433*15db2897SKrishnendu Sadhukhan - Sun Microsystems char *cause_dup = lt_strdup(cause_str); 434*15db2897SKrishnendu Sadhukhan - Sun Microsystems cause = new_cause(cause_dup, 0); 435*15db2897SKrishnendu Sadhukhan - Sun Microsystems g_hash_table_insert(cause_lookup, cause_dup, cause); 436*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 437*15db2897SKrishnendu Sadhukhan - Sun Microsystems 438*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) snprintf(buf, sizeof (buf), "\nTRANSLATE(%s, %s, \"%s\", %d)\n", 439*15db2897SKrishnendu Sadhukhan - Sun Microsystems entryprobe, returnprobe, cause_str, priority); 440*15db2897SKrishnendu Sadhukhan - Sun Microsystems 441*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) snprintf(probepair, sizeof (probepair), "%s %s", entryprobe, 442*15db2897SKrishnendu Sadhukhan - Sun Microsystems returnprobe); 443*15db2897SKrishnendu Sadhukhan - Sun Microsystems 444*15db2897SKrishnendu Sadhukhan - Sun Microsystems g_assert(cause != NULL); 445*15db2897SKrishnendu Sadhukhan - Sun Microsystems g_assert(parser->lt_pr_dmacro != NULL); 446*15db2897SKrishnendu Sadhukhan - Sun Microsystems 447*15db2897SKrishnendu Sadhukhan - Sun Microsystems dmacro = g_hash_table_lookup(parser->lt_pr_dmacro, probepair); 448*15db2897SKrishnendu Sadhukhan - Sun Microsystems 449*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (dmacro == NULL) { 450*15db2897SKrishnendu Sadhukhan - Sun Microsystems dmacro = (lt_dmacro_t *)lt_malloc(sizeof (lt_dmacro_t)); 451*15db2897SKrishnendu Sadhukhan - Sun Microsystems dmacro->lt_dm_priority = priority; 452*15db2897SKrishnendu Sadhukhan - Sun Microsystems dmacro->lt_dm_macro = lt_strdup(buf); 453*15db2897SKrishnendu Sadhukhan - Sun Microsystems g_hash_table_insert(parser->lt_pr_dmacro, lt_strdup(probepair), 454*15db2897SKrishnendu Sadhukhan - Sun Microsystems dmacro); 455*15db2897SKrishnendu Sadhukhan - Sun Microsystems } else if (dmacro->lt_dm_priority < priority) { 456*15db2897SKrishnendu Sadhukhan - Sun Microsystems free(dmacro->lt_dm_macro); 457*15db2897SKrishnendu Sadhukhan - Sun Microsystems dmacro->lt_dm_priority = priority; 458*15db2897SKrishnendu Sadhukhan - Sun Microsystems dmacro->lt_dm_macro = lt_strdup(buf); 459*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 460*15db2897SKrishnendu Sadhukhan - Sun Microsystems 461*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (0); 462*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 463*15db2897SKrishnendu Sadhukhan - Sun Microsystems 464*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 465*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Helper function to collect TRANSLATE() macros. 466*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 467*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* ARGSUSED */ 468*15db2897SKrishnendu Sadhukhan - Sun Microsystems static void 469*15db2897SKrishnendu Sadhukhan - Sun Microsystems genscript(void *key, lt_dmacro_t *dmacro, GString *str) 470*15db2897SKrishnendu Sadhukhan - Sun Microsystems { 471*15db2897SKrishnendu Sadhukhan - Sun Microsystems g_string_append(str, dmacro->lt_dm_macro); 472*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 473*15db2897SKrishnendu Sadhukhan - Sun Microsystems 474*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 475*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Main logic that parses translation rules one line at a time, 476*15db2897SKrishnendu Sadhukhan - Sun Microsystems * and creates a lookup table from it. The syntax for the translation 477*15db2897SKrishnendu Sadhukhan - Sun Microsystems * is as follows : 478*15db2897SKrishnendu Sadhukhan - Sun Microsystems * 479*15db2897SKrishnendu Sadhukhan - Sun Microsystems * # <--- comment 480*15db2897SKrishnendu Sadhukhan - Sun Microsystems * D <D macro rule> <--- D macro 481*15db2897SKrishnendu Sadhukhan - Sun Microsystems * S <Symbol translation> <--- Symbols 482*15db2897SKrishnendu Sadhukhan - Sun Microsystems * disable_cause <cause> <--- special command 483*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 484*15db2897SKrishnendu Sadhukhan - Sun Microsystems static int 485*15db2897SKrishnendu Sadhukhan - Sun Microsystems parse_config(const char *work, int work_len) 486*15db2897SKrishnendu Sadhukhan - Sun Microsystems { 487*15db2897SKrishnendu Sadhukhan - Sun Microsystems char line[256]; 488*15db2897SKrishnendu Sadhukhan - Sun Microsystems int len; 489*15db2897SKrishnendu Sadhukhan - Sun Microsystems char *begin, *end; 490*15db2897SKrishnendu Sadhukhan - Sun Microsystems int current = 0; 491*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_parser_t parser; 492*15db2897SKrishnendu Sadhukhan - Sun Microsystems int ret = 0; 493*15db2897SKrishnendu Sadhukhan - Sun Microsystems char flag; 494*15db2897SKrishnendu Sadhukhan - Sun Microsystems GString *script; 495*15db2897SKrishnendu Sadhukhan - Sun Microsystems 496*15db2897SKrishnendu Sadhukhan - Sun Microsystems cause_lookup = g_hash_table_new(g_str_hash, g_str_equal); 497*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_check_null(cause_lookup); 498*15db2897SKrishnendu Sadhukhan - Sun Microsystems 499*15db2897SKrishnendu Sadhukhan - Sun Microsystems parser.lt_pr_cmd_disable = g_sequence_new((GDestroyNotify)free); 500*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_check_null(parser.lt_pr_cmd_disable); 501*15db2897SKrishnendu Sadhukhan - Sun Microsystems 502*15db2897SKrishnendu Sadhukhan - Sun Microsystems parser.lt_pr_dmacro = g_hash_table_new_full(g_str_hash, 503*15db2897SKrishnendu Sadhukhan - Sun Microsystems g_str_equal, (GDestroyNotify)free, (GDestroyNotify)free_dmacro); 504*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_check_null(parser.lt_pr_dmacro); 505*15db2897SKrishnendu Sadhukhan - Sun Microsystems 506*15db2897SKrishnendu Sadhukhan - Sun Microsystems while (read_line_from_mem(work, work_len, line, sizeof (line), 507*15db2897SKrishnendu Sadhukhan - Sun Microsystems ¤t)) { 508*15db2897SKrishnendu Sadhukhan - Sun Microsystems len = strlen(line); 509*15db2897SKrishnendu Sadhukhan - Sun Microsystems 510*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (line[len-1] != '\n' && line[len-1] != '\r' && 511*15db2897SKrishnendu Sadhukhan - Sun Microsystems current < work_len) { 512*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_error("Configuration line too long.\n"); 513*15db2897SKrishnendu Sadhukhan - Sun Microsystems goto err; 514*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 515*15db2897SKrishnendu Sadhukhan - Sun Microsystems 516*15db2897SKrishnendu Sadhukhan - Sun Microsystems begin = line; 517*15db2897SKrishnendu Sadhukhan - Sun Microsystems 518*15db2897SKrishnendu Sadhukhan - Sun Microsystems while (isspace(*begin)) { 519*15db2897SKrishnendu Sadhukhan - Sun Microsystems ++begin; 520*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 521*15db2897SKrishnendu Sadhukhan - Sun Microsystems 522*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (*begin == '\0') { 523*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* Ignore empty line */ 524*15db2897SKrishnendu Sadhukhan - Sun Microsystems continue; 525*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 526*15db2897SKrishnendu Sadhukhan - Sun Microsystems 527*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* Delete trailing spaces. */ 528*15db2897SKrishnendu Sadhukhan - Sun Microsystems end = begin + strlen(begin) - 1; 529*15db2897SKrishnendu Sadhukhan - Sun Microsystems 530*15db2897SKrishnendu Sadhukhan - Sun Microsystems while (isspace(*end)) { 531*15db2897SKrishnendu Sadhukhan - Sun Microsystems --end; 532*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 533*15db2897SKrishnendu Sadhukhan - Sun Microsystems 534*15db2897SKrishnendu Sadhukhan - Sun Microsystems end[1] = '\0'; 535*15db2897SKrishnendu Sadhukhan - Sun Microsystems 536*15db2897SKrishnendu Sadhukhan - Sun Microsystems flag = *begin; 537*15db2897SKrishnendu Sadhukhan - Sun Microsystems ++begin; 538*15db2897SKrishnendu Sadhukhan - Sun Microsystems 539*15db2897SKrishnendu Sadhukhan - Sun Microsystems switch (flag) { 540*15db2897SKrishnendu Sadhukhan - Sun Microsystems case '#': 541*15db2897SKrishnendu Sadhukhan - Sun Microsystems ret = 0; 542*15db2897SKrishnendu Sadhukhan - Sun Microsystems break; 543*15db2897SKrishnendu Sadhukhan - Sun Microsystems case ';': 544*15db2897SKrishnendu Sadhukhan - Sun Microsystems ret = parse_config_cmd(begin, &parser); 545*15db2897SKrishnendu Sadhukhan - Sun Microsystems break; 546*15db2897SKrishnendu Sadhukhan - Sun Microsystems case 'D': 547*15db2897SKrishnendu Sadhukhan - Sun Microsystems case 'd': 548*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (!isspace(*begin)) { 549*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_error( 550*15db2897SKrishnendu Sadhukhan - Sun Microsystems "No space after flag char: %s\n", line); 551*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 552*15db2897SKrishnendu Sadhukhan - Sun Microsystems while (isspace(*begin)) { 553*15db2897SKrishnendu Sadhukhan - Sun Microsystems ++begin; 554*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 555*15db2897SKrishnendu Sadhukhan - Sun Microsystems ret = parse_dmacro(begin, &parser); 556*15db2897SKrishnendu Sadhukhan - Sun Microsystems break; 557*15db2897SKrishnendu Sadhukhan - Sun Microsystems case 'S': 558*15db2897SKrishnendu Sadhukhan - Sun Microsystems case 's': 559*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (!isspace(*begin)) { 560*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_error( 561*15db2897SKrishnendu Sadhukhan - Sun Microsystems "No space after flag char: %s\n", line); 562*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 563*15db2897SKrishnendu Sadhukhan - Sun Microsystems while (isspace(*begin)) { 564*15db2897SKrishnendu Sadhukhan - Sun Microsystems ++begin; 565*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 566*15db2897SKrishnendu Sadhukhan - Sun Microsystems ret = parse_sym_trans(begin); 567*15db2897SKrishnendu Sadhukhan - Sun Microsystems break; 568*15db2897SKrishnendu Sadhukhan - Sun Microsystems default: 569*15db2897SKrishnendu Sadhukhan - Sun Microsystems ret = -1; 570*15db2897SKrishnendu Sadhukhan - Sun Microsystems break; 571*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 572*15db2897SKrishnendu Sadhukhan - Sun Microsystems 573*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (ret != 0) { 574*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_error( 575*15db2897SKrishnendu Sadhukhan - Sun Microsystems "Invalid configuration line: %s\n", line); 576*15db2897SKrishnendu Sadhukhan - Sun Microsystems goto err; 577*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 578*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 579*15db2897SKrishnendu Sadhukhan - Sun Microsystems 580*15db2897SKrishnendu Sadhukhan - Sun Microsystems script = g_string_new(NULL); 581*15db2897SKrishnendu Sadhukhan - Sun Microsystems g_hash_table_foreach(parser.lt_pr_dmacro, (GHFunc)genscript, script); 582*15db2897SKrishnendu Sadhukhan - Sun Microsystems dtrans = g_string_free(script, FALSE); 583*15db2897SKrishnendu Sadhukhan - Sun Microsystems 584*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (dtrans != NULL && strlen(dtrans) == 0) { 585*15db2897SKrishnendu Sadhukhan - Sun Microsystems free(dtrans); 586*15db2897SKrishnendu Sadhukhan - Sun Microsystems dtrans = NULL; 587*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 588*15db2897SKrishnendu Sadhukhan - Sun Microsystems 589*15db2897SKrishnendu Sadhukhan - Sun Microsystems g_sequence_foreach(parser.lt_pr_cmd_disable, (GFunc)disable_cause, 590*15db2897SKrishnendu Sadhukhan - Sun Microsystems cause_lookup); 591*15db2897SKrishnendu Sadhukhan - Sun Microsystems g_sequence_free(parser.lt_pr_cmd_disable); 592*15db2897SKrishnendu Sadhukhan - Sun Microsystems 593*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (0); 594*15db2897SKrishnendu Sadhukhan - Sun Microsystems 595*15db2897SKrishnendu Sadhukhan - Sun Microsystems err: 596*15db2897SKrishnendu Sadhukhan - Sun Microsystems g_sequence_free(parser.lt_pr_cmd_disable); 597*15db2897SKrishnendu Sadhukhan - Sun Microsystems g_hash_table_destroy(parser.lt_pr_dmacro); 598*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (-1); 599*15db2897SKrishnendu Sadhukhan - Sun Microsystems 600*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 601*15db2897SKrishnendu Sadhukhan - Sun Microsystems 602*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 603*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Init function, called when latencytop starts. 604*15db2897SKrishnendu Sadhukhan - Sun Microsystems * It loads translation rules from the configuration file. The configuration 605*15db2897SKrishnendu Sadhukhan - Sun Microsystems * file defines some causes and symbols that match those causes. 606*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 607*15db2897SKrishnendu Sadhukhan - Sun Microsystems int 608*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_table_init(void) 609*15db2897SKrishnendu Sadhukhan - Sun Microsystems { 610*15db2897SKrishnendu Sadhukhan - Sun Microsystems char *config_loaded = NULL; 611*15db2897SKrishnendu Sadhukhan - Sun Microsystems int config_loaded_len = 0; 612*15db2897SKrishnendu Sadhukhan - Sun Microsystems const char *work = NULL; 613*15db2897SKrishnendu Sadhukhan - Sun Microsystems int work_len = 0; 614*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_cause_t *cause; 615*15db2897SKrishnendu Sadhukhan - Sun Microsystems 616*15db2897SKrishnendu Sadhukhan - Sun Microsystems #ifdef EMBED_CONFIGS 617*15db2897SKrishnendu Sadhukhan - Sun Microsystems work = &latencytop_trans_start; 618*15db2897SKrishnendu Sadhukhan - Sun Microsystems work_len = (int)(&latencytop_trans_end - &latencytop_trans_start); 619*15db2897SKrishnendu Sadhukhan - Sun Microsystems #endif 620*15db2897SKrishnendu Sadhukhan - Sun Microsystems 621*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (g_config.lt_cfg_config_name != NULL) { 622*15db2897SKrishnendu Sadhukhan - Sun Microsystems FILE *fp; 623*15db2897SKrishnendu Sadhukhan - Sun Microsystems fp = fopen(g_config.lt_cfg_config_name, "r"); 624*15db2897SKrishnendu Sadhukhan - Sun Microsystems 625*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (NULL == fp) { 626*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_error( 627*15db2897SKrishnendu Sadhukhan - Sun Microsystems "Unable to open configuration file.\n"); 628*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (-1); 629*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 630*15db2897SKrishnendu Sadhukhan - Sun Microsystems 631*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) fseek(fp, 0, SEEK_END); 632*15db2897SKrishnendu Sadhukhan - Sun Microsystems config_loaded_len = (int)ftell(fp); 633*15db2897SKrishnendu Sadhukhan - Sun Microsystems config_loaded = (char *)lt_malloc(config_loaded_len); 634*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) fseek(fp, 0, SEEK_SET); 635*15db2897SKrishnendu Sadhukhan - Sun Microsystems 636*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* A zero-byte translation is valid */ 637*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (config_loaded_len != 0 && 638*15db2897SKrishnendu Sadhukhan - Sun Microsystems fread(config_loaded, config_loaded_len, 1, fp) == 0) { 639*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_error( 640*15db2897SKrishnendu Sadhukhan - Sun Microsystems "Unable to read configuration file.\n"); 641*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) fclose(fp); 642*15db2897SKrishnendu Sadhukhan - Sun Microsystems free(config_loaded); 643*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (-1); 644*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 645*15db2897SKrishnendu Sadhukhan - Sun Microsystems 646*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) fclose(fp); 647*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) printf("Loaded configuration from %s\n", 648*15db2897SKrishnendu Sadhukhan - Sun Microsystems g_config.lt_cfg_config_name); 649*15db2897SKrishnendu Sadhukhan - Sun Microsystems 650*15db2897SKrishnendu Sadhukhan - Sun Microsystems work = config_loaded; 651*15db2897SKrishnendu Sadhukhan - Sun Microsystems work_len = config_loaded_len; 652*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 653*15db2897SKrishnendu Sadhukhan - Sun Microsystems 654*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_table_deinit(); 655*15db2897SKrishnendu Sadhukhan - Sun Microsystems causes_array = g_ptr_array_new(); 656*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_check_null(causes_array); 657*15db2897SKrishnendu Sadhukhan - Sun Microsystems 658*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 0 is not used, but it is kept as a place for bugs etc. */ 659*15db2897SKrishnendu Sadhukhan - Sun Microsystems cause = new_cause(lt_strdup("Nothing"), CAUSE_FLAG_DISABLED); 660*15db2897SKrishnendu Sadhukhan - Sun Microsystems g_assert(cause->lt_c_cause_id == INVALID_CAUSE); 661*15db2897SKrishnendu Sadhukhan - Sun Microsystems 662*15db2897SKrishnendu Sadhukhan - Sun Microsystems symbol_lookup_table = g_hash_table_new_full( 663*15db2897SKrishnendu Sadhukhan - Sun Microsystems g_str_hash, g_str_equal, 664*15db2897SKrishnendu Sadhukhan - Sun Microsystems (GDestroyNotify)free, (GDestroyNotify)free); 665*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_check_null(symbol_lookup_table); 666*15db2897SKrishnendu Sadhukhan - Sun Microsystems 667*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (work_len != 0 && parse_config(work, work_len) != 0) { 668*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (-1); 669*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 670*15db2897SKrishnendu Sadhukhan - Sun Microsystems 671*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (config_loaded != NULL) { 672*15db2897SKrishnendu Sadhukhan - Sun Microsystems free(config_loaded); 673*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 674*15db2897SKrishnendu Sadhukhan - Sun Microsystems 675*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (0); 676*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 677*15db2897SKrishnendu Sadhukhan - Sun Microsystems 678*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 679*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Some causes, such as "lock spinning", do not have stack trace. Names 680*15db2897SKrishnendu Sadhukhan - Sun Microsystems * of such causes are explicitly specified in the D script. 681*15db2897SKrishnendu Sadhukhan - Sun Microsystems * This function resolves such causes and dynamically adds them 682*15db2897SKrishnendu Sadhukhan - Sun Microsystems * to the global tables when they are found first. If auto_create is set 683*15db2897SKrishnendu Sadhukhan - Sun Microsystems * to TRUE, the entry will be created if it is not found. 684*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Return cause_id of the cause. 685*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 686*15db2897SKrishnendu Sadhukhan - Sun Microsystems int 687*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_table_cause_from_name(char *name, int auto_create, int flags) 688*15db2897SKrishnendu Sadhukhan - Sun Microsystems { 689*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_cause_t *cause = NULL; 690*15db2897SKrishnendu Sadhukhan - Sun Microsystems 691*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (cause_lookup == NULL) { 692*15db2897SKrishnendu Sadhukhan - Sun Microsystems cause_lookup = g_hash_table_new(g_str_hash, g_str_equal); 693*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_check_null(cause_lookup); 694*15db2897SKrishnendu Sadhukhan - Sun Microsystems } else { 695*15db2897SKrishnendu Sadhukhan - Sun Microsystems cause = (lt_cause_t *) 696*15db2897SKrishnendu Sadhukhan - Sun Microsystems g_hash_table_lookup(cause_lookup, name); 697*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 698*15db2897SKrishnendu Sadhukhan - Sun Microsystems 699*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (cause == NULL && auto_create) { 700*15db2897SKrishnendu Sadhukhan - Sun Microsystems char *cause_dup; 701*15db2897SKrishnendu Sadhukhan - Sun Microsystems 702*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (name[0] == '#') { 703*15db2897SKrishnendu Sadhukhan - Sun Microsystems flags |= CAUSE_FLAG_HIDE_IN_SUMMARY; 704*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 705*15db2897SKrishnendu Sadhukhan - Sun Microsystems 706*15db2897SKrishnendu Sadhukhan - Sun Microsystems cause_dup = lt_strdup(name); 707*15db2897SKrishnendu Sadhukhan - Sun Microsystems cause = new_cause(cause_dup, flags); 708*15db2897SKrishnendu Sadhukhan - Sun Microsystems g_hash_table_insert(cause_lookup, cause_dup, cause); 709*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 710*15db2897SKrishnendu Sadhukhan - Sun Microsystems 711*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (cause == NULL ? INVALID_CAUSE : cause->lt_c_cause_id); 712*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 713*15db2897SKrishnendu Sadhukhan - Sun Microsystems 714*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 715*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Try to map a symbol on stack to a known cause. 716*15db2897SKrishnendu Sadhukhan - Sun Microsystems * module_func has the format "module_name`function_name". 717*15db2897SKrishnendu Sadhukhan - Sun Microsystems * cause_id and priority will be set if a cause is found. 718*15db2897SKrishnendu Sadhukhan - Sun Microsystems * If cause is found return 1, otherwise return 0. 719*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 720*15db2897SKrishnendu Sadhukhan - Sun Microsystems int 721*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_table_cause_from_stack(const char *module_func, int *cause_id, int *priority) 722*15db2897SKrishnendu Sadhukhan - Sun Microsystems { 723*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_match_t *match; 724*15db2897SKrishnendu Sadhukhan - Sun Microsystems 725*15db2897SKrishnendu Sadhukhan - Sun Microsystems g_assert(module_func != NULL && cause_id != NULL && priority != NULL); 726*15db2897SKrishnendu Sadhukhan - Sun Microsystems 727*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (symbol_lookup_table == NULL) { 728*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (0); 729*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 730*15db2897SKrishnendu Sadhukhan - Sun Microsystems 731*15db2897SKrishnendu Sadhukhan - Sun Microsystems match = (lt_match_t *) 732*15db2897SKrishnendu Sadhukhan - Sun Microsystems g_hash_table_lookup(symbol_lookup_table, module_func); 733*15db2897SKrishnendu Sadhukhan - Sun Microsystems 734*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (match == NULL) { 735*15db2897SKrishnendu Sadhukhan - Sun Microsystems char *func = strchr(module_func, '`'); 736*15db2897SKrishnendu Sadhukhan - Sun Microsystems 737*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (func != NULL) { 738*15db2897SKrishnendu Sadhukhan - Sun Microsystems match = (lt_match_t *) 739*15db2897SKrishnendu Sadhukhan - Sun Microsystems g_hash_table_lookup(symbol_lookup_table, func); 740*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 741*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 742*15db2897SKrishnendu Sadhukhan - Sun Microsystems 743*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (match == NULL) { 744*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (0); 745*15db2897SKrishnendu Sadhukhan - Sun Microsystems } else { 746*15db2897SKrishnendu Sadhukhan - Sun Microsystems *cause_id = match->lt_mt_cause_id; 747*15db2897SKrishnendu Sadhukhan - Sun Microsystems *priority = match->lt_mt_priority; 748*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (1); 749*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 750*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 751*15db2897SKrishnendu Sadhukhan - Sun Microsystems 752*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 753*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Get the display name of a cause. cause_id must be valid, 754*15db2897SKrishnendu Sadhukhan - Sun Microsystems * it is usually returned from lt_table_cause_from_stack() or 755*15db2897SKrishnendu Sadhukhan - Sun Microsystems * lt_table_cause_from_name(). 756*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 757*15db2897SKrishnendu Sadhukhan - Sun Microsystems const char * 758*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_table_get_cause_name(int cause_id) 759*15db2897SKrishnendu Sadhukhan - Sun Microsystems { 760*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_cause_t *cause; 761*15db2897SKrishnendu Sadhukhan - Sun Microsystems 762*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (cause_id < 0 || cause_id >= causes_array_len) { 763*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (NULL); 764*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 765*15db2897SKrishnendu Sadhukhan - Sun Microsystems 766*15db2897SKrishnendu Sadhukhan - Sun Microsystems cause = (lt_cause_t *)g_ptr_array_index(causes_array, cause_id); 767*15db2897SKrishnendu Sadhukhan - Sun Microsystems 768*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (cause == NULL) { 769*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (NULL); 770*15db2897SKrishnendu Sadhukhan - Sun Microsystems } else { 771*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (cause->lt_c_name); 772*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 773*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 774*15db2897SKrishnendu Sadhukhan - Sun Microsystems 775*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 776*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Check cause flag. 777*15db2897SKrishnendu Sadhukhan - Sun Microsystems * If CAUSE_ALL_FLAGS is passed in, all flags are returned. 778*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 779*15db2897SKrishnendu Sadhukhan - Sun Microsystems int 780*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_table_get_cause_flag(int cause_id, int flag) 781*15db2897SKrishnendu Sadhukhan - Sun Microsystems { 782*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_cause_t *cause; 783*15db2897SKrishnendu Sadhukhan - Sun Microsystems 784*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (cause_id < 0 || cause_id >= causes_array_len) { 785*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (0); 786*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 787*15db2897SKrishnendu Sadhukhan - Sun Microsystems 788*15db2897SKrishnendu Sadhukhan - Sun Microsystems cause = (lt_cause_t *)g_ptr_array_index(causes_array, cause_id); 789*15db2897SKrishnendu Sadhukhan - Sun Microsystems 790*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (cause == NULL) { 791*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (0); 792*15db2897SKrishnendu Sadhukhan - Sun Microsystems } else { 793*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (cause->lt_c_flags & flag); 794*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 795*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 796*15db2897SKrishnendu Sadhukhan - Sun Microsystems 797*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 798*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Append macros to D script, if any. 799*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 800*15db2897SKrishnendu Sadhukhan - Sun Microsystems int 801*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_table_append_trans(FILE *fp) 802*15db2897SKrishnendu Sadhukhan - Sun Microsystems { 803*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (dtrans != NULL) { 804*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (fwrite(dtrans, strlen(dtrans), 1, fp) != 1) { 805*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (-1); 806*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 807*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 808*15db2897SKrishnendu Sadhukhan - Sun Microsystems 809*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (0); 810*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 811*15db2897SKrishnendu Sadhukhan - Sun Microsystems 812*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 813*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Clean up function. 814*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Free the resources used for symbol table (symbols, causes etc.). 815*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 816*15db2897SKrishnendu Sadhukhan - Sun Microsystems void 817*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_table_deinit(void) 818*15db2897SKrishnendu Sadhukhan - Sun Microsystems { 819*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (symbol_lookup_table != NULL) { 820*15db2897SKrishnendu Sadhukhan - Sun Microsystems g_hash_table_destroy(symbol_lookup_table); 821*15db2897SKrishnendu Sadhukhan - Sun Microsystems symbol_lookup_table = NULL; 822*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 823*15db2897SKrishnendu Sadhukhan - Sun Microsystems 824*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (cause_lookup != NULL) { 825*15db2897SKrishnendu Sadhukhan - Sun Microsystems g_hash_table_destroy(cause_lookup); 826*15db2897SKrishnendu Sadhukhan - Sun Microsystems cause_lookup = NULL; 827*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 828*15db2897SKrishnendu Sadhukhan - Sun Microsystems 829*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (causes_array != NULL) { 830*15db2897SKrishnendu Sadhukhan - Sun Microsystems g_ptr_array_foreach(causes_array, (GFunc)free_cause, NULL); 831*15db2897SKrishnendu Sadhukhan - Sun Microsystems g_ptr_array_free(causes_array, TRUE); 832*15db2897SKrishnendu Sadhukhan - Sun Microsystems causes_array = NULL; 833*15db2897SKrishnendu Sadhukhan - Sun Microsystems causes_array_len = 0; 834*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 835*15db2897SKrishnendu Sadhukhan - Sun Microsystems 836*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (dtrans != NULL) { 837*15db2897SKrishnendu Sadhukhan - Sun Microsystems g_free(dtrans); 838*15db2897SKrishnendu Sadhukhan - Sun Microsystems dtrans = NULL; 839*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 840*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 841