diff options
Diffstat (limited to 'compiler-rt/lib/xray/xray_buffer_queue.cc')
| -rw-r--r-- | compiler-rt/lib/xray/xray_buffer_queue.cc | 34 |
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; |

