]> git.proxmox.com Git - rustc.git/blob - src/compiler-rt/lib/xray/xray_buffer_queue.cc
New upstream version 1.19.0+dfsg3
[rustc.git] / src / 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 }