]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/compiler-rt/lib/xray/xray_buffer_queue.cc
Merge compiler-rt r291274.
[FreeBSD/FreeBSD.git] / contrib / compiler-rt / lib / xray / xray_buffer_queue.cc
1 //===-- xray_buffer_queue.cc -----------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file is a part of XRay, a dynamic runtime instruementation system.
11 //
12 // Defines the interface for a buffer queue implementation.
13 //
14 //===----------------------------------------------------------------------===//
15 #include "xray_buffer_queue.h"
16 #include <cassert>
17 #include <cstdlib>
18
19 using namespace __xray;
20
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);
25     Buf.Buffer = Tmp;
26     Buf.Size = B;
27     if (Tmp != 0)
28       OwnedBuffers.insert(Tmp);
29   }
30 }
31
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);
36   if (Buffers.empty())
37     return std::make_error_code(std::errc::not_enough_memory);
38   Buf = Buffers.front();
39   Buffers.pop_front();
40   return {};
41 }
42
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);
48   Buf.Buffer = nullptr;
49   Buf.Size = BufferSize;
50   return {};
51 }
52
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);
56   return {};
57 }
58
59 BufferQueue::~BufferQueue() {
60   for (auto &Buf : Buffers) {
61     free(Buf.Buffer);
62     Buf.Buffer = nullptr;
63     Buf.Size = 0;
64   }
65 }