1 //===-- xray_buffer_queue.cc -----------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file is a part of XRay, a dynamic runtime instruementation system.
12 // Defines the interface for a buffer queue implementation.
14 //===----------------------------------------------------------------------===//
15 #include "xray_buffer_queue.h"
19 using namespace __xray;
21 BufferQueue::BufferQueue(std::size_t B, std::size_t N)
22 : BufferSize(B), Buffers(N), Mutex(), OwnedBuffers(), Finalizing(false) {
23 for (auto &Buf : Buffers) {
24 void *Tmp = malloc(BufferSize);
28 OwnedBuffers.insert(Tmp);
32 std::error_code BufferQueue::getBuffer(Buffer &Buf) {
33 if (Finalizing.load(std::memory_order_acquire))
34 return std::make_error_code(std::errc::state_not_recoverable);
35 std::lock_guard<std::mutex> Guard(Mutex);
37 return std::make_error_code(std::errc::not_enough_memory);
38 Buf = Buffers.front();
43 std::error_code BufferQueue::releaseBuffer(Buffer &Buf) {
44 if (OwnedBuffers.count(Buf.Buffer) == 0)
45 return std::make_error_code(std::errc::argument_out_of_domain);
46 std::lock_guard<std::mutex> Guard(Mutex);
47 Buffers.push_back(Buf);
49 Buf.Size = BufferSize;
53 std::error_code BufferQueue::finalize() {
54 if (Finalizing.exchange(true, std::memory_order_acq_rel))
55 return std::make_error_code(std::errc::state_not_recoverable);
59 BufferQueue::~BufferQueue() {
60 for (auto &Buf : Buffers) {