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