|
|
|
@ -15,6 +15,7 @@ |
|
|
|
|
#include <mutex> |
|
|
|
|
#include <numeric> |
|
|
|
|
#include <utility> |
|
|
|
|
#include <zstd.h> |
|
|
|
|
|
|
|
|
|
#include "common/timing.h" |
|
|
|
|
#include "common/util.h" |
|
|
|
@ -300,7 +301,7 @@ std::string decompressBZ2(const std::byte *in, size_t in_size, std::atomic<bool> |
|
|
|
|
if (bzerror == BZ_OK && prev_write_pos == strm.next_out) { |
|
|
|
|
// content is corrupt
|
|
|
|
|
bzerror = BZ_STREAM_END; |
|
|
|
|
rWarning("decompressBZ2 error : content is corrupt"); |
|
|
|
|
rWarning("decompressBZ2 error: content is corrupt"); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -318,6 +319,40 @@ std::string decompressBZ2(const std::byte *in, size_t in_size, std::atomic<bool> |
|
|
|
|
return {}; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
std::string decompressZST(const std::string &in, std::atomic<bool> *abort) { |
|
|
|
|
return decompressZST((std::byte *)in.data(), in.size(), abort); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
std::string decompressZST(const std::byte *in, size_t in_size, std::atomic<bool> *abort) { |
|
|
|
|
ZSTD_DCtx *dctx = ZSTD_createDCtx(); |
|
|
|
|
assert(dctx != nullptr); |
|
|
|
|
|
|
|
|
|
// Initialize input and output buffers
|
|
|
|
|
ZSTD_inBuffer input = {in, in_size, 0}; |
|
|
|
|
std::string decompressedData; |
|
|
|
|
const size_t bufferSize = ZSTD_DStreamOutSize(); // recommended output buffer size
|
|
|
|
|
std::string outputBuffer(bufferSize, '\0'); |
|
|
|
|
|
|
|
|
|
while (input.pos < input.size && !(abort && *abort)) { |
|
|
|
|
ZSTD_outBuffer output = {outputBuffer.data(), bufferSize, 0}; |
|
|
|
|
|
|
|
|
|
size_t result = ZSTD_decompressStream(dctx, &output, &input); |
|
|
|
|
if (ZSTD_isError(result)) { |
|
|
|
|
rWarning("decompressZST error: content is corrupt"); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
decompressedData.append(outputBuffer.data(), output.pos); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ZSTD_freeDCtx(dctx); |
|
|
|
|
if (!(abort && *abort)) { |
|
|
|
|
decompressedData.shrink_to_fit(); |
|
|
|
|
return decompressedData; |
|
|
|
|
} |
|
|
|
|
return {}; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void precise_nano_sleep(int64_t nanoseconds, std::atomic<bool> &should_exit) { |
|
|
|
|
struct timespec req, rem; |
|
|
|
|
req.tv_sec = nanoseconds / 1000000000; |
|
|
|
|