forked from OSchip/llvm-project
[XRay][compiler-rt] Profiling: No files when empty
This change makes it so that the profiling mode implementation will only write files when there are buffers to write. Before this change, we'd always open a file even if there were no profiles collected when flushing. llvm-svn: 337443
This commit is contained in:
parent
dd7bf598cc
commit
41cea19b4f
|
@ -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));
|
||||
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.
|
||||
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);
|
||||
// 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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue