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