summaryrefslogtreecommitdiffstats
path: root/compiler-rt/lib/xray/tests/unit/allocator_test.cc
diff options
context:
space:
mode:
authorDean Michael Berris <dberris@google.com>2018-12-07 06:23:06 +0000
committerDean Michael Berris <dberris@google.com>2018-12-07 06:23:06 +0000
commit25d505953a34b526d9985f2e631128069a9c22d7 (patch)
tree6e0d03fe0c2d18b21eae96c4145ef6feb1f08159 /compiler-rt/lib/xray/tests/unit/allocator_test.cc
parenta523a211754514ef1c5c84778e38e0a8da335500 (diff)
downloadbcm5719-llvm-25d505953a34b526d9985f2e631128069a9c22d7.tar.gz
bcm5719-llvm-25d505953a34b526d9985f2e631128069a9c22d7.zip
[XRay] Use preallocated memory for XRay profiling
Summary: This change builds upon D54989, which removes memory allocation from the critical path of the profiling implementation. This also changes the API for the profile collection service, to take ownership of the memory and associated data structures per-thread. The consolidation of the memory allocation allows us to do two things: - Limits the amount of memory used by the profiling implementation, associating preallocated buffers instead of allocating memory on-demand. - Consolidate the memory initialisation and cleanup by relying on the buffer queue's reference counting implementation. We find a number of places which also display some problematic behaviour, including: - Off-by-factor bug in the allocator implementation. - Unrolling semantics in cases of "memory exhausted" situations, when managing the state of the function call trie. We also add a few test cases which verify our understanding of the behaviour of the system, with important edge-cases (especially for memory-exhausted cases) in the segmented array and profile collector unit tests. Depends on D54989. Reviewers: mboerger Subscribers: dschuff, mgorny, dmgreen, jfb, llvm-commits Differential Revision: https://reviews.llvm.org/D55249 llvm-svn: 348568
Diffstat (limited to 'compiler-rt/lib/xray/tests/unit/allocator_test.cc')
-rw-r--r--compiler-rt/lib/xray/tests/unit/allocator_test.cc22
1 files changed, 22 insertions, 0 deletions
diff --git a/compiler-rt/lib/xray/tests/unit/allocator_test.cc b/compiler-rt/lib/xray/tests/unit/allocator_test.cc
index 0177798b069..1170741623c 100644
--- a/compiler-rt/lib/xray/tests/unit/allocator_test.cc
+++ b/compiler-rt/lib/xray/tests/unit/allocator_test.cc
@@ -12,6 +12,7 @@
//===----------------------------------------------------------------------===//
#include "xray_allocator.h"
+#include "xray_buffer_queue.h"
#include "gtest/gtest.h"
namespace __xray {
@@ -56,5 +57,26 @@ TEST(AllocatorTest, AllocateBoundaries) {
ASSERT_EQ(C, Expected);
}
+TEST(AllocatorTest, AllocateFromNonOwned) {
+ bool Success = false;
+ BufferQueue BQ(GetPageSizeCached(), 10, Success);
+ ASSERT_TRUE(Success);
+ BufferQueue::Buffer B;
+ ASSERT_EQ(BQ.getBuffer(B), BufferQueue::ErrorCode::Ok);
+ {
+ Allocator<sizeof(OddSizedData)> A(B.Data, B.Size);
+
+ // Keep allocating until we hit a nullptr block.
+ unsigned C = 0;
+ auto Expected =
+ GetPageSizeCached() / RoundUpTo(sizeof(OddSizedData), kCacheLineSize);
+ for (auto B = A.Allocate(); B.Data != nullptr; B = A.Allocate(), ++C)
+ ;
+
+ ASSERT_EQ(C, Expected);
+ }
+ ASSERT_EQ(BQ.releaseBuffer(B), BufferQueue::ErrorCode::Ok);
+}
+
} // namespace
} // namespace __xray
OpenPOWER on IntegriCloud