summaryrefslogtreecommitdiffstats
path: root/compiler-rt/lib/xray/xray_buffer_queue.cc
diff options
context:
space:
mode:
Diffstat (limited to 'compiler-rt/lib/xray/xray_buffer_queue.cc')
-rw-r--r--compiler-rt/lib/xray/xray_buffer_queue.cc34
1 files changed, 21 insertions, 13 deletions
diff --git a/compiler-rt/lib/xray/xray_buffer_queue.cc b/compiler-rt/lib/xray/xray_buffer_queue.cc
index 34bf3cfd89a..a0018f6b0cb 100644
--- a/compiler-rt/lib/xray/xray_buffer_queue.cc
+++ b/compiler-rt/lib/xray/xray_buffer_queue.cc
@@ -21,24 +21,25 @@ using namespace __xray;
using namespace __sanitizer;
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),
+ : BufferSize(B), Buffers(new BufferRep[N]()), BufferCount(N), Finalizing{0},
+ OwnedBuffers(new void *[N]()), Next(Buffers), First(Buffers),
LiveBuffers(0) {
for (size_t i = 0; i < N; ++i) {
auto &T = Buffers[i];
- void *Tmp = InternalAlloc(BufferSize);
+ void *Tmp = InternalAlloc(BufferSize, nullptr, 64);
if (Tmp == nullptr) {
Success = false;
return;
}
+ void *Extents = InternalAlloc(sizeof(BufferExtents), nullptr, 64);
+ if (Extents == nullptr) {
+ Success = false;
+ return;
+ }
auto &Buf = T.Buff;
Buf.Buffer = Tmp;
Buf.Size = B;
+ Buf.Extents = reinterpret_cast<BufferExtents *>(Extents);
OwnedBuffers[i] = Tmp;
}
Success = true;
@@ -48,14 +49,17 @@ BufferQueue::ErrorCode BufferQueue::getBuffer(Buffer &Buf) {
if (__sanitizer::atomic_load(&Finalizing, __sanitizer::memory_order_acquire))
return ErrorCode::QueueFinalizing;
__sanitizer::SpinMutexLock Guard(&Mutex);
- if (LiveBuffers == BufferCount) return ErrorCode::NotEnoughMemory;
+ if (LiveBuffers == BufferCount)
+ return ErrorCode::NotEnoughMemory;
auto &T = *Next;
auto &B = T.Buff;
Buf = B;
+ T.Used = true;
++LiveBuffers;
- if (++Next == (Buffers + BufferCount)) Next = Buffers;
+ if (++Next == (Buffers + BufferCount))
+ Next = Buffers;
return ErrorCode::Ok;
}
@@ -69,13 +73,15 @@ BufferQueue::ErrorCode BufferQueue::releaseBuffer(Buffer &Buf) {
break;
}
}
- if (!Found) return ErrorCode::UnrecognizedBuffer;
+ if (!Found)
+ return ErrorCode::UnrecognizedBuffer;
__sanitizer::SpinMutexLock Guard(&Mutex);
// This points to a semantic bug, we really ought to not be releasing more
// buffers than we actually get.
- if (LiveBuffers == 0) return ErrorCode::NotEnoughMemory;
+ if (LiveBuffers == 0)
+ return ErrorCode::NotEnoughMemory;
// Now that the buffer has been released, we mark it as "used".
First->Buff = Buf;
@@ -83,7 +89,8 @@ BufferQueue::ErrorCode BufferQueue::releaseBuffer(Buffer &Buf) {
Buf.Buffer = nullptr;
Buf.Size = 0;
--LiveBuffers;
- if (++First == (Buffers + BufferCount)) First = Buffers;
+ if (++First == (Buffers + BufferCount))
+ First = Buffers;
return ErrorCode::Ok;
}
@@ -100,6 +107,7 @@ BufferQueue::~BufferQueue() {
auto &T = *I;
auto &Buf = T.Buff;
InternalFree(Buf.Buffer);
+ InternalFree(Buf.Extents);
}
delete[] Buffers;
delete[] OwnedBuffers;
OpenPOWER on IntegriCloud