9 #ifndef FAIR_MQ_OFI_CONTROLMESSAGES_H
10 #define FAIR_MQ_OFI_CONTROLMESSAGES_H
12 #include <FairMQLogger.h>
13 #include <boost/asio/buffer.hpp>
14 #include <boost/container/pmr/memory_resource.hpp>
18 #include <type_traits>
23 template<
typename PodType>
24 auto buffer(
const PodType& obj) -> boost::asio::const_buffer
26 return boost::asio::const_buffer(
static_cast<const void*
>(&obj),
sizeof(PodType));
31 namespace fair::mq::ofi
34 enum class ControlMessageType
38 PostMultiPartStartBuffer
63 ControlMessageType type;
68 using unique_ptr = std::unique_ptr<T, std::function<void(T*)>>;
70 template<
typename T,
typename... Args>
71 auto MakeControlMessageWithPmr(boost::container::pmr::memory_resource& pmr, Args&&... args)
72 -> ofi::unique_ptr<ControlMessage>
77 if (std::is_same<T, PostBuffer>::value) {
78 ctrl->type = ControlMessageType::PostBuffer;
79 ctrl->msg.postBuffer =
PostBuffer(std::forward<Args>(args)...);
80 }
else if (std::is_same<T, PostMultiPartStartBuffer>::value) {
81 ctrl->type = ControlMessageType::PostMultiPartStartBuffer;
82 ctrl->msg.postMultiPartStartBuffer = PostMultiPartStartBuffer(std::forward<Args>(args)...);
83 }
else if (std::is_same<T, Empty>::value) {
84 ctrl->type = ControlMessageType::Empty;
87 return ofi::unique_ptr<ControlMessage>(ctrl, [&pmr](ControlMessage* p) {
89 pmr.deallocate(p,
sizeof(T));
93 template<
typename T,
typename... Args>
94 auto MakeControlMessage(Args&&... args) -> ControlMessage
98 if (std::is_same<T, PostBuffer>::value) {
99 ctrl.type = ControlMessageType::PostBuffer;
100 }
else if (std::is_same<T, PostMultiPartStartBuffer>::value) {
101 ctrl.type = ControlMessageType::PostMultiPartStartBuffer;
102 }
else if (std::is_same<T, Empty>::value) {
103 ctrl.type = ControlMessageType::Empty;
105 ctrl.msg = T(std::forward<Args>(args)...);