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
free_cause(lt_cause_t * cause,void * user)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
free_dmacro(lt_dmacro_t * d)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 *
new_cause(char * name,int flags)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
disable_cause(char * cause_str,GHashTable * cause_table)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
read_line_from_mem(const char * mem,int mem_len,char * line,int line_len,int * index)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
parse_config_cmd(char * begin,lt_parser_t * parser)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
parse_sym_trans(char * begin)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
parse_dmacro(char * begin,lt_parser_t * parser)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
genscript(void * key,lt_dmacro_t * dmacro,GString * str)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
parse_config(const char * work,int work_len)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 	    &current)) {
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
lt_table_init(void)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
lt_table_cause_from_name(char * name,int auto_create,int flags)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
lt_table_cause_from_stack(const char * module_func,int * cause_id,int * priority)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 *
lt_table_get_cause_name(int cause_id)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
lt_table_get_cause_flag(int cause_id,int flag)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
lt_table_append_trans(FILE * fp)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
lt_table_deinit(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