/workspaces/astro/sol3-sdk/cpp/sol3/core/shmem_buffer.h Source File

Space-ng SDK: /workspaces/astro/sol3-sdk/cpp/sol3/core/shmem_buffer.h Source File
Space-ng SDK
shmem_buffer.h
Go to the documentation of this file.
1 
2 // Copyright (c) Space-ng, inc. All rights reserved.
3 
4 #pragma once
5 
7 #include "sol3/core/msg/buffer.h"
8 #include "sol3/core/msg/exchange_config.h"
9 
10 #include <boost/asio/local/datagram_protocol.hpp>
11 #include <unistd.h>
12 
13 #include <cstddef>
14 #include <cstdint>
15 #include <functional>
16 #include <map>
17 #include <memory>
18 #include <set>
19 #include <string>
20 #include <unordered_set>
21 #include <utility>
22 #include <vector>
23 
24 struct gbm_bo;
25 
26 namespace sol3::core {
27 
28 using Endpoint = boost::asio::local::datagram_protocol::endpoint;
29 
30 namespace msg {
31 
33 // NOLINTBEGIN(readability-identifier-naming)
34 std::string format_as(BufferInfo const&);
35 std::string format_as(BufferFormat const&);
36 // NOLINTEND(readability-identifier-naming)
37 } // namespace msg
38 
39 using msg::BufferInfo;
40 
41 struct EndpointPort {
42  boost::asio::local::datagram_protocol::endpoint endpoint;
44 
45  bool operator==(EndpointPort const& rhs) const {
46  return endpoint == rhs.endpoint && port.encoded() == rhs.port.encoded();
47  }
48 
49  bool operator!=(EndpointPort const& rhs) const { return !(*this == rhs); }
50 
51  bool operator<(EndpointPort const& rhs) const {
52  if (endpoint != rhs.endpoint) {
53  return endpoint < rhs.endpoint;
54  }
55  if (port.encoded() != rhs.port.encoded()) {
56  return port.encoded() < rhs.port.encoded();
57  }
58  return false;
59  }
60 };
61 
62 struct PortIdx {
63  uint32_t port = 0;
64  uint32_t idx = 0;
65  bool operator<(PortIdx const& o) const {
66  return port != o.port ? port < o.port : idx < o.idx;
67  }
68  bool operator==(PortIdx const& o) const {
69  return port == o.port && idx == o.idx;
70  }
71 };
72 
74 class IBufferConst {
75  public:
76  virtual ~IBufferConst() = default;
77 
78  virtual BufferInfo const& info() const = 0;
79 
80  virtual void const* data() const = 0;
81 
82  virtual size_t size() const = 0;
83 
84  virtual int fd() const = 0;
85 
86  virtual Endpoint const& endpoint() const = 0;
87 };
88 
90 class IBufferMutable : public IBufferConst {
91  public:
92  virtual void* mutableData() = 0;
95  virtual gbm_bo* gbmBo() const { return nullptr; };
96 };
97 
99 bool isGpu(msg::BufferFormat format);
100 
102 std::unique_ptr<IBufferMutable> makeShmemBuffer(BufferInfo const& info);
103 
108 std::unique_ptr<IBufferConst> importShmemBufferConst(
109  BufferInfo const& info, int fd, Endpoint const& endpoint);
110 
113  public:
114  using Endpoint = boost::asio::local::datagram_protocol::endpoint;
117 
118  virtual ~IBufferExchange() = default;
119 
121  virtual void start() = 0;
122 
124  virtual void stop() = 0;
125 
127  virtual bool stopped() const = 0;
128 
130  virtual Endpoint const& localEndpoint() const = 0;
131 
136  virtual void addPeer(Endpoint const& peer_endpoint) = 0;
137 
150  virtual void mapLocalToPeer(
151  uint32_t local_port, Endpoint peer_endpoint, uint32_t peer_port = 0) = 0;
152 
159  virtual void configure(msg::ExchangeConfigT const& config) = 0;
160 
162  virtual void listPorts(std::vector<EndpointPort>& ports) const = 0;
163 
171  virtual void registerBuffer(IBufferMutable const& buffer) = 0;
172 
174  virtual void unregisterBuffer(IBufferMutable const& buffer) = 0;
175 
186  virtual std::shared_ptr<IBufferConst> get(
187  uint32_t id, uint32_t idx) const = 0;
188 
192  virtual std::shared_ptr<IBufferConst> get(
193  Endpoint const& ep, uint32_t id, uint32_t idx) const = 0;
194 
196  virtual void dispose(std::shared_ptr<IBufferConst>&& buffer) = 0;
197 
202  virtual void listMappings(
203  std::map<uint32_t, std::vector<std::pair<Endpoint, uint32_t>>>& mappings)
204  const = 0;
205 
209  virtual void listResolvedBuffers(
210  std::map<PortIdx, std::shared_ptr<IBufferConst>>& buffers) const = 0;
211 
214  static std::shared_ptr<IBufferExchange> makeProcessLocal();
215 };
216 
217 } // namespace sol3::core
218 
219 namespace std {
220 template <>
221 struct hash<sol3::core::PortIdx> {
222  size_t operator()(sol3::core::PortIdx const& p) const noexcept {
223  return std::hash<uint64_t>{}(uint64_t(p.port) << 32 | p.idx);
224  }
225 };
226 } // namespace std
A view of an immutable shared-memory buffer.
Definition: shmem_buffer.h:74
virtual int fd() const =0
virtual size_t size() const =0
virtual void const * data() const =0
virtual ~IBufferConst()=default
virtual BufferInfo const & info() const =0
virtual Endpoint const & endpoint() const =0
Interface for registering, discovering, and disposing shared buffers.
Definition: shmem_buffer.h:112
boost::asio::local::datagram_protocol::endpoint Endpoint
Definition: shmem_buffer.h:114
virtual void registerBuffer(IBufferMutable const &buffer)=0
static std::shared_ptr< IBufferExchange > makeProcessLocal()
virtual void listPorts(std::vector< EndpointPort > &ports) const =0
List all ports this exchange has received from peers or shared locally.
virtual void dispose(std::shared_ptr< IBufferConst > &&buffer)=0
Release resources associated with a previously retrieved buffer.
virtual void mapLocalToPeer(uint32_t local_port, Endpoint peer_endpoint, uint32_t peer_port=0)=0
virtual void listResolvedBuffers(std::map< PortIdx, std::shared_ptr< IBufferConst >> &buffers) const =0
virtual void start()=0
Start running in a background thread.
virtual void stop()=0
Request the event loop to stop.
virtual Endpoint const & localEndpoint() const =0
Local endpoint used by this exchange.
virtual std::shared_ptr< IBufferConst > get(uint32_t id, uint32_t idx) const =0
virtual void listMappings(std::map< uint32_t, std::vector< std::pair< Endpoint, uint32_t >>> &mappings) const =0
virtual bool stopped() const =0
True if the exchange has been stopped.
virtual void unregisterBuffer(IBufferMutable const &buffer)=0
Unregister a previously shared mutable buffer.
virtual void addPeer(Endpoint const &peer_endpoint)=0
virtual std::shared_ptr< IBufferConst > get(Endpoint const &ep, uint32_t id, uint32_t idx) const =0
virtual void configure(msg::ExchangeConfigT const &config)=0
virtual ~IBufferExchange()=default
Mutable view of shared memory buffer.
Definition: shmem_buffer.h:90
virtual void * mutableData()=0
virtual gbm_bo * gbmBo() const
Definition: shmem_buffer.h:95
Definition: message_port.h:19
uint32_t encoded() const
Packed 32-bit port value.
Definition: message_port.h:56
std::string format_as(BufferInfo const &)
These functions add support for fmt::format.
Definition: any_message_input.h:15
std::unique_ptr< IBufferConst > importShmemBufferConst(BufferInfo const &info, int fd, Endpoint const &endpoint)
std::unique_ptr< IBufferMutable > makeShmemBuffer(BufferInfo const &info)
Creates a mutable buffer, matching the BufferInfo.
bool isGpu(msg::BufferFormat format)
Returns true if the format is a GPU format (e.g. MIPI_RAW, YUV_NV12).
boost::asio::local::datagram_protocol::endpoint Endpoint
Definition: shmem_buffer.h:28
Definition: carrier_board_msg_spec.h:10
Definition: shmem_buffer.h:219
Definition: shmem_buffer.h:41
boost::asio::local::datagram_protocol::endpoint endpoint
Definition: shmem_buffer.h:42
MessagePort port
Definition: shmem_buffer.h:43
bool operator!=(EndpointPort const &rhs) const
Definition: shmem_buffer.h:49
bool operator<(EndpointPort const &rhs) const
Definition: shmem_buffer.h:51
bool operator==(EndpointPort const &rhs) const
Definition: shmem_buffer.h:45
Definition: shmem_buffer.h:62
uint32_t port
Definition: shmem_buffer.h:63
bool operator<(PortIdx const &o) const
Definition: shmem_buffer.h:65
bool operator==(PortIdx const &o) const
Definition: shmem_buffer.h:68
uint32_t idx
Definition: shmem_buffer.h:64
size_t operator()(sol3::core::PortIdx const &p) const noexcept
Definition: shmem_buffer.h:222