annotate libbacktrace/ztest.c @ 126:5d30d517ebed

fix example
author mir3636
date Sun, 08 Apr 2018 20:55:21 +0900
parents 04ced10e8804
children 84e7813d76e9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* ztest.c -- Test for libbacktrace inflate code.
kono
parents:
diff changeset
2 Copyright (C) 2017 Free Software Foundation, Inc.
kono
parents:
diff changeset
3 Written by Ian Lance Taylor, Google.
kono
parents:
diff changeset
4
kono
parents:
diff changeset
5 Redistribution and use in source and binary forms, with or without
kono
parents:
diff changeset
6 modification, are permitted provided that the following conditions are
kono
parents:
diff changeset
7 met:
kono
parents:
diff changeset
8
kono
parents:
diff changeset
9 (1) Redistributions of source code must retain the above copyright
kono
parents:
diff changeset
10 notice, this list of conditions and the following disclaimer.
kono
parents:
diff changeset
11
kono
parents:
diff changeset
12 (2) Redistributions in binary form must reproduce the above copyright
kono
parents:
diff changeset
13 notice, this list of conditions and the following disclaimer in
kono
parents:
diff changeset
14 the documentation and/or other materials provided with the
kono
parents:
diff changeset
15 distribution.
kono
parents:
diff changeset
16
kono
parents:
diff changeset
17 (3) The name of the author may not be used to
kono
parents:
diff changeset
18 endorse or promote products derived from this software without
kono
parents:
diff changeset
19 specific prior written permission.
kono
parents:
diff changeset
20
kono
parents:
diff changeset
21 THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
kono
parents:
diff changeset
22 IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
kono
parents:
diff changeset
23 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
kono
parents:
diff changeset
24 DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
kono
parents:
diff changeset
25 INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
kono
parents:
diff changeset
26 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
kono
parents:
diff changeset
27 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
kono
parents:
diff changeset
28 HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
kono
parents:
diff changeset
29 STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
kono
parents:
diff changeset
30 IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
kono
parents:
diff changeset
31 POSSIBILITY OF SUCH DAMAGE. */
kono
parents:
diff changeset
32
kono
parents:
diff changeset
33 #include "config.h"
kono
parents:
diff changeset
34
kono
parents:
diff changeset
35 #include <errno.h>
kono
parents:
diff changeset
36 #include <stdio.h>
kono
parents:
diff changeset
37 #include <stdlib.h>
kono
parents:
diff changeset
38 #include <string.h>
kono
parents:
diff changeset
39 #include <time.h>
kono
parents:
diff changeset
40 #include <sys/types.h>
kono
parents:
diff changeset
41 #include <sys/stat.h>
kono
parents:
diff changeset
42
kono
parents:
diff changeset
43 #ifdef HAVE_ZLIB
kono
parents:
diff changeset
44 #include <zlib.h>
kono
parents:
diff changeset
45 #endif
kono
parents:
diff changeset
46
kono
parents:
diff changeset
47 #include "backtrace.h"
kono
parents:
diff changeset
48 #include "backtrace-supported.h"
kono
parents:
diff changeset
49
kono
parents:
diff changeset
50 #include "internal.h"
kono
parents:
diff changeset
51 #include "testlib.h"
kono
parents:
diff changeset
52
kono
parents:
diff changeset
53 #ifndef HAVE_CLOCK_GETTIME
kono
parents:
diff changeset
54
kono
parents:
diff changeset
55 typedef int xclockid_t;
kono
parents:
diff changeset
56
kono
parents:
diff changeset
57 static int
kono
parents:
diff changeset
58 xclock_gettime (xclockid_t id ATTRIBUTE_UNUSED,
kono
parents:
diff changeset
59 struct timespec *ts ATTRIBUTE_UNUSED)
kono
parents:
diff changeset
60 {
kono
parents:
diff changeset
61 errno = EINVAL;
kono
parents:
diff changeset
62 return -1;
kono
parents:
diff changeset
63 }
kono
parents:
diff changeset
64
kono
parents:
diff changeset
65 #define clockid_t xclockid_t
kono
parents:
diff changeset
66 #define clock_gettime xclock_gettime
kono
parents:
diff changeset
67 #undef CLOCK_REALTIME
kono
parents:
diff changeset
68 #define CLOCK_REALTIME 0
kono
parents:
diff changeset
69
kono
parents:
diff changeset
70 #endif /* !defined(HAVE_CLOCK_GETTIME) */
kono
parents:
diff changeset
71
kono
parents:
diff changeset
72 #ifdef CLOCK_PROCESS_CPUTIME_ID
kono
parents:
diff changeset
73 #define ZLIB_CLOCK_GETTIME_ARG CLOCK_PROCESS_CPUTIME_ID
kono
parents:
diff changeset
74 #else
kono
parents:
diff changeset
75 #define ZLIB_CLOCK_GETTIME_ARG CLOCK_REALTIME
kono
parents:
diff changeset
76 #endif
kono
parents:
diff changeset
77
kono
parents:
diff changeset
78 /* Some tests for the local zlib inflation code. */
kono
parents:
diff changeset
79
kono
parents:
diff changeset
80 struct zlib_test
kono
parents:
diff changeset
81 {
kono
parents:
diff changeset
82 const char *name;
kono
parents:
diff changeset
83 const char *uncompressed;
kono
parents:
diff changeset
84 const char *compressed;
kono
parents:
diff changeset
85 size_t compressed_len;
kono
parents:
diff changeset
86 };
kono
parents:
diff changeset
87
kono
parents:
diff changeset
88 /* Error callback. */
kono
parents:
diff changeset
89
kono
parents:
diff changeset
90 static void
kono
parents:
diff changeset
91 error_callback_compress (void *vdata, const char *msg, int errnum)
kono
parents:
diff changeset
92 {
kono
parents:
diff changeset
93 fprintf (stderr, "%s", msg);
kono
parents:
diff changeset
94 if (errnum > 0)
kono
parents:
diff changeset
95 fprintf (stderr, ": %s", strerror (errnum));
kono
parents:
diff changeset
96 fprintf (stderr, "\n");
kono
parents:
diff changeset
97 exit (EXIT_FAILURE);
kono
parents:
diff changeset
98 }
kono
parents:
diff changeset
99
kono
parents:
diff changeset
100 static const struct zlib_test tests[] =
kono
parents:
diff changeset
101 {
kono
parents:
diff changeset
102 {
kono
parents:
diff changeset
103 "empty",
kono
parents:
diff changeset
104 "",
kono
parents:
diff changeset
105 "\x78\x9c\x03\x00\x00\x00\x00\x01",
kono
parents:
diff changeset
106 8,
kono
parents:
diff changeset
107 },
kono
parents:
diff changeset
108 {
kono
parents:
diff changeset
109 "hello",
kono
parents:
diff changeset
110 "hello, world\n",
kono
parents:
diff changeset
111 ("\x78\x9c\xca\x48\xcd\xc9\xc9\xd7\x51\x28\xcf"
kono
parents:
diff changeset
112 "\x2f\xca\x49\xe1\x02\x04\x00\x00\xff\xff\x21\xe7\x04\x93"),
kono
parents:
diff changeset
113 25,
kono
parents:
diff changeset
114 },
kono
parents:
diff changeset
115 {
kono
parents:
diff changeset
116 "goodbye",
kono
parents:
diff changeset
117 "goodbye, world",
kono
parents:
diff changeset
118 ("\x78\x9c\x4b\xcf\xcf\x4f\x49\xaa"
kono
parents:
diff changeset
119 "\x4c\xd5\x51\x28\xcf\x2f\xca\x49"
kono
parents:
diff changeset
120 "\x01\x00\x28\xa5\x05\x5e"),
kono
parents:
diff changeset
121 22,
kono
parents:
diff changeset
122 }
kono
parents:
diff changeset
123 };
kono
parents:
diff changeset
124
kono
parents:
diff changeset
125 /* Test the hand coded samples. */
kono
parents:
diff changeset
126
kono
parents:
diff changeset
127 static void
kono
parents:
diff changeset
128 test_samples (struct backtrace_state *state)
kono
parents:
diff changeset
129 {
kono
parents:
diff changeset
130 size_t i;
kono
parents:
diff changeset
131
kono
parents:
diff changeset
132 for (i = 0; i < sizeof tests / sizeof tests[0]; ++i)
kono
parents:
diff changeset
133 {
kono
parents:
diff changeset
134 char *p;
kono
parents:
diff changeset
135 size_t v;
kono
parents:
diff changeset
136 size_t j;
kono
parents:
diff changeset
137 unsigned char *uncompressed;
kono
parents:
diff changeset
138 size_t uncompressed_len;
kono
parents:
diff changeset
139
kono
parents:
diff changeset
140 p = malloc (12 + tests[i].compressed_len);
kono
parents:
diff changeset
141 memcpy (p, "ZLIB", 4);
kono
parents:
diff changeset
142 v = strlen (tests[i].uncompressed);
kono
parents:
diff changeset
143 for (j = 0; j < 8; ++j)
kono
parents:
diff changeset
144 p[j + 4] = (v >> ((7 - j) * 8)) & 0xff;
kono
parents:
diff changeset
145 memcpy (p + 12, tests[i].compressed, tests[i].compressed_len);
kono
parents:
diff changeset
146 uncompressed = NULL;
kono
parents:
diff changeset
147 uncompressed_len = 0;
kono
parents:
diff changeset
148 if (!backtrace_uncompress_zdebug (state, (unsigned char *) p,
kono
parents:
diff changeset
149 tests[i].compressed_len + 12,
kono
parents:
diff changeset
150 error_callback_compress, NULL,
kono
parents:
diff changeset
151 &uncompressed, &uncompressed_len))
kono
parents:
diff changeset
152 {
kono
parents:
diff changeset
153 fprintf (stderr, "test %s: uncompress failed\n", tests[i].name);
kono
parents:
diff changeset
154 ++failures;
kono
parents:
diff changeset
155 }
kono
parents:
diff changeset
156 else
kono
parents:
diff changeset
157 {
kono
parents:
diff changeset
158 if (uncompressed_len != v)
kono
parents:
diff changeset
159 {
kono
parents:
diff changeset
160 fprintf (stderr,
kono
parents:
diff changeset
161 "test %s: got uncompressed length %zu, want %zu\n",
kono
parents:
diff changeset
162 tests[i].name, uncompressed_len, v);
kono
parents:
diff changeset
163 ++failures;
kono
parents:
diff changeset
164 }
kono
parents:
diff changeset
165 else if (memcmp (tests[i].uncompressed, uncompressed, v) != 0)
kono
parents:
diff changeset
166 {
kono
parents:
diff changeset
167 size_t j;
kono
parents:
diff changeset
168
kono
parents:
diff changeset
169 fprintf (stderr, "test %s: uncompressed data mismatch\n",
kono
parents:
diff changeset
170 tests[i].name);
kono
parents:
diff changeset
171 for (j = 0; j < v; ++j)
kono
parents:
diff changeset
172 if (tests[i].uncompressed[j] != uncompressed[j])
kono
parents:
diff changeset
173 fprintf (stderr, " %zu: got %#x want %#x\n", j,
kono
parents:
diff changeset
174 uncompressed[j], tests[i].uncompressed[j]);
kono
parents:
diff changeset
175 ++failures;
kono
parents:
diff changeset
176 }
kono
parents:
diff changeset
177 else
kono
parents:
diff changeset
178 printf ("PASS: inflate %s\n", tests[i].name);
kono
parents:
diff changeset
179
kono
parents:
diff changeset
180 backtrace_free (state, uncompressed, uncompressed_len,
kono
parents:
diff changeset
181 error_callback_compress, NULL);
kono
parents:
diff changeset
182 }
kono
parents:
diff changeset
183 }
kono
parents:
diff changeset
184 }
kono
parents:
diff changeset
185
kono
parents:
diff changeset
186 #ifdef HAVE_ZLIB
kono
parents:
diff changeset
187
kono
parents:
diff changeset
188 /* Given a set of TRIALS timings, discard the lowest and highest
kono
parents:
diff changeset
189 values and return the mean average of the rest. */
kono
parents:
diff changeset
190
kono
parents:
diff changeset
191 static size_t
kono
parents:
diff changeset
192 average_time (const size_t *times, size_t trials)
kono
parents:
diff changeset
193 {
kono
parents:
diff changeset
194 size_t imax;
kono
parents:
diff changeset
195 size_t max;
kono
parents:
diff changeset
196 size_t imin;
kono
parents:
diff changeset
197 size_t min;
kono
parents:
diff changeset
198 size_t i;
kono
parents:
diff changeset
199 size_t sum;
kono
parents:
diff changeset
200
kono
parents:
diff changeset
201 imin = 0;
kono
parents:
diff changeset
202 imax = 0;
kono
parents:
diff changeset
203 min = times[0];
kono
parents:
diff changeset
204 max = times[0];
kono
parents:
diff changeset
205 for (i = 1; i < trials; ++i)
kono
parents:
diff changeset
206 {
kono
parents:
diff changeset
207 if (times[i] < min)
kono
parents:
diff changeset
208 {
kono
parents:
diff changeset
209 imin = i;
kono
parents:
diff changeset
210 min = times[i];
kono
parents:
diff changeset
211 }
kono
parents:
diff changeset
212 if (times[i] > max)
kono
parents:
diff changeset
213 {
kono
parents:
diff changeset
214 imax = i;
kono
parents:
diff changeset
215 max = times[i];
kono
parents:
diff changeset
216 }
kono
parents:
diff changeset
217 }
kono
parents:
diff changeset
218
kono
parents:
diff changeset
219 sum = 0;
kono
parents:
diff changeset
220 for (i = 0; i < trials; ++i)
kono
parents:
diff changeset
221 {
kono
parents:
diff changeset
222 if (i != imax && i != imin)
kono
parents:
diff changeset
223 sum += times[i];
kono
parents:
diff changeset
224 }
kono
parents:
diff changeset
225 return sum / (trials - 2);
kono
parents:
diff changeset
226 }
kono
parents:
diff changeset
227
kono
parents:
diff changeset
228 #endif
kono
parents:
diff changeset
229
kono
parents:
diff changeset
230 /* Test a larger text, if available. */
kono
parents:
diff changeset
231
kono
parents:
diff changeset
232 static void
kono
parents:
diff changeset
233 test_large (struct backtrace_state *state)
kono
parents:
diff changeset
234 {
kono
parents:
diff changeset
235 #ifdef HAVE_ZLIB
kono
parents:
diff changeset
236 unsigned char *orig_buf;
kono
parents:
diff changeset
237 size_t orig_bufsize;
kono
parents:
diff changeset
238 size_t i;
kono
parents:
diff changeset
239 char *compressed_buf;
kono
parents:
diff changeset
240 size_t compressed_bufsize;
kono
parents:
diff changeset
241 unsigned long compress_sizearg;
kono
parents:
diff changeset
242 unsigned char *uncompressed_buf;
kono
parents:
diff changeset
243 size_t uncompressed_bufsize;
kono
parents:
diff changeset
244 int r;
kono
parents:
diff changeset
245 clockid_t cid;
kono
parents:
diff changeset
246 struct timespec ts1;
kono
parents:
diff changeset
247 struct timespec ts2;
kono
parents:
diff changeset
248 size_t ctime;
kono
parents:
diff changeset
249 size_t ztime;
kono
parents:
diff changeset
250 const size_t trials = 16;
kono
parents:
diff changeset
251 size_t ctimes[16];
kono
parents:
diff changeset
252 size_t ztimes[16];
kono
parents:
diff changeset
253 static const char * const names[] = {
kono
parents:
diff changeset
254 "Mark.Twain-Tom.Sawyer.txt",
kono
parents:
diff changeset
255 "../libgo/go/compress/testdata/Mark.Twain-Tom.Sawyer.txt"
kono
parents:
diff changeset
256 };
kono
parents:
diff changeset
257
kono
parents:
diff changeset
258 orig_buf = NULL;
kono
parents:
diff changeset
259 orig_bufsize = 0;
kono
parents:
diff changeset
260 uncompressed_buf = NULL;
kono
parents:
diff changeset
261 compressed_buf = NULL;
kono
parents:
diff changeset
262
kono
parents:
diff changeset
263 for (i = 0; i < sizeof names / sizeof names[0]; ++i)
kono
parents:
diff changeset
264 {
kono
parents:
diff changeset
265 size_t len;
kono
parents:
diff changeset
266 char *namebuf;
kono
parents:
diff changeset
267 FILE *e;
kono
parents:
diff changeset
268 struct stat st;
kono
parents:
diff changeset
269 char *rbuf;
kono
parents:
diff changeset
270 size_t got;
kono
parents:
diff changeset
271
kono
parents:
diff changeset
272 len = strlen (SRCDIR) + strlen (names[i]) + 2;
kono
parents:
diff changeset
273 namebuf = malloc (len);
kono
parents:
diff changeset
274 if (namebuf == NULL)
kono
parents:
diff changeset
275 {
kono
parents:
diff changeset
276 perror ("malloc");
kono
parents:
diff changeset
277 goto fail;
kono
parents:
diff changeset
278 }
kono
parents:
diff changeset
279 snprintf (namebuf, len, "%s/%s", SRCDIR, names[i]);
kono
parents:
diff changeset
280 e = fopen (namebuf, "r");
kono
parents:
diff changeset
281 free (namebuf);
kono
parents:
diff changeset
282 if (e == NULL)
kono
parents:
diff changeset
283 continue;
kono
parents:
diff changeset
284 if (fstat (fileno (e), &st) < 0)
kono
parents:
diff changeset
285 {
kono
parents:
diff changeset
286 perror ("fstat");
kono
parents:
diff changeset
287 fclose (e);
kono
parents:
diff changeset
288 continue;
kono
parents:
diff changeset
289 }
kono
parents:
diff changeset
290 rbuf = malloc (st.st_size);
kono
parents:
diff changeset
291 if (rbuf == NULL)
kono
parents:
diff changeset
292 {
kono
parents:
diff changeset
293 perror ("malloc");
kono
parents:
diff changeset
294 goto fail;
kono
parents:
diff changeset
295 }
kono
parents:
diff changeset
296 got = fread (rbuf, 1, st.st_size, e);
kono
parents:
diff changeset
297 fclose (e);
kono
parents:
diff changeset
298 if (got > 0)
kono
parents:
diff changeset
299 {
kono
parents:
diff changeset
300 orig_buf = rbuf;
kono
parents:
diff changeset
301 orig_bufsize = got;
kono
parents:
diff changeset
302 break;
kono
parents:
diff changeset
303 }
kono
parents:
diff changeset
304 free (rbuf);
kono
parents:
diff changeset
305 }
kono
parents:
diff changeset
306
kono
parents:
diff changeset
307 if (orig_buf == NULL)
kono
parents:
diff changeset
308 {
kono
parents:
diff changeset
309 /* We couldn't find an input file. */
kono
parents:
diff changeset
310 printf ("UNSUPPORTED: inflate large\n");
kono
parents:
diff changeset
311 return;
kono
parents:
diff changeset
312 }
kono
parents:
diff changeset
313
kono
parents:
diff changeset
314 compressed_bufsize = compressBound (orig_bufsize) + 12;
kono
parents:
diff changeset
315 compressed_buf = malloc (compressed_bufsize);
kono
parents:
diff changeset
316 if (compressed_buf == NULL)
kono
parents:
diff changeset
317 {
kono
parents:
diff changeset
318 perror ("malloc");
kono
parents:
diff changeset
319 goto fail;
kono
parents:
diff changeset
320 }
kono
parents:
diff changeset
321
kono
parents:
diff changeset
322 compress_sizearg = compressed_bufsize - 12;
kono
parents:
diff changeset
323 r = compress (compressed_buf + 12, &compress_sizearg,
kono
parents:
diff changeset
324 orig_buf, orig_bufsize);
kono
parents:
diff changeset
325 if (r != Z_OK)
kono
parents:
diff changeset
326 {
kono
parents:
diff changeset
327 fprintf (stderr, "zlib compress failed: %d\n", r);
kono
parents:
diff changeset
328 goto fail;
kono
parents:
diff changeset
329 }
kono
parents:
diff changeset
330
kono
parents:
diff changeset
331 compressed_bufsize = compress_sizearg + 12;
kono
parents:
diff changeset
332
kono
parents:
diff changeset
333 /* Prepare the header that our library expects. */
kono
parents:
diff changeset
334 memcpy (compressed_buf, "ZLIB", 4);
kono
parents:
diff changeset
335 for (i = 0; i < 8; ++i)
kono
parents:
diff changeset
336 compressed_buf[i + 4] = (orig_bufsize >> ((7 - i) * 8)) & 0xff;
kono
parents:
diff changeset
337
kono
parents:
diff changeset
338 uncompressed_buf = malloc (orig_bufsize);
kono
parents:
diff changeset
339 if (uncompressed_buf == NULL)
kono
parents:
diff changeset
340 {
kono
parents:
diff changeset
341 perror ("malloc");
kono
parents:
diff changeset
342 goto fail;
kono
parents:
diff changeset
343 }
kono
parents:
diff changeset
344 uncompressed_bufsize = orig_bufsize;
kono
parents:
diff changeset
345
kono
parents:
diff changeset
346 if (!backtrace_uncompress_zdebug (state, compressed_buf, compressed_bufsize,
kono
parents:
diff changeset
347 error_callback_compress, NULL,
kono
parents:
diff changeset
348 &uncompressed_buf, &uncompressed_bufsize))
kono
parents:
diff changeset
349 {
kono
parents:
diff changeset
350 fprintf (stderr, "inflate large: backtrace_uncompress_zdebug failed\n");
kono
parents:
diff changeset
351 goto fail;
kono
parents:
diff changeset
352 }
kono
parents:
diff changeset
353
kono
parents:
diff changeset
354 if (uncompressed_bufsize != orig_bufsize)
kono
parents:
diff changeset
355 {
kono
parents:
diff changeset
356 fprintf (stderr,
kono
parents:
diff changeset
357 "inflate large: got uncompressed length %zu, want %zu\n",
kono
parents:
diff changeset
358 uncompressed_bufsize, orig_bufsize);
kono
parents:
diff changeset
359 goto fail;
kono
parents:
diff changeset
360 }
kono
parents:
diff changeset
361
kono
parents:
diff changeset
362 if (memcmp (uncompressed_buf, orig_buf, uncompressed_bufsize) != 0)
kono
parents:
diff changeset
363 {
kono
parents:
diff changeset
364 fprintf (stderr, "inflate large: uncompressed data mismatch\n");
kono
parents:
diff changeset
365 goto fail;
kono
parents:
diff changeset
366 }
kono
parents:
diff changeset
367
kono
parents:
diff changeset
368 printf ("PASS: inflate large\n");
kono
parents:
diff changeset
369
kono
parents:
diff changeset
370 for (i = 0; i < trials; ++i)
kono
parents:
diff changeset
371 {
kono
parents:
diff changeset
372 unsigned long uncompress_sizearg;
kono
parents:
diff changeset
373
kono
parents:
diff changeset
374 cid = ZLIB_CLOCK_GETTIME_ARG;
kono
parents:
diff changeset
375 if (clock_gettime (cid, &ts1) < 0)
kono
parents:
diff changeset
376 {
kono
parents:
diff changeset
377 if (errno == EINVAL)
kono
parents:
diff changeset
378 return;
kono
parents:
diff changeset
379 perror ("clock_gettime");
kono
parents:
diff changeset
380 return;
kono
parents:
diff changeset
381 }
kono
parents:
diff changeset
382
kono
parents:
diff changeset
383 if (!backtrace_uncompress_zdebug (state, compressed_buf,
kono
parents:
diff changeset
384 compressed_bufsize,
kono
parents:
diff changeset
385 error_callback_compress, NULL,
kono
parents:
diff changeset
386 &uncompressed_buf,
kono
parents:
diff changeset
387 &uncompressed_bufsize))
kono
parents:
diff changeset
388 {
kono
parents:
diff changeset
389 fprintf (stderr,
kono
parents:
diff changeset
390 ("inflate large: "
kono
parents:
diff changeset
391 "benchmark backtrace_uncompress_zdebug failed\n"));
kono
parents:
diff changeset
392 return;
kono
parents:
diff changeset
393 }
kono
parents:
diff changeset
394
kono
parents:
diff changeset
395 if (clock_gettime (cid, &ts2) < 0)
kono
parents:
diff changeset
396 {
kono
parents:
diff changeset
397 perror ("clock_gettime");
kono
parents:
diff changeset
398 return;
kono
parents:
diff changeset
399 }
kono
parents:
diff changeset
400
kono
parents:
diff changeset
401 ctime = (ts2.tv_sec - ts1.tv_sec) * 1000000000;
kono
parents:
diff changeset
402 ctime += ts2.tv_nsec - ts1.tv_nsec;
kono
parents:
diff changeset
403 ctimes[i] = ctime;
kono
parents:
diff changeset
404
kono
parents:
diff changeset
405 if (clock_gettime (cid, &ts1) < 0)
kono
parents:
diff changeset
406 {
kono
parents:
diff changeset
407 perror("clock_gettime");
kono
parents:
diff changeset
408 return;
kono
parents:
diff changeset
409 }
kono
parents:
diff changeset
410
kono
parents:
diff changeset
411 uncompress_sizearg = uncompressed_bufsize;
kono
parents:
diff changeset
412 r = uncompress (uncompressed_buf, &uncompress_sizearg,
kono
parents:
diff changeset
413 compressed_buf + 12, compressed_bufsize - 12);
kono
parents:
diff changeset
414
kono
parents:
diff changeset
415 if (clock_gettime (cid, &ts2) < 0)
kono
parents:
diff changeset
416 {
kono
parents:
diff changeset
417 perror ("clock_gettime");
kono
parents:
diff changeset
418 return;
kono
parents:
diff changeset
419 }
kono
parents:
diff changeset
420
kono
parents:
diff changeset
421 if (r != Z_OK)
kono
parents:
diff changeset
422 {
kono
parents:
diff changeset
423 fprintf (stderr,
kono
parents:
diff changeset
424 "inflate large: benchmark zlib uncompress failed: %d\n",
kono
parents:
diff changeset
425 r);
kono
parents:
diff changeset
426 return;
kono
parents:
diff changeset
427 }
kono
parents:
diff changeset
428
kono
parents:
diff changeset
429 ztime = (ts2.tv_sec - ts1.tv_sec) * 1000000000;
kono
parents:
diff changeset
430 ztime += ts2.tv_nsec - ts1.tv_nsec;
kono
parents:
diff changeset
431 ztimes[i] = ztime;
kono
parents:
diff changeset
432 }
kono
parents:
diff changeset
433
kono
parents:
diff changeset
434 /* Toss the highest and lowest times and average the rest. */
kono
parents:
diff changeset
435 ctime = average_time (ctimes, trials);
kono
parents:
diff changeset
436 ztime = average_time (ztimes, trials);
kono
parents:
diff changeset
437
kono
parents:
diff changeset
438 printf ("backtrace: %zu ns\n", ctime);
kono
parents:
diff changeset
439 printf ("zlib : %zu ns\n", ztime);
kono
parents:
diff changeset
440 printf ("ratio : %g\n", (double) ztime / (double) ctime);
kono
parents:
diff changeset
441
kono
parents:
diff changeset
442 return;
kono
parents:
diff changeset
443
kono
parents:
diff changeset
444 fail:
kono
parents:
diff changeset
445 printf ("FAIL: inflate large\n");
kono
parents:
diff changeset
446 ++failures;
kono
parents:
diff changeset
447
kono
parents:
diff changeset
448 if (orig_buf != NULL)
kono
parents:
diff changeset
449 free (orig_buf);
kono
parents:
diff changeset
450 if (compressed_buf != NULL)
kono
parents:
diff changeset
451 free (compressed_buf);
kono
parents:
diff changeset
452 if (uncompressed_buf != NULL)
kono
parents:
diff changeset
453 free (uncompressed_buf);
kono
parents:
diff changeset
454
kono
parents:
diff changeset
455 #else /* !HAVE_ZLIB */
kono
parents:
diff changeset
456
kono
parents:
diff changeset
457 printf ("UNSUPPORTED: inflate large\n");
kono
parents:
diff changeset
458
kono
parents:
diff changeset
459 #endif /* !HAVE_ZLIB */
kono
parents:
diff changeset
460 }
kono
parents:
diff changeset
461
kono
parents:
diff changeset
462 int
kono
parents:
diff changeset
463 main (int argc ATTRIBUTE_UNUSED, char **argv)
kono
parents:
diff changeset
464 {
kono
parents:
diff changeset
465 struct backtrace_state *state;
kono
parents:
diff changeset
466
kono
parents:
diff changeset
467 state = backtrace_create_state (argv[0], BACKTRACE_SUPPORTS_THREADS,
kono
parents:
diff changeset
468 error_callback_create, NULL);
kono
parents:
diff changeset
469
kono
parents:
diff changeset
470 test_samples (state);
kono
parents:
diff changeset
471 test_large (state);
kono
parents:
diff changeset
472
kono
parents:
diff changeset
473 exit (failures != 0 ? EXIT_FAILURE : EXIT_SUCCESS);
kono
parents:
diff changeset
474 }