300 unsigned char *orig_buf;
303 char *compressed_buf;
304 size_t compressed_bufsize;
305 unsigned long compress_sizearg;
306 unsigned char *uncompressed_buf;
307 size_t uncompressed_bufsize;
314 const size_t trials = 16;
317 static const char *
const names[] = {
318 "Isaac.Newton-Opticks.txt",
319 "../libgo/go/testdata/Isaac.Newton-Opticks.txt",
324 uncompressed_buf = NULL;
325 compressed_buf = NULL;
327 for (i = 0; i <
sizeof names /
sizeof names[0]; ++i)
336 len = strlen (SRCDIR) + strlen (
names[i]) + 2;
344 e = fopen (namebuf,
"r");
348 if (fstat (fileno (e), &st) < 0)
354 rbuf =
malloc (st.st_size);
360 got = fread (rbuf, 1, st.st_size, e);
364 orig_buf = (
unsigned char *) rbuf;
371 if (orig_buf == NULL)
374 printf (
"UNSUPPORTED: inflate large\n");
378 compressed_bufsize = compressBound (orig_bufsize) + 12;
379 compressed_buf =
malloc (compressed_bufsize);
380 if (compressed_buf == NULL)
386 compress_sizearg = compressed_bufsize - 12;
387 r = compress ((
unsigned char *) compressed_buf + 12, &compress_sizearg,
388 orig_buf, orig_bufsize);
391 fprintf (stderr,
"zlib compress failed: %d\n", r);
395 compressed_bufsize = compress_sizearg + 12;
398 memcpy (compressed_buf,
"ZLIB", 4);
399 for (i = 0; i < 8; ++i)
400 compressed_buf[i + 4] = (orig_bufsize >> ((7 - i) * 8)) & 0xff;
402 uncompressed_buf =
malloc (orig_bufsize);
403 if (uncompressed_buf == NULL)
408 uncompressed_bufsize = orig_bufsize;
413 &uncompressed_buf, &uncompressed_bufsize))
415 fprintf (stderr,
"inflate large: backtrace_uncompress_zdebug failed\n");
419 if (uncompressed_bufsize != orig_bufsize)
422 "inflate large: got uncompressed length %zu, want %zu\n",
423 uncompressed_bufsize, orig_bufsize);
427 if (memcmp (uncompressed_buf, orig_buf, uncompressed_bufsize) != 0)
429 fprintf (stderr,
"inflate large: uncompressed data mismatch\n");
433 printf (
"PASS: inflate large\n");
435 for (i = 0; i < trials; ++i)
437 unsigned long uncompress_sizearg;
440 if (clock_gettime (cid, &ts1) < 0)
444 perror (
"clock_gettime");
449 (
unsigned char *) compressed_buf,
453 &uncompressed_bufsize))
457 "benchmark backtrace_uncompress_zdebug failed\n"));
461 if (clock_gettime (cid, &ts2) < 0)
463 perror (
"clock_gettime");
467 ctime = (ts2.tv_sec - ts1.tv_sec) * 1000000000;
468 ctime += ts2.tv_nsec - ts1.tv_nsec;
471 if (clock_gettime (cid, &ts1) < 0)
473 perror(
"clock_gettime");
477 uncompress_sizearg = uncompressed_bufsize;
478 r = uncompress ((
unsigned char *) uncompressed_buf, &uncompress_sizearg,
479 (
unsigned char *) compressed_buf + 12,
480 compressed_bufsize - 12);
482 if (clock_gettime (cid, &ts2) < 0)
484 perror (
"clock_gettime");
491 "inflate large: benchmark zlib uncompress failed: %d\n",
496 ztime = (ts2.tv_sec - ts1.tv_sec) * 1000000000;
497 ztime += ts2.tv_nsec - ts1.tv_nsec;
505 printf (
"backtrace: %zu ns\n", ctime);
506 printf (
"zlib : %zu ns\n", ztime);
507 printf (
"ratio : %g\n", (
double) ztime / (
double) ctime);
512 printf (
"FAIL: inflate large\n");
515 if (orig_buf != NULL)
517 if (compressed_buf != NULL)
518 free (compressed_buf);
519 if (uncompressed_buf != NULL)
520 free (uncompressed_buf);
524 printf (
"UNSUPPORTED: inflate large\n");
void backtrace_free(struct backtrace_state *state ATTRIBUTE_UNUSED, void *p, size_t size ATTRIBUTE_UNUSED, backtrace_error_callback error_callback ATTRIBUTE_UNUSED, void *data ATTRIBUTE_UNUSED)
int backtrace_uncompress_zdebug(struct backtrace_state *state, const unsigned char *compressed, size_t compressed_size, backtrace_error_callback error_callback, void *data, unsigned char **uncompressed, size_t *uncompressed_size)