28#ifndef ALICEO2_MEMORY_RESOURCES_
29#define ALICEO2_MEMORY_RESOURCES_
31#include <boost/container/pmr/memory_resource.hpp>
32#include <boost/container/pmr/monotonic_buffer_resource.hpp>
33#include <boost/container/pmr/polymorphic_allocator.hpp>
39#include <unordered_map>
40#include <fairmq/Message.h>
41#include <fairmq/TransportFactory.h>
42#include <fairmq/MemoryResources.h>
43#include <fairmq/MemoryResourceTools.h>
50using namespace fair::mq::pmr;
52template <
typename ContainerT>
55 return fair::mq::getMessage(std::forward<ContainerT>(container), targetResource);
76 :
throw std::runtime_error(
"MessageResource::MessageResource upstream is nullptr")}
90 void*
do_allocate(std::size_t bytes, std::size_t alignment)
override
94 throw std::bad_alloc();
99 return mUpstream->allocate(bytes, alignment < 64 ? 64 : alignment);
102 void do_deallocate(
void* p, std::size_t bytes, std::size_t alignment)
override
104 mUpstream->deallocate(p, bytes, alignment < 64 ? 64 : alignment);
117template <
typename BufferType>
131 template <typename T>
133 : mBuffer{std::move(
buffer)}, mPointer{mBuffer.get()}, mSize{
size}
138 template <
typename T>
140 : mBuffer{
std::move(
buffer)}, mPointer{mBuffer->
data()}, mSize{mBuffer->
size() * sizeof(T)}
150 throw std::bad_alloc();
155 throw std::runtime_error(
"Can not allocate: this memory resource is only supposed to provide spectator access to external buffer");
163 }
else if (mPointer ==
nullptr) {
165 throw std::logic_error(
"underlying controlled resource has been released already");
167 throw std::logic_error(
"this resource can only deallocate the controlled resource pointer");
178 void* mPointer =
nullptr;
189 using boost::container::pmr::polymorphic_allocator<T>::polymorphic_allocator;
202 template <
typename U>
207 T*
allocate(
size_t size) {
return reinterpret_cast<T*
>(this->resource()->allocate(
size *
sizeof(T), 64)); }
210 this->resource()->deallocate(
const_cast<typename std::remove_cv<T>::type*
>(
ptr),
size);
258 template <
typename U>
266 mResource.deallocate(
const_cast<typename std::remove_cv<T>::type*
>(
ptr),
size);
275 using boost::container::pmr::polymorphic_allocator<T>::polymorphic_allocator;
278 template <
typename... Args>
293 template <
typename U>
307using vector = std::vector<T, o2::pmr::polymorphic_allocator<T>>;
311template <
typename ElemT>
314 static_assert(std::is_trivially_destructible<ElemT>::value);
315 return std::vector<ElemT, OwningMessageSpectatorAllocator<ElemT>>(
const auto & getMessage()
void * setMessage(fair::mq::MessagePtr message) override
MessageResource() noexcept=delete
fair::mq::TransportFactory * getTransportFactory() noexcept override
void do_deallocate(void *p, std::size_t bytes, std::size_t alignment) override
void * do_allocate(std::size_t bytes, std::size_t alignment) override
FairMQMemoryResource * mUpstream
fair::mq::MessagePtr getMessage(void *p) override
bool do_is_equal(const memory_resource &) const noexcept override
size_t getNumberOfMessages() const noexcept override
std::true_type propagate_on_container_move_assignment
NoConstructAllocator(Args &&... args)
OwningMessageSpectatorAllocator(const OwningMessageSpectatorAllocator< U > &other) noexcept
T * allocate(size_t size)
OwningMessageSpectatorAllocator() noexcept=default
OwningMessageSpectatorAllocator & operator=(const OwningMessageSpectatorAllocator &other)
boost::container::pmr::memory_resource * resource()
void deallocate(T *ptr, size_t size)
OwningMessageSpectatorAllocator select_on_container_copy_construction() const
MessageResource mResource
T * allocate(size_t size)
void deallocate(T *ptr, size_t size)
std::true_type propagate_on_container_move_assignment
void * do_allocate(std::size_t bytes, std::size_t) override
bool do_is_equal(const memory_resource &) const noexcept override
SpectatorMemoryResource() noexcept=delete
SpectatorMemoryResource(std::unique_ptr< std::vector< T >, typename buffer_type::deleter_type > &&buffer)
void do_deallocate(void *p, std::size_t, std::size_t) override
GLuint GLsizei const GLchar * message
O2 memory allocators and interfaces related to managing memory via the trasport layer.
boost::container::pmr::polymorphic_allocator< std::byte > BytePmrAllocator
auto adoptVector(size_t nelem, fair::mq::MessagePtr message)
Return a std::vector spanned over the contents of the message, takes ownership of the message.
fair::mq::ChannelResource ChannelResource
std::vector< T, o2::pmr::polymorphic_allocator< T > > vector
Defining DataPointCompositeObject explicitly as copiable.
VectorOfTObjectPtrs other