diff options
author | Dean Michael Berris <dberris@google.com> | 2018-06-05 03:46:54 +0000 |
---|---|---|
committer | Dean Michael Berris <dberris@google.com> | 2018-06-05 03:46:54 +0000 |
commit | 5db124d9c36ec78fd4b1b8c7407a81dab6810ef0 (patch) | |
tree | c5ae5885be480ca41db4f3b3d58efbdc59e94352 /lib | |
parent | 393b329e7345976d7d0c5ee08425eacb34b4c5be (diff) |
[XRay][compiler-rt] Remove reliance on C++ ABI from BufferQueue
Summary:
This is part of the work to address http://llvm.org/PR32274.
We remove the calls to array-placement-new and array-delete. This allows
us to rely on the internal memory management provided by
sanitizer_common/sanitizer_internal_allocator.h.
Reviewers: eizan, kpw
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D47695
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@333982 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/xray/xray_buffer_queue.cc | 35 | ||||
-rw-r--r-- | lib/xray/xray_buffer_queue.h | 2 |
2 files changed, 31 insertions, 6 deletions
diff --git a/lib/xray/xray_buffer_queue.cc b/lib/xray/xray_buffer_queue.cc index a2e97f943..dc5023862 100644 --- a/lib/xray/xray_buffer_queue.cc +++ b/lib/xray/xray_buffer_queue.cc @@ -16,14 +16,37 @@ #include "sanitizer_common/sanitizer_allocator_internal.h" #include "sanitizer_common/sanitizer_common.h" #include "sanitizer_common/sanitizer_libc.h" +#include <memory> using namespace __xray; using namespace __sanitizer; +template <class T> static T *initArray(size_t N) { + auto A = reinterpret_cast<T *>( + InternalAlloc(N * sizeof(T), nullptr, kCacheLineSize)); + if (A != nullptr) + while (N > 0) + new (A + (--N)) T(); + return A; +} + BufferQueue::BufferQueue(size_t B, size_t N, bool &Success) - : BufferSize(B), Buffers(new BufferRep[N]()), BufferCount(N), Finalizing{0}, - OwnedBuffers(new void *[N]()), Next(Buffers), First(Buffers), - LiveBuffers(0) { + : BufferSize(B), Buffers(initArray<BufferQueue::BufferRep>(N)), + BufferCount(N), Finalizing{0}, OwnedBuffers(initArray<void *>(N)), + Next(Buffers), First(Buffers), LiveBuffers(0) { + if (Buffers == nullptr) { + Success = false; + return; + } + if (OwnedBuffers == nullptr) { + // Clean up the buffers we've already allocated. + for (auto B = Buffers, E = Buffers + BufferCount; B != E; ++B) + B->~BufferRep(); + InternalFree(Buffers); + Success = false; + return; + }; + for (size_t i = 0; i < N; ++i) { auto &T = Buffers[i]; void *Tmp = InternalAlloc(BufferSize, nullptr, 64); @@ -109,6 +132,8 @@ BufferQueue::~BufferQueue() { InternalFree(Buf.Data); InternalFree(Buf.Extents); } - delete[] Buffers; - delete[] OwnedBuffers; + for (auto B = Buffers, E = Buffers + BufferCount; B != E; ++B) + B->~BufferRep(); + InternalFree(Buffers); + InternalFree(OwnedBuffers); } diff --git a/lib/xray/xray_buffer_queue.h b/lib/xray/xray_buffer_queue.h index 3f61263a8..70e64b453 100644 --- a/lib/xray/xray_buffer_queue.h +++ b/lib/xray/xray_buffer_queue.h @@ -39,7 +39,6 @@ public: BufferExtents *Extents; }; -private: struct BufferRep { // The managed buffer. Buffer Buff; @@ -49,6 +48,7 @@ private: bool Used = false; }; +private: // This models a ForwardIterator. |T| Must be either a `Buffer` or `const // Buffer`. Note that we only advance to the "used" buffers, when // incrementing, so that at dereference we're always at a valid point. |