summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorMartin Pelikan <martin.pelikan@gmail.com>2017-10-04 05:12:00 +0000
committerMartin Pelikan <martin.pelikan@gmail.com>2017-10-04 05:12:00 +0000
commit640d7d1f97a1804a0833c2d1d7220fb50bab746a (patch)
tree97cee8e23c4d57970b32593db14babf3972b6a32 /lib
parent83774b46bba12aacd6275557aea6f050b7161137 (diff)
[XRay] [compiler-rt] make sure single threaded programs get traced too
Summary: When the XRay user calls the API to finish writing the log, the thread which is calling the API still hasn't finished and therefore won't get its trace written. Add a test for only the main thread to check this. Reviewers: dberris Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D38493 git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@314875 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/xray/xray_fdr_logging.cc10
1 files changed, 10 insertions, 0 deletions
diff --git a/lib/xray/xray_fdr_logging.cc b/lib/xray/xray_fdr_logging.cc
index 7aebcb224..bd79893f6 100644
--- a/lib/xray/xray_fdr_logging.cc
+++ b/lib/xray/xray_fdr_logging.cc
@@ -116,6 +116,16 @@ XRayLogFlushStatus fdrLoggingFlush() XRAY_NEVER_INSTRUMENT {
reinterpret_cast<char *>(B.Buffer) + B.Size);
}
});
+
+ // The buffer for this particular thread would have been finalised after
+ // we've written everything to disk, and we'd lose the thread's trace.
+ auto &TLD = __xray::__xray_fdr_internal::getThreadLocalData();
+ if (TLD.Buffer.Buffer != nullptr) {
+ __xray::__xray_fdr_internal::writeEOBMetadata();
+ auto Start = reinterpret_cast<char *>(TLD.Buffer.Buffer);
+ retryingWriteAll(Fd, Start, Start + TLD.Buffer.Size);
+ }
+
__sanitizer::atomic_store(&LogFlushStatus,
XRayLogFlushStatus::XRAY_LOG_FLUSHED,
__sanitizer::memory_order_release);