59 template <
typename MessageT>
63 template <
typename MessageT>
68 template <
typename MessageT>
72 template <
typename MessageT>
79 void ReadMessage(uint64_t channel_id, uint32_t block_index);
80 void OnMessage(uint64_t channel_id,
const std::shared_ptr<ReadableBlock>& rb,
82 void ReadArenaMessage(uint64_t channel_id, uint32_t arena_block_index);
83 void OnArenaMessage(uint64_t channel_id,
84 const std::shared_ptr<ReadableBlock>& rb,
91 std::unordered_map<uint64_t, uint32_t> previous_indexes_;
92 std::unordered_map<uint64_t, uint32_t> arena_previous_indexes_;
162 if (cyber::common::GlobalData::Instance()->IsChannelEnableArenaShm(
164 self_attr.
message_type() != message::MessageType<message::RawMessage>() &&
166 message::MessageType<message::PyMessageWrap>()) {
167 auto listener_adapter = [listener, self_attr](
168 const std::shared_ptr<ReadableBlock>& rb,
170 auto msg = std::make_shared<MessageT>();
172 auto arena_manager = ProtobufArenaManager::Instance();
173 auto msg_wrapper = arena_manager->CreateMessageWrapper();
174 memcpy(msg_wrapper->GetData(), rb->buf, 1024);
178 AERROR <<
"ParseFromArenaMessageWrapper failed";
182 auto segment = arena_manager->GetSegment(self_attr.
channel_id());
183 auto msg_addr =
reinterpret_cast<uint64_t
>(msg_p);
184 msg.reset(
reinterpret_cast<MessageT*
>(msg_addr),
185 [arena_manager, segment, msg_wrapper](MessageT* p) {
194 for (
auto block_index :
195 arena_manager->GetMessageRelatedBlocks(msg_wrapper.get())) {
196 segment->AddBlockReadLock(block_index);
199 auto send_time = msg_info.send_time();
200 auto msg_seq_num = msg_info.msg_seq_num();
202 statistics::Statistics::Instance()->AddRecvCount(self_attr,
203 msg_info.msg_seq_num());
204 statistics::Statistics::Instance()->SetTotalMsgsStatus(self_attr,
210 auto tran_diff = (recv_time - send_time) / 1000;
213 statistics::Statistics::Instance()->SamplingTranLatency<uint64_t>(
214 self_attr, tran_diff);
216 statistics::Statistics::Instance()->SetProcStatus(self_attr,
218 listener(msg, msg_info);
219 auto related_blocks =
220 arena_manager->GetMessageRelatedBlocks(msg_wrapper.get());
221 for (
auto block_index : related_blocks) {
223 segment->RemoveBlockReadLock(block_index);
227 AddArenaListener<ReadableBlock>(self_attr, listener_adapter);
229 auto listener_adapter = [listener, self_attr](
230 const std::shared_ptr<ReadableBlock>& rb,
232 auto msg = std::make_shared<MessageT>();
235 rb->buf,
static_cast<int>(rb->block->msg_size()), msg.get()));
237 auto send_time = msg_info.send_time();
238 auto msg_seq_num = msg_info.msg_seq_num();
240 statistics::Statistics::Instance()->AddRecvCount(self_attr,
241 msg_info.msg_seq_num());
242 statistics::Statistics::Instance()->SetTotalMsgsStatus(self_attr,
248 auto tran_diff = (recv_time - send_time) / 1000;
251 statistics::Statistics::Instance()->SamplingTranLatency<uint64_t>(
252 self_attr, tran_diff);
254 statistics::Statistics::Instance()->SetProcStatus(self_attr,
256 listener(msg, msg_info);
259 Dispatcher::AddListener<ReadableBlock>(self_attr, listener_adapter);
261 AddSegment(self_attr);
269 if (cyber::common::GlobalData::Instance()->IsChannelEnableArenaShm(
271 self_attr.
message_type() != message::MessageType<message::RawMessage>() &&
273 message::MessageType<message::PyMessageWrap>()) {
274 auto listener_adapter = [listener, self_attr](
275 const std::shared_ptr<ReadableBlock>& rb,
277 auto msg = std::make_shared<MessageT>();
278 auto arena_manager = ProtobufArenaManager::Instance();
279 auto msg_wrapper = arena_manager->CreateMessageWrapper();
280 memcpy(msg_wrapper->GetData(), rb->buf, 1024);
284 AERROR <<
"ParseFromArenaMessageWrapper failed";
288 auto segment = arena_manager->GetSegment(self_attr.
channel_id());
289 auto msg_addr =
reinterpret_cast<uint64_t
>(msg_p);
290 msg.reset(
reinterpret_cast<MessageT*
>(msg_addr),
291 [arena_manager, segment, msg_wrapper](MessageT* p) {
300 for (
auto block_index :
301 arena_manager->GetMessageRelatedBlocks(msg_wrapper.get())) {
302 segment->AddBlockReadLock(block_index);
305 auto send_time = msg_info.send_time();
306 auto msg_seq_num = msg_info.msg_seq_num();
308 statistics::Statistics::Instance()->AddRecvCount(self_attr,
309 msg_info.msg_seq_num());
310 statistics::Statistics::Instance()->SetTotalMsgsStatus(self_attr,
316 auto tran_diff = (recv_time - send_time) / 1000;
318 statistics::Statistics::Instance()->SamplingTranLatency<uint64_t>(
319 self_attr, tran_diff);
321 statistics::Statistics::Instance()->SetProcStatus(self_attr,
324 listener(msg, msg_info);
325 auto related_blocks =
326 arena_manager->GetMessageRelatedBlocks(msg_wrapper.get());
327 for (
auto block_index : related_blocks) {
329 segment->RemoveBlockReadLock(block_index);
333 AddArenaListener<ReadableBlock>(self_attr, opposite_attr, listener_adapter);
335 auto listener_adapter = [listener, self_attr](
336 const std::shared_ptr<ReadableBlock>& rb,
338 auto msg = std::make_shared<MessageT>();
340 rb->buf,
static_cast<int>(rb->block->msg_size()), msg.get()));
342 auto send_time = msg_info.send_time();
343 auto msg_seq_num = msg_info.msg_seq_num();
345 statistics::Statistics::Instance()->AddRecvCount(self_attr,
346 msg_info.msg_seq_num());
347 statistics::Statistics::Instance()->SetTotalMsgsStatus(self_attr,
353 auto tran_diff = (recv_time - send_time) / 1000;
355 statistics::Statistics::Instance()->SamplingTranLatency<uint64_t>(
356 self_attr, tran_diff);
358 statistics::Statistics::Instance()->SetProcStatus(self_attr,
361 listener(msg, msg_info);
364 Dispatcher::AddListener<ReadableBlock>(self_attr, opposite_attr,
367 AddSegment(self_attr);