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 <unistd.h>
27*15db2897SKrishnendu Sadhukhan - Sun Microsystems #include <libintl.h>
28*15db2897SKrishnendu Sadhukhan - Sun Microsystems #include <stdio.h>
29*15db2897SKrishnendu Sadhukhan - Sun Microsystems #include <stdlib.h>
30*15db2897SKrishnendu Sadhukhan - Sun Microsystems #include <string.h>
31*15db2897SKrishnendu Sadhukhan - Sun Microsystems #include <ctype.h>
32*15db2897SKrishnendu Sadhukhan - Sun Microsystems #include <procfs.h>
33*15db2897SKrishnendu Sadhukhan - Sun Microsystems #include <fcntl.h>
34*15db2897SKrishnendu Sadhukhan - Sun Microsystems #include <sys/types.h>
35*15db2897SKrishnendu Sadhukhan - Sun Microsystems #include <sys/stat.h>
36*15db2897SKrishnendu Sadhukhan - Sun Microsystems
37*15db2897SKrishnendu Sadhukhan - Sun Microsystems #include "latencytop.h"
38*15db2897SKrishnendu Sadhukhan - Sun Microsystems
39*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* Pipe that breaks the event loop (and exits early) */
40*15db2897SKrishnendu Sadhukhan - Sun Microsystems static int signal_pipe[2];
41*15db2897SKrishnendu Sadhukhan - Sun Microsystems
42*15db2897SKrishnendu Sadhukhan - Sun Microsystems /*
43*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Get current system time in milliseconds (1e-3).
44*15db2897SKrishnendu Sadhukhan - Sun Microsystems */
45*15db2897SKrishnendu Sadhukhan - Sun Microsystems uint64_t
lt_millisecond(void)46*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_millisecond(void)
47*15db2897SKrishnendu Sadhukhan - Sun Microsystems {
48*15db2897SKrishnendu Sadhukhan - Sun Microsystems struct timeval p;
49*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) gettimeofday(&p, NULL);
50*15db2897SKrishnendu Sadhukhan - Sun Microsystems return ((uint64_t)p.tv_sec * 1000 + p.tv_usec / 1000);
51*15db2897SKrishnendu Sadhukhan - Sun Microsystems }
52*15db2897SKrishnendu Sadhukhan - Sun Microsystems
53*15db2897SKrishnendu Sadhukhan - Sun Microsystems /*
54*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Check if we are out of memory.
55*15db2897SKrishnendu Sadhukhan - Sun Microsystems */
56*15db2897SKrishnendu Sadhukhan - Sun Microsystems void
lt_check_null(void * p)57*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_check_null(void *p)
58*15db2897SKrishnendu Sadhukhan - Sun Microsystems {
59*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (p == NULL) {
60*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) fprintf(stderr, "Out of memory!\n");
61*15db2897SKrishnendu Sadhukhan - Sun Microsystems g_assert(0);
62*15db2897SKrishnendu Sadhukhan - Sun Microsystems exit(2);
63*15db2897SKrishnendu Sadhukhan - Sun Microsystems }
64*15db2897SKrishnendu Sadhukhan - Sun Microsystems }
65*15db2897SKrishnendu Sadhukhan - Sun Microsystems
66*15db2897SKrishnendu Sadhukhan - Sun Microsystems /*
67*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Safe malloc.
68*15db2897SKrishnendu Sadhukhan - Sun Microsystems */
69*15db2897SKrishnendu Sadhukhan - Sun Microsystems void *
lt_malloc(size_t size)70*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_malloc(size_t size)
71*15db2897SKrishnendu Sadhukhan - Sun Microsystems {
72*15db2897SKrishnendu Sadhukhan - Sun Microsystems void *ret = malloc(size);
73*15db2897SKrishnendu Sadhukhan - Sun Microsystems
74*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_check_null(ret);
75*15db2897SKrishnendu Sadhukhan - Sun Microsystems
76*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (ret);
77*15db2897SKrishnendu Sadhukhan - Sun Microsystems }
78*15db2897SKrishnendu Sadhukhan - Sun Microsystems
79*15db2897SKrishnendu Sadhukhan - Sun Microsystems /*
80*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Safe alloc with memory cleared.
81*15db2897SKrishnendu Sadhukhan - Sun Microsystems * It is named "zalloc" because its signature is different from
82*15db2897SKrishnendu Sadhukhan - Sun Microsystems * calloc() in stdlib.
83*15db2897SKrishnendu Sadhukhan - Sun Microsystems */
84*15db2897SKrishnendu Sadhukhan - Sun Microsystems void *
lt_zalloc(size_t size)85*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_zalloc(size_t size)
86*15db2897SKrishnendu Sadhukhan - Sun Microsystems {
87*15db2897SKrishnendu Sadhukhan - Sun Microsystems void *ret = calloc(size, 1);
88*15db2897SKrishnendu Sadhukhan - Sun Microsystems
89*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_check_null(ret);
90*15db2897SKrishnendu Sadhukhan - Sun Microsystems
91*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (ret);
92*15db2897SKrishnendu Sadhukhan - Sun Microsystems }
93*15db2897SKrishnendu Sadhukhan - Sun Microsystems
94*15db2897SKrishnendu Sadhukhan - Sun Microsystems /*
95*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Safe strdup.
96*15db2897SKrishnendu Sadhukhan - Sun Microsystems */
97*15db2897SKrishnendu Sadhukhan - Sun Microsystems char *
lt_strdup(const char * str)98*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_strdup(const char *str)
99*15db2897SKrishnendu Sadhukhan - Sun Microsystems {
100*15db2897SKrishnendu Sadhukhan - Sun Microsystems char *ret = strdup(str);
101*15db2897SKrishnendu Sadhukhan - Sun Microsystems
102*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_check_null(ret);
103*15db2897SKrishnendu Sadhukhan - Sun Microsystems
104*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (ret);
105*15db2897SKrishnendu Sadhukhan - Sun Microsystems }
106*15db2897SKrishnendu Sadhukhan - Sun Microsystems
107*15db2897SKrishnendu Sadhukhan - Sun Microsystems /*
108*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Get string for current time, e.g. YYYY-MM-DD
109*15db2897SKrishnendu Sadhukhan - Sun Microsystems */
110*15db2897SKrishnendu Sadhukhan - Sun Microsystems void
lt_time_str(char * buffer,int len)111*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_time_str(char *buffer, int len)
112*15db2897SKrishnendu Sadhukhan - Sun Microsystems {
113*15db2897SKrishnendu Sadhukhan - Sun Microsystems struct tm tms;
114*15db2897SKrishnendu Sadhukhan - Sun Microsystems time_t t;
115*15db2897SKrishnendu Sadhukhan - Sun Microsystems int i;
116*15db2897SKrishnendu Sadhukhan - Sun Microsystems
117*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) time(&t);
118*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) gmtime_r(&t, &tms);
119*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) asctime_r(&tms, buffer, len);
120*15db2897SKrishnendu Sadhukhan - Sun Microsystems
121*15db2897SKrishnendu Sadhukhan - Sun Microsystems for (i = strlen(buffer)-1; i > 0; --i) {
122*15db2897SKrishnendu Sadhukhan - Sun Microsystems
123*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (isspace(buffer[i])) {
124*15db2897SKrishnendu Sadhukhan - Sun Microsystems buffer[i] = '\0';
125*15db2897SKrishnendu Sadhukhan - Sun Microsystems } else {
126*15db2897SKrishnendu Sadhukhan - Sun Microsystems break;
127*15db2897SKrishnendu Sadhukhan - Sun Microsystems }
128*15db2897SKrishnendu Sadhukhan - Sun Microsystems }
129*15db2897SKrishnendu Sadhukhan - Sun Microsystems }
130*15db2897SKrishnendu Sadhukhan - Sun Microsystems
131*15db2897SKrishnendu Sadhukhan - Sun Microsystems /*
132*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Retrieves the process's executable name and arguments from /proc.
133*15db2897SKrishnendu Sadhukhan - Sun Microsystems */
134*15db2897SKrishnendu Sadhukhan - Sun Microsystems char *
lt_get_proc_field(pid_t pid,lt_field_t field)135*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_get_proc_field(pid_t pid, lt_field_t field)
136*15db2897SKrishnendu Sadhukhan - Sun Microsystems {
137*15db2897SKrishnendu Sadhukhan - Sun Microsystems char name[PATH_MAX];
138*15db2897SKrishnendu Sadhukhan - Sun Microsystems int fd;
139*15db2897SKrishnendu Sadhukhan - Sun Microsystems int ret;
140*15db2897SKrishnendu Sadhukhan - Sun Microsystems psinfo_t psinfo;
141*15db2897SKrishnendu Sadhukhan - Sun Microsystems
142*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) snprintf(name, PATH_MAX, "/proc/%d/psinfo", (int)pid);
143*15db2897SKrishnendu Sadhukhan - Sun Microsystems fd = open(name, O_RDONLY);
144*15db2897SKrishnendu Sadhukhan - Sun Microsystems
145*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (fd == -1) {
146*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (NULL);
147*15db2897SKrishnendu Sadhukhan - Sun Microsystems }
148*15db2897SKrishnendu Sadhukhan - Sun Microsystems
149*15db2897SKrishnendu Sadhukhan - Sun Microsystems ret = read(fd, (char *)&psinfo, sizeof (psinfo_t));
150*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) close(fd);
151*15db2897SKrishnendu Sadhukhan - Sun Microsystems
152*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (ret < 0) {
153*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (NULL);
154*15db2897SKrishnendu Sadhukhan - Sun Microsystems }
155*15db2897SKrishnendu Sadhukhan - Sun Microsystems
156*15db2897SKrishnendu Sadhukhan - Sun Microsystems switch (field) {
157*15db2897SKrishnendu Sadhukhan - Sun Microsystems case LT_FIELD_FNAME:
158*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (lt_strdup(psinfo.pr_fname));
159*15db2897SKrishnendu Sadhukhan - Sun Microsystems case LT_FIELD_PSARGS:
160*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (lt_strdup(psinfo.pr_psargs));
161*15db2897SKrishnendu Sadhukhan - Sun Microsystems }
162*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (NULL);
163*15db2897SKrishnendu Sadhukhan - Sun Microsystems }
164*15db2897SKrishnendu Sadhukhan - Sun Microsystems
165*15db2897SKrishnendu Sadhukhan - Sun Microsystems /*
166*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Helper function to update the data structure.
167*15db2897SKrishnendu Sadhukhan - Sun Microsystems */
168*15db2897SKrishnendu Sadhukhan - Sun Microsystems void
lt_update_stat_value(lt_stat_data_t * entry,lt_stat_type_t type,uint64_t value)169*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_update_stat_value(lt_stat_data_t *entry,
170*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_stat_type_t type, uint64_t value)
171*15db2897SKrishnendu Sadhukhan - Sun Microsystems {
172*15db2897SKrishnendu Sadhukhan - Sun Microsystems switch (type) {
173*15db2897SKrishnendu Sadhukhan - Sun Microsystems case LT_STAT_COUNT:
174*15db2897SKrishnendu Sadhukhan - Sun Microsystems entry->lt_s_count += value;
175*15db2897SKrishnendu Sadhukhan - Sun Microsystems break;
176*15db2897SKrishnendu Sadhukhan - Sun Microsystems case LT_STAT_SUM:
177*15db2897SKrishnendu Sadhukhan - Sun Microsystems entry->lt_s_total += value;
178*15db2897SKrishnendu Sadhukhan - Sun Microsystems break;
179*15db2897SKrishnendu Sadhukhan - Sun Microsystems case LT_STAT_MAX:
180*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (value > entry->lt_s_max) {
181*15db2897SKrishnendu Sadhukhan - Sun Microsystems entry->lt_s_max = value;
182*15db2897SKrishnendu Sadhukhan - Sun Microsystems }
183*15db2897SKrishnendu Sadhukhan - Sun Microsystems break;
184*15db2897SKrishnendu Sadhukhan - Sun Microsystems default:
185*15db2897SKrishnendu Sadhukhan - Sun Microsystems break;
186*15db2897SKrishnendu Sadhukhan - Sun Microsystems }
187*15db2897SKrishnendu Sadhukhan - Sun Microsystems }
188*15db2897SKrishnendu Sadhukhan - Sun Microsystems
189*15db2897SKrishnendu Sadhukhan - Sun Microsystems /*
190*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Helper function to sort on total.
191*15db2897SKrishnendu Sadhukhan - Sun Microsystems */
192*15db2897SKrishnendu Sadhukhan - Sun Microsystems int
lt_sort_by_total_desc(lt_stat_entry_t * a,lt_stat_entry_t * b)193*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_sort_by_total_desc(lt_stat_entry_t *a, lt_stat_entry_t *b)
194*15db2897SKrishnendu Sadhukhan - Sun Microsystems {
195*15db2897SKrishnendu Sadhukhan - Sun Microsystems g_assert(a != NULL && b != NULL);
196*15db2897SKrishnendu Sadhukhan - Sun Microsystems /*
197*15db2897SKrishnendu Sadhukhan - Sun Microsystems * lt_s_total is of type int64_t, so we can't simply return
198*15db2897SKrishnendu Sadhukhan - Sun Microsystems * (b->lt_se_data.lt_s_total - a->lt_se_data.lt_s_total).
199*15db2897SKrishnendu Sadhukhan - Sun Microsystems */
200*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (b->lt_se_data.lt_s_total > a->lt_se_data.lt_s_total) {
201*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (1);
202*15db2897SKrishnendu Sadhukhan - Sun Microsystems } else if (b->lt_se_data.lt_s_total < a->lt_se_data.lt_s_total) {
203*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (-1);
204*15db2897SKrishnendu Sadhukhan - Sun Microsystems } else {
205*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (0);
206*15db2897SKrishnendu Sadhukhan - Sun Microsystems }
207*15db2897SKrishnendu Sadhukhan - Sun Microsystems }
208*15db2897SKrishnendu Sadhukhan - Sun Microsystems
209*15db2897SKrishnendu Sadhukhan - Sun Microsystems /*
210*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Helper function to sort on max.
211*15db2897SKrishnendu Sadhukhan - Sun Microsystems */
212*15db2897SKrishnendu Sadhukhan - Sun Microsystems int
lt_sort_by_max_desc(lt_stat_entry_t * a,lt_stat_entry_t * b)213*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_sort_by_max_desc(lt_stat_entry_t *a, lt_stat_entry_t *b)
214*15db2897SKrishnendu Sadhukhan - Sun Microsystems {
215*15db2897SKrishnendu Sadhukhan - Sun Microsystems g_assert(a != NULL && b != NULL);
216*15db2897SKrishnendu Sadhukhan - Sun Microsystems
217*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (b->lt_se_data.lt_s_max > a->lt_se_data.lt_s_max) {
218*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (1);
219*15db2897SKrishnendu Sadhukhan - Sun Microsystems } else if (b->lt_se_data.lt_s_max < a->lt_se_data.lt_s_max) {
220*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (-1);
221*15db2897SKrishnendu Sadhukhan - Sun Microsystems } else {
222*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (0);
223*15db2897SKrishnendu Sadhukhan - Sun Microsystems }
224*15db2897SKrishnendu Sadhukhan - Sun Microsystems }
225*15db2897SKrishnendu Sadhukhan - Sun Microsystems
226*15db2897SKrishnendu Sadhukhan - Sun Microsystems /*
227*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Helper function to sort on count.
228*15db2897SKrishnendu Sadhukhan - Sun Microsystems */
229*15db2897SKrishnendu Sadhukhan - Sun Microsystems int
lt_sort_by_count_desc(lt_stat_entry_t * a,lt_stat_entry_t * b)230*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_sort_by_count_desc(lt_stat_entry_t *a, lt_stat_entry_t *b)
231*15db2897SKrishnendu Sadhukhan - Sun Microsystems {
232*15db2897SKrishnendu Sadhukhan - Sun Microsystems g_assert(a != NULL && b != NULL);
233*15db2897SKrishnendu Sadhukhan - Sun Microsystems
234*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (b->lt_se_data.lt_s_count > a->lt_se_data.lt_s_count) {
235*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (1);
236*15db2897SKrishnendu Sadhukhan - Sun Microsystems } else if (b->lt_se_data.lt_s_count < a->lt_se_data.lt_s_count) {
237*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (-1);
238*15db2897SKrishnendu Sadhukhan - Sun Microsystems } else {
239*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (0);
240*15db2897SKrishnendu Sadhukhan - Sun Microsystems }
241*15db2897SKrishnendu Sadhukhan - Sun Microsystems }
242*15db2897SKrishnendu Sadhukhan - Sun Microsystems
243*15db2897SKrishnendu Sadhukhan - Sun Microsystems /*
244*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Helper function to sort on average.
245*15db2897SKrishnendu Sadhukhan - Sun Microsystems */
246*15db2897SKrishnendu Sadhukhan - Sun Microsystems int
lt_sort_by_avg_desc(lt_stat_entry_t * a,lt_stat_entry_t * b)247*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_sort_by_avg_desc(lt_stat_entry_t *a, lt_stat_entry_t *b)
248*15db2897SKrishnendu Sadhukhan - Sun Microsystems {
249*15db2897SKrishnendu Sadhukhan - Sun Microsystems double avg_a, avg_b;
250*15db2897SKrishnendu Sadhukhan - Sun Microsystems
251*15db2897SKrishnendu Sadhukhan - Sun Microsystems g_assert(a != NULL && b != NULL);
252*15db2897SKrishnendu Sadhukhan - Sun Microsystems
253*15db2897SKrishnendu Sadhukhan - Sun Microsystems avg_a = (double)a->lt_se_data.lt_s_total / a->lt_se_data.lt_s_count;
254*15db2897SKrishnendu Sadhukhan - Sun Microsystems avg_b = (double)b->lt_se_data.lt_s_total / b->lt_se_data.lt_s_count;
255*15db2897SKrishnendu Sadhukhan - Sun Microsystems
256*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (avg_b > avg_a) {
257*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (1);
258*15db2897SKrishnendu Sadhukhan - Sun Microsystems } else if (avg_b < avg_a) {
259*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (-1);
260*15db2897SKrishnendu Sadhukhan - Sun Microsystems } else {
261*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (0);
262*15db2897SKrishnendu Sadhukhan - Sun Microsystems }
263*15db2897SKrishnendu Sadhukhan - Sun Microsystems }
264*15db2897SKrishnendu Sadhukhan - Sun Microsystems
265*15db2897SKrishnendu Sadhukhan - Sun Microsystems /*
266*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Create pipe for signal handler and wakeup.
267*15db2897SKrishnendu Sadhukhan - Sun Microsystems */
268*15db2897SKrishnendu Sadhukhan - Sun Microsystems void
lt_gpipe_init(void)269*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_gpipe_init(void)
270*15db2897SKrishnendu Sadhukhan - Sun Microsystems {
271*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) pipe(signal_pipe);
272*15db2897SKrishnendu Sadhukhan - Sun Microsystems }
273*15db2897SKrishnendu Sadhukhan - Sun Microsystems
274*15db2897SKrishnendu Sadhukhan - Sun Microsystems /*
275*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Close the pipe used in signal handler.
276*15db2897SKrishnendu Sadhukhan - Sun Microsystems */
277*15db2897SKrishnendu Sadhukhan - Sun Microsystems void
lt_gpipe_deinit(void)278*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_gpipe_deinit(void)
279*15db2897SKrishnendu Sadhukhan - Sun Microsystems {
280*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) close(signal_pipe[0]);
281*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) close(signal_pipe[1]);
282*15db2897SKrishnendu Sadhukhan - Sun Microsystems }
283*15db2897SKrishnendu Sadhukhan - Sun Microsystems
284*15db2897SKrishnendu Sadhukhan - Sun Microsystems /*
285*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Break early from the main loop.
286*15db2897SKrishnendu Sadhukhan - Sun Microsystems */
287*15db2897SKrishnendu Sadhukhan - Sun Microsystems void
lt_gpipe_break(const char * ch)288*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_gpipe_break(const char *ch)
289*15db2897SKrishnendu Sadhukhan - Sun Microsystems {
290*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) write(signal_pipe[1], ch, 1);
291*15db2897SKrishnendu Sadhukhan - Sun Microsystems }
292*15db2897SKrishnendu Sadhukhan - Sun Microsystems
293*15db2897SKrishnendu Sadhukhan - Sun Microsystems int
lt_gpipe_readfd(void)294*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_gpipe_readfd(void)
295*15db2897SKrishnendu Sadhukhan - Sun Microsystems {
296*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (signal_pipe[0]);
297*15db2897SKrishnendu Sadhukhan - Sun Microsystems }
298*15db2897SKrishnendu Sadhukhan - Sun Microsystems
299*15db2897SKrishnendu Sadhukhan - Sun Microsystems /*
300*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Check if the given file exists.
301*15db2897SKrishnendu Sadhukhan - Sun Microsystems */
302*15db2897SKrishnendu Sadhukhan - Sun Microsystems int
lt_file_exist(const char * name)303*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_file_exist(const char *name)
304*15db2897SKrishnendu Sadhukhan - Sun Microsystems {
305*15db2897SKrishnendu Sadhukhan - Sun Microsystems struct stat64 st;
306*15db2897SKrishnendu Sadhukhan - Sun Microsystems
307*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (stat64(name, &st) == 0) {
308*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (1);
309*15db2897SKrishnendu Sadhukhan - Sun Microsystems } else {
310*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (0);
311*15db2897SKrishnendu Sadhukhan - Sun Microsystems }
312*15db2897SKrishnendu Sadhukhan - Sun Microsystems }
313