diff options
Diffstat (limited to 'compiler-rt')
3 files changed, 29 insertions, 25 deletions
diff --git a/compiler-rt/lib/xray/xray_profiling.cc b/compiler-rt/lib/xray/xray_profiling.cc index a11fddcc2c9..786084c7722 100644 --- a/compiler-rt/lib/xray/xray_profiling.cc +++ b/compiler-rt/lib/xray/xray_profiling.cc @@ -132,31 +132,35 @@ XRayLogFlushStatus profilingFlush() XRAY_NEVER_INSTRUMENT { // At this point, we'll create the file that will contain the profile, but // only if the options say so. if (!profilingFlags()->no_flush) { - int Fd = -1; - Fd = getLogFD(); - if (Fd == -1) { - if (__sanitizer::Verbosity()) - Report( - "profiler: Failed to acquire a file descriptor, dropping data.\n"); + // First check whether we have data in the profile collector service + // before we try and write anything down. + XRayBuffer B = profileCollectorService::nextBuffer({nullptr, 0}); + if (B.Data == nullptr) { + if (Verbosity()) + Report("profiling: No data to flush.\n"); } else { - XRayProfilingFileHeader Header; - Header.Timestamp = NanoTime(); - Header.PID = internal_getpid(); - retryingWriteAll(Fd, reinterpret_cast<const char *>(&Header), - reinterpret_cast<const char *>(&Header) + - sizeof(Header)); - - // Now for each of the threads, write out the profile data as we would see - // it in memory, verbatim. - XRayBuffer B = profileCollectorService::nextBuffer({nullptr, 0}); - while (B.Data != nullptr && B.Size != 0) { - retryingWriteAll(Fd, reinterpret_cast<const char *>(B.Data), - reinterpret_cast<const char *>(B.Data) + B.Size); - B = profileCollectorService::nextBuffer(B); + int Fd = getLogFD(); + if (Fd == -1) { + if (Verbosity()) + Report("profiling: Failed to flush to file, dropping data.\n"); + } else { + XRayProfilingFileHeader Header; + Header.Timestamp = NanoTime(); + Header.PID = internal_getpid(); + retryingWriteAll(Fd, reinterpret_cast<const char *>(&Header), + reinterpret_cast<const char *>(&Header) + + sizeof(Header)); + + // Now for each of the threads, write out the profile data as we would + // see it in memory, verbatim. + while (B.Data != nullptr && B.Size != 0) { + retryingWriteAll(Fd, reinterpret_cast<const char *>(B.Data), + reinterpret_cast<const char *>(B.Data) + B.Size); + B = profileCollectorService::nextBuffer(B); + } + // Then we close out the file. + internal_close(Fd); } - - // Then we close out the file. - internal_close(Fd); } } diff --git a/compiler-rt/test/xray/TestCases/Posix/profiling-multi-threaded.cc b/compiler-rt/test/xray/TestCases/Posix/profiling-multi-threaded.cc index f4caadb2808..7ccad1bac1f 100644 --- a/compiler-rt/test/xray/TestCases/Posix/profiling-multi-threaded.cc +++ b/compiler-rt/test/xray/TestCases/Posix/profiling-multi-threaded.cc @@ -8,7 +8,7 @@ // RUN: XRAY_PROFILING_OPTIONS=no_flush=1 %run %t // RUN: XRAY_OPTIONS=verbosity=1 %run %t // RUN: PROFILES=`ls xray-log.profiling-multi-* | wc -l` -// RUN: [ $PROFILES -ge 1 ] +// RUN: [ $PROFILES -eq 1 ] // RUN: rm -f xray-log.profiling-multi-* // // REQUIRES: x86_64-target-arch diff --git a/compiler-rt/test/xray/TestCases/Posix/profiling-single-threaded.cc b/compiler-rt/test/xray/TestCases/Posix/profiling-single-threaded.cc index 32002c69921..fd508b1acd1 100644 --- a/compiler-rt/test/xray/TestCases/Posix/profiling-single-threaded.cc +++ b/compiler-rt/test/xray/TestCases/Posix/profiling-single-threaded.cc @@ -8,7 +8,7 @@ // RUN: XRAY_PROFILING_OPTIONS=no_flush=true %run %t // RUN: XRAY_OPTIONS=verbosity=1 %run %t // RUN: PROFILES=`ls xray-log.profiling-single-* | wc -l` -// RUN: [ $PROFILES -ge 2 ] +// RUN: [ $PROFILES -eq 2 ] // RUN: rm -f xray-log.profiling-single-* // // REQUIRES: x86_64-target-arch |