Commit | Line | Data |
---|---|---|
73b3ea14 PP |
1 | /* |
2 | * Copyright (c) 2023 Philippe Proulx <pproulx@efficios.com> | |
3 | * | |
4 | * SPDX-License-Identifier: MIT | |
5 | */ | |
6 | ||
7 | #ifndef BABELTRACE_CPP_COMMON_BT2_SELF_MESSAGE_ITERATOR_HPP | |
8 | #define BABELTRACE_CPP_COMMON_BT2_SELF_MESSAGE_ITERATOR_HPP | |
9 | ||
10 | #include <babeltrace2/babeltrace.h> | |
11 | ||
73b3ea14 PP |
12 | #include "common/common.h" |
13 | ||
14 | #include "borrowed-object.hpp" | |
15 | #include "message-iterator.hpp" | |
16 | #include "self-component-port.hpp" | |
17 | ||
18 | namespace bt2 { | |
19 | ||
20 | class SelfMessageIterator final : public BorrowedObject<bt_self_message_iterator> | |
21 | { | |
22 | public: | |
d246c457 | 23 | explicit SelfMessageIterator(const LibObjPtr libObjPtr) noexcept : |
73b3ea14 PP |
24 | _ThisBorrowedObject {libObjPtr} |
25 | { | |
26 | } | |
27 | ||
28 | MessageIterator::Shared createMessageIterator(const SelfComponentInputPort port) const | |
29 | { | |
30 | bt_message_iterator *libMsgIterPtr = nullptr; | |
31 | const auto status = bt_message_iterator_create_from_message_iterator( | |
32 | this->libObjPtr(), port.libObjPtr(), &libMsgIterPtr); | |
33 | ||
34 | switch (status) { | |
35 | case BT_MESSAGE_ITERATOR_CREATE_FROM_MESSAGE_ITERATOR_STATUS_OK: | |
73b3ea14 PP |
36 | return MessageIterator::Shared::createWithoutRef(libMsgIterPtr); |
37 | case BT_MESSAGE_ITERATOR_CREATE_FROM_MESSAGE_ITERATOR_STATUS_MEMORY_ERROR: | |
38 | throw MemoryError {}; | |
39 | case BT_MESSAGE_ITERATOR_CREATE_FROM_MESSAGE_ITERATOR_STATUS_ERROR: | |
40 | throw Error {}; | |
41 | default: | |
42 | bt_common_abort(); | |
43 | } | |
44 | } | |
45 | ||
46 | SelfComponent component() const noexcept | |
47 | { | |
48 | return SelfComponent {bt_self_message_iterator_borrow_component(this->libObjPtr())}; | |
49 | } | |
50 | ||
51 | SelfComponentOutputPort port() const noexcept | |
52 | { | |
53 | return SelfComponentOutputPort {bt_self_message_iterator_borrow_port(this->libObjPtr())}; | |
54 | } | |
55 | ||
56 | bool isInterrupted() const noexcept | |
57 | { | |
58 | return static_cast<bool>(bt_self_message_iterator_is_interrupted(this->libObjPtr())); | |
59 | } | |
60 | ||
61 | template <typename T> | |
62 | T& data() const noexcept | |
63 | { | |
64 | return *static_cast<T *>(bt_self_message_iterator_get_data(this->libObjPtr())); | |
65 | } | |
66 | ||
67 | template <typename T> | |
2a24eba8 | 68 | SelfMessageIterator data(T& obj) const noexcept |
73b3ea14 | 69 | { |
1e700b7d SM |
70 | bt_self_message_iterator_set_data(this->libObjPtr(), |
71 | const_cast<void *>(static_cast<const void *>(&obj))); | |
2a24eba8 | 72 | return *this; |
73b3ea14 | 73 | } |
5003e61f | 74 | |
292762ab | 75 | StreamBeginningMessage::Shared createStreamBeginningMessage(const ConstStream stream) const |
5003e61f SM |
76 | { |
77 | const auto libObjPtr = | |
78 | bt_message_stream_beginning_create(this->libObjPtr(), stream.libObjPtr()); | |
79 | ||
80 | if (!libObjPtr) { | |
81 | throw MemoryError {}; | |
82 | } | |
83 | ||
292762ab | 84 | return StreamBeginningMessage::Shared::createWithoutRef(libObjPtr); |
5003e61f SM |
85 | } |
86 | ||
292762ab | 87 | StreamEndMessage::Shared createStreamEndMessage(const ConstStream stream) const |
5003e61f SM |
88 | { |
89 | const auto libObjPtr = bt_message_stream_end_create(this->libObjPtr(), stream.libObjPtr()); | |
90 | ||
91 | if (!libObjPtr) { | |
92 | throw MemoryError {}; | |
93 | } | |
94 | ||
292762ab | 95 | return StreamEndMessage::Shared::createWithoutRef(libObjPtr); |
5003e61f SM |
96 | } |
97 | ||
292762ab SM |
98 | EventMessage::Shared createEventMessage(const ConstEventClass eventCls, |
99 | const ConstStream stream) const | |
5003e61f SM |
100 | { |
101 | const auto libObjPtr = | |
102 | bt_message_event_create(this->libObjPtr(), eventCls.libObjPtr(), stream.libObjPtr()); | |
103 | ||
104 | if (!libObjPtr) { | |
105 | throw MemoryError {}; | |
106 | } | |
107 | ||
292762ab | 108 | return EventMessage::Shared::createWithoutRef(libObjPtr); |
5003e61f SM |
109 | } |
110 | ||
292762ab SM |
111 | EventMessage::Shared createEventMessage(const ConstEventClass eventCls, |
112 | const ConstStream stream, | |
113 | const std::uint64_t clockSnapshotValue) const | |
5003e61f SM |
114 | { |
115 | const auto libObjPtr = bt_message_event_create_with_default_clock_snapshot( | |
116 | this->libObjPtr(), eventCls.libObjPtr(), stream.libObjPtr(), clockSnapshotValue); | |
117 | ||
118 | if (!libObjPtr) { | |
119 | throw MemoryError {}; | |
120 | } | |
121 | ||
292762ab | 122 | return EventMessage::Shared::createWithoutRef(libObjPtr); |
5003e61f SM |
123 | } |
124 | ||
292762ab SM |
125 | EventMessage::Shared createEventMessage(const ConstEventClass eventCls, |
126 | const ConstPacket packet) const | |
5003e61f SM |
127 | { |
128 | const auto libObjPtr = bt_message_event_create_with_packet( | |
129 | this->libObjPtr(), eventCls.libObjPtr(), packet.libObjPtr()); | |
130 | ||
131 | if (!libObjPtr) { | |
132 | throw MemoryError {}; | |
133 | } | |
134 | ||
292762ab | 135 | return EventMessage::Shared::createWithoutRef(libObjPtr); |
5003e61f SM |
136 | } |
137 | ||
292762ab SM |
138 | EventMessage::Shared createEventMessage(const ConstEventClass eventCls, |
139 | const ConstPacket packet, | |
140 | const std::uint64_t clockSnapshotValue) const | |
5003e61f SM |
141 | { |
142 | const auto libObjPtr = bt_message_event_create_with_packet_and_default_clock_snapshot( | |
143 | this->libObjPtr(), eventCls.libObjPtr(), packet.libObjPtr(), clockSnapshotValue); | |
144 | ||
145 | if (!libObjPtr) { | |
146 | throw MemoryError {}; | |
147 | } | |
148 | ||
292762ab | 149 | return EventMessage::Shared::createWithoutRef(libObjPtr); |
5003e61f SM |
150 | } |
151 | ||
292762ab | 152 | PacketBeginningMessage::Shared createPacketBeginningMessage(const ConstPacket packet) const |
5003e61f SM |
153 | { |
154 | const auto libObjPtr = | |
155 | bt_message_packet_beginning_create(this->libObjPtr(), packet.libObjPtr()); | |
156 | ||
157 | if (!libObjPtr) { | |
158 | throw MemoryError {}; | |
159 | } | |
160 | ||
292762ab | 161 | return PacketBeginningMessage::Shared::createWithoutRef(libObjPtr); |
5003e61f SM |
162 | } |
163 | ||
292762ab SM |
164 | PacketBeginningMessage::Shared |
165 | createPacketBeginningMessage(const ConstPacket packet, | |
5003e61f SM |
166 | const std::uint64_t clockSnapshotValue) const |
167 | { | |
168 | const auto libObjPtr = bt_message_packet_beginning_create_with_default_clock_snapshot( | |
169 | this->libObjPtr(), packet.libObjPtr(), clockSnapshotValue); | |
170 | ||
171 | if (!libObjPtr) { | |
172 | throw MemoryError {}; | |
173 | } | |
174 | ||
292762ab | 175 | return PacketBeginningMessage::Shared::createWithoutRef(libObjPtr); |
5003e61f SM |
176 | } |
177 | ||
292762ab | 178 | PacketEndMessage::Shared createPacketEndMessage(const ConstPacket packet) const |
5003e61f SM |
179 | { |
180 | const auto libObjPtr = bt_message_packet_end_create(this->libObjPtr(), packet.libObjPtr()); | |
181 | ||
182 | if (!libObjPtr) { | |
183 | throw MemoryError {}; | |
184 | } | |
185 | ||
292762ab | 186 | return PacketEndMessage::Shared::createWithoutRef(libObjPtr); |
5003e61f SM |
187 | } |
188 | ||
292762ab SM |
189 | PacketEndMessage::Shared createPacketEndMessage(const ConstPacket packet, |
190 | const std::uint64_t clockSnapshotValue) const | |
5003e61f SM |
191 | { |
192 | const auto libObjPtr = bt_message_packet_end_create_with_default_clock_snapshot( | |
193 | this->libObjPtr(), packet.libObjPtr(), clockSnapshotValue); | |
194 | ||
195 | if (!libObjPtr) { | |
196 | throw MemoryError {}; | |
197 | } | |
198 | ||
292762ab | 199 | return PacketEndMessage::Shared::createWithoutRef(libObjPtr); |
5003e61f SM |
200 | } |
201 | ||
292762ab | 202 | DiscardedEventsMessage::Shared createDiscardedEventsMessage(const ConstStream stream) |
5003e61f SM |
203 | { |
204 | const auto libObjPtr = | |
205 | bt_message_discarded_events_create(this->libObjPtr(), stream.libObjPtr()); | |
206 | ||
207 | if (!libObjPtr) { | |
208 | throw MemoryError {}; | |
209 | } | |
210 | ||
292762ab | 211 | return DiscardedEventsMessage::Shared::createWithoutRef(libObjPtr); |
5003e61f SM |
212 | } |
213 | ||
292762ab SM |
214 | DiscardedEventsMessage::Shared |
215 | createDiscardedEventsMessage(const ConstStream stream, | |
5003e61f | 216 | const std::uint64_t beginningClockSnapshotValue, |
d2ba27dd | 217 | const std::uint64_t endClockSnapshotValue) const |
5003e61f SM |
218 | { |
219 | const auto libObjPtr = bt_message_discarded_events_create_with_default_clock_snapshots( | |
220 | this->libObjPtr(), stream.libObjPtr(), beginningClockSnapshotValue, | |
221 | endClockSnapshotValue); | |
222 | ||
223 | if (!libObjPtr) { | |
224 | throw MemoryError {}; | |
225 | } | |
226 | ||
292762ab | 227 | return DiscardedEventsMessage::Shared::createWithoutRef(libObjPtr); |
5003e61f SM |
228 | } |
229 | ||
292762ab | 230 | DiscardedPacketsMessage::Shared createDiscardedPacketsMessage(const ConstStream stream) const |
5003e61f SM |
231 | { |
232 | const auto libObjPtr = | |
233 | bt_message_discarded_packets_create(this->libObjPtr(), stream.libObjPtr()); | |
234 | ||
235 | if (!libObjPtr) { | |
236 | throw MemoryError {}; | |
237 | } | |
238 | ||
292762ab | 239 | return DiscardedPacketsMessage::Shared::createWithoutRef(libObjPtr); |
5003e61f SM |
240 | } |
241 | ||
292762ab SM |
242 | DiscardedPacketsMessage::Shared |
243 | createDiscardedPacketsMessage(const ConstStream stream, | |
5003e61f | 244 | const std::uint64_t beginningClockSnapshotValue, |
d2ba27dd | 245 | const std::uint64_t endClockSnapshotValue) const |
5003e61f SM |
246 | { |
247 | const auto libObjPtr = bt_message_discarded_packets_create_with_default_clock_snapshots( | |
248 | this->libObjPtr(), stream.libObjPtr(), beginningClockSnapshotValue, | |
249 | endClockSnapshotValue); | |
250 | ||
251 | if (!libObjPtr) { | |
252 | throw MemoryError {}; | |
253 | } | |
254 | ||
292762ab | 255 | return DiscardedPacketsMessage::Shared::createWithoutRef(libObjPtr); |
5003e61f SM |
256 | } |
257 | ||
292762ab SM |
258 | MessageIteratorInactivityMessage::Shared |
259 | createMessageIteratorInactivityMessage(const ConstClockClass clockClass, | |
d2ba27dd | 260 | const std::uint64_t clockSnapshotValue) const |
5003e61f SM |
261 | { |
262 | const auto libObjPtr = bt_message_message_iterator_inactivity_create( | |
263 | this->libObjPtr(), clockClass.libObjPtr(), clockSnapshotValue); | |
264 | ||
265 | if (!libObjPtr) { | |
266 | throw MemoryError {}; | |
267 | } | |
268 | ||
292762ab | 269 | return MessageIteratorInactivityMessage::Shared::createWithoutRef(libObjPtr); |
5003e61f | 270 | } |
73b3ea14 PP |
271 | }; |
272 | ||
273 | } /* namespace bt2 */ | |
274 | ||
275 | #endif /* BABELTRACE_CPP_COMMON_BT2_SELF_MESSAGE_ITERATOR_HPP */ |