From cf3d9138baea7d2d46baccfb16826a8c3c1af4dd Mon Sep 17 00:00:00 2001 From: hw-wLiu Date: Mon, 24 Oct 2022 14:38:48 +0800 Subject: [PATCH 1/2] modify bytrzce_z error2 Signed-off-by: hw-wLiu Change-Id: I1369fc3ec8f44592d20f2389f7018a05d5e3474d --- bin/src/bytrace_cmd.cpp | 68 ++++++++++++++++++++++++++--------------- 1 file changed, 43 insertions(+), 25 deletions(-) diff --git a/bin/src/bytrace_cmd.cpp b/bin/src/bytrace_cmd.cpp index b564aea..114e221 100644 --- a/bin/src/bytrace_cmd.cpp +++ b/bin/src/bytrace_cmd.cpp @@ -583,6 +583,7 @@ static bool StopTrace() static void DumpCompressedTrace(int traceFd, int outFd) { z_stream zs { nullptr }; + int flush = Z_NO_FLUSH; ssize_t bytesWritten; ssize_t bytesRead; if (memset_s(&zs, sizeof(zs), 0, sizeof(zs)) != 0) { @@ -594,42 +595,59 @@ static void DumpCompressedTrace(int traceFd, int outFd) fprintf(stderr, "Error: initializing zlib: %d\n", ret); return; } - unsigned int have = 0; std::unique_ptr in = std::make_unique(CHUNK_SIZE); std::unique_ptr out = std::make_unique(CHUNK_SIZE); - int flush = Z_NO_FLUSH; if (!in || !out) { fprintf(stderr, "Error: couldn't allocate buffers\n"); return; } + zs.next_out = reinterpret_cast(out.get()); + zs.avail_out = CHUNK_SIZE; + do { - bytesRead = TEMP_FAILURE_RETRY(read(traceFd, in.get(), CHUNK_SIZE)); - if (bytesRead == 0) { - flush = Z_FINISH; - } else if (bytesRead == -1) { - fprintf(stderr, "Error: reading trace, errno: %d\n", errno); - break; - } - zs.next_in = reinterpret_cast(in.get()); - zs.avail_in = bytesRead; - do { - zs.next_out = reinterpret_cast(out.get()); - zs.avail_out = CHUNK_SIZE; - ret = deflate(&zs, flush); - if (ret != Z_OK) { - fprintf(stderr, "Error: deflate zlib: %d\n", ret); + if (zs.avail_in == 0 && flush == Z_NO_FLUSH) { + bytesRead = TEMP_FAILURE_RETRY(read(traceFd, in.get(), CHUNK_SIZE)); + if (bytesRead == 0) { + flush = Z_FINISH; + } else if (bytesRead == -1) { + fprintf(stderr, "Error: reading trace, errno: %d\n", errno); break; - } - have = CHUNK_SIZE - zs.avail_out; - bytesWritten = TEMP_FAILURE_RETRY(write(outFd, out.get(), have)); - if (bytesWritten < 0 || (static_cast(bytesWritten) < static_cast(have)) || - bytesWritten == -1) { + } else { + zs.next_in = reinterpret_cast(in.get()); + zs.avail_in = bytesRead; + } + } + if (zs.avail_out == 0) { + bytesWritten = TEMP_FAILURE_RETRY(write(outFd, out.get(), CHUNK_SIZE)); + if (bytesWritten < CHUNK_SIZE) { fprintf(stderr, "Error: writing deflated trace, errno: %d\n", errno); break; } - } while (zs.avail_out == 0); - } while (flush != Z_FINISH); - deflateEnd(&zs); + zs.next_out = reinterpret_cast(out.get()); + zs.avail_out = CHUNK_SIZE; + } + ret = deflate(&zs, flush); + if (flush == Z_FINISH && ret == Z_STREAM_END) { + size_t have = CHUNK_SIZE - zs.avail_out; + bytesWritten = TEMP_FAILURE_RETRY(write(outFd, out.get(), have)); + if (static_cast(bytesWritten) < have) { + fprintf(stderr, "Error: writing deflated trace, errno: %d\n", errno); + } + break; + } else if (ret != Z_OK) { + if (ret == Z_ERRNO) { + fprintf(stderr, "Error: deflate failed with errno %d\n", errno); + } else { + fprintf(stderr, "Error: deflate failed return %d\n", ret); + } + break; + } + } while (ret == Z_OK); + + ret = deflateEnd(&zs); + if (ret != Z_OK) { + fprintf(stderr, "error cleaning up zlib: %d\n", ret); + } } static void DumpTrace(int outFd, const string& path) From 3da00515ecdd20abba58915aacde417d6a80cb9e Mon Sep 17 00:00:00 2001 From: hw-wLiu Date: Mon, 24 Oct 2022 09:07:46 +0000 Subject: [PATCH 2/2] update bin/src/bytrace_cmd.cpp. Signed-off-by: hw-wLiu --- bin/src/bytrace_cmd.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/src/bytrace_cmd.cpp b/bin/src/bytrace_cmd.cpp index 114e221..be6403c 100644 --- a/bin/src/bytrace_cmd.cpp +++ b/bin/src/bytrace_cmd.cpp @@ -615,7 +615,7 @@ static void DumpCompressedTrace(int traceFd, int outFd) } else { zs.next_in = reinterpret_cast(in.get()); zs.avail_in = bytesRead; - } + } } if (zs.avail_out == 0) { bytesWritten = TEMP_FAILURE_RETRY(write(outFd, out.get(), CHUNK_SIZE));