296 unsigned char *orig_buf;
299 char *compressed_buf;
300 size_t compressed_bufsize;
301 size_t compressed_size;
302 unsigned char *uncompressed_buf;
309 const size_t trials = 16;
312 static const char *
const names[] = {
313 "Isaac.Newton-Opticks.txt",
314 "../libgo/go/testdata/Isaac.Newton-Opticks.txt",
319 uncompressed_buf = NULL;
320 compressed_buf = NULL;
322 for (i = 0; i <
sizeof names /
sizeof names[0]; ++i)
331 len = strlen (SRCDIR) + strlen (
names[i]) + 2;
339 e = fopen (namebuf,
"r");
343 if (fstat (fileno (e), &st) < 0)
349 rbuf =
malloc (st.st_size);
355 got = fread (rbuf, 1, st.st_size, e);
359 orig_buf = (
unsigned char *) rbuf;
366 if (orig_buf == NULL)
369 printf (
"UNSUPPORTED: zstd large\n");
373 compressed_bufsize = ZSTD_compressBound (orig_bufsize);
374 compressed_buf =
malloc (compressed_bufsize);
375 if (compressed_buf == NULL)
381 r = ZSTD_compress (compressed_buf, compressed_bufsize,
382 orig_buf, orig_bufsize,
383 ZSTD_CLEVEL_DEFAULT);
384 if (ZSTD_isError (r))
386 fprintf (stderr,
"zstd compress failed: %s\n", ZSTD_getErrorName (r));
391 uncompressed_buf =
malloc (orig_bufsize);
392 if (uncompressed_buf == NULL)
401 uncompressed_buf, orig_bufsize))
403 fprintf (stderr,
"zstd large: backtrace_uncompress_zstd failed\n");
407 if (memcmp (uncompressed_buf, orig_buf, orig_bufsize) != 0)
411 fprintf (stderr,
"zstd large: uncompressed data mismatch\n");
412 for (j = 0; j < orig_bufsize; ++j)
413 if (orig_buf[j] != uncompressed_buf[j])
414 fprintf (stderr,
" %zu: got %#x want %#x\n", j,
415 uncompressed_buf[j], orig_buf[j]);
419 printf (
"PASS: zstd large\n");
421 for (i = 0; i < trials; ++i)
424 if (clock_gettime (cid, &ts1) < 0)
428 perror (
"clock_gettime");
433 (
unsigned char *) compressed_buf,
441 "benchmark backtrace_uncompress_zstd failed\n"));
445 if (clock_gettime (cid, &ts2) < 0)
447 perror (
"clock_gettime");
451 ctime = (ts2.tv_sec - ts1.tv_sec) * 1000000000;
452 ctime += ts2.tv_nsec - ts1.tv_nsec;
455 if (clock_gettime (cid, &ts1) < 0)
457 perror(
"clock_gettime");
461 r = ZSTD_decompress (uncompressed_buf, orig_bufsize,
462 compressed_buf, compressed_size);
464 if (clock_gettime (cid, &ts2) < 0)
466 perror (
"clock_gettime");
470 if (ZSTD_isError (r))
473 "zstd large: benchmark zlib uncompress failed: %s\n",
474 ZSTD_getErrorName (r));
478 ztime = (ts2.tv_sec - ts1.tv_sec) * 1000000000;
479 ztime += ts2.tv_nsec - ts1.tv_nsec;
487 printf (
"backtrace: %zu ns\n", ctime);
488 printf (
"zstd : %zu ns\n", ztime);
489 printf (
"ratio : %g\n", (
double) ztime / (
double) ctime);
494 printf (
"FAIL: zstd large\n");
497 if (orig_buf != NULL)
499 if (compressed_buf != NULL)
500 free (compressed_buf);
501 if (uncompressed_buf != NULL)
502 free (uncompressed_buf);
506 printf (
"UNSUPPORTED: zstd large\n");
int backtrace_uncompress_zstd(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)