]>
git.proxmox.com Git - rustc.git/blob - src/compiler-rt/lib/xray/xray_buffer_queue.cc
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
) {