Apollo 10.0
自动驾驶开放平台
component.h
浏览该文件的文档.
1/******************************************************************************
2 * Copyright 2018 The Apollo Authors. All Rights Reserved.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *****************************************************************************/
16
17#ifndef CYBER_COMPONENT_COMPONENT_H_
18#define CYBER_COMPONENT_COMPONENT_H_
19
20#include <memory>
21#include <utility>
22#include <vector>
23
24#include "cyber/base/macros.h"
27#include "cyber/common/types.h"
28#include "cyber/common/util.h"
34#include "cyber/time/time.h"
35
36namespace apollo {
37namespace cyber {
38
41
58template <typename M0 = NullType, typename M1 = NullType,
59 typename M2 = NullType, typename M3 = NullType>
60class Component : public ComponentBase {
61 public:
63 ~Component() override {}
64
72 bool Initialize(const ComponentConfig& config) override;
73 bool Process(const std::shared_ptr<M0>& msg0, const std::shared_ptr<M1>& msg1,
74 const std::shared_ptr<M2>& msg2,
75 const std::shared_ptr<M3>& msg3);
76
77 private:
88 virtual bool Proc(const std::shared_ptr<M0>& msg0,
89 const std::shared_ptr<M1>& msg1,
90 const std::shared_ptr<M2>& msg2,
91 const std::shared_ptr<M3>& msg3) = 0;
92};
93
94template <>
96 public:
98 ~Component() override {}
99 bool Initialize(const ComponentConfig& config) override;
100};
101
102template <typename M0>
104 public:
106 ~Component() override {}
107 bool Initialize(const ComponentConfig& config) override;
108 bool Process(const std::shared_ptr<M0>& msg);
109
110 private:
111 virtual bool Proc(const std::shared_ptr<M0>& msg) = 0;
112};
113
114template <typename M0, typename M1>
115class Component<M0, M1, NullType, NullType> : public ComponentBase {
116 public:
118 ~Component() override {}
119 bool Initialize(const ComponentConfig& config) override;
120 bool Process(const std::shared_ptr<M0>& msg0,
121 const std::shared_ptr<M1>& msg1);
122
123 private:
124 virtual bool Proc(const std::shared_ptr<M0>& msg,
125 const std::shared_ptr<M1>& msg1) = 0;
126};
127
128template <typename M0, typename M1, typename M2>
129class Component<M0, M1, M2, NullType> : public ComponentBase {
130 public:
132 ~Component() override {}
133 bool Initialize(const ComponentConfig& config) override;
134 bool Process(const std::shared_ptr<M0>& msg0, const std::shared_ptr<M1>& msg1,
135 const std::shared_ptr<M2>& msg2);
136
137 private:
138 virtual bool Proc(const std::shared_ptr<M0>& msg,
139 const std::shared_ptr<M1>& msg1,
140 const std::shared_ptr<M2>& msg2) = 0;
141};
142
143template <typename M0>
145 const std::shared_ptr<M0>& msg) {
146 if (is_shutdown_.load()) {
147 return true;
148 }
149 return Proc(msg);
150}
151
153 const ComponentConfig& config) {
154 node_.reset(new Node(config.name()));
155 LoadConfigFiles(config);
156 if (!Init()) {
157 AERROR << "Component Init() failed." << std::endl;
158 return false;
159 }
160 return true;
161}
162
163template <typename M0>
165 const ComponentConfig& config) {
166 node_.reset(new Node(config.name()));
167 LoadConfigFiles(config);
168
169 if (config.readers_size() < 1) {
170 AERROR << "Invalid config file: too few readers.";
171 return false;
172 }
173
174 if (!Init()) {
175 AERROR << "Component Init() failed.";
176 return false;
177 }
178
179 bool is_reality_mode = GlobalData::Instance()->IsRealityMode();
180
181 ReaderConfig reader_cfg;
182 reader_cfg.channel_name = config.readers(0).channel();
183 reader_cfg.qos_profile.CopyFrom(config.readers(0).qos_profile());
184 reader_cfg.pending_queue_size = config.readers(0).pending_queue_size();
185
186 auto role_attr = std::make_shared<proto::RoleAttributes>();
187 role_attr->set_node_name(config.name());
188 role_attr->set_channel_name(config.readers(0).channel());
189
190 std::weak_ptr<Component<M0>> self =
191 std::dynamic_pointer_cast<Component<M0>>(shared_from_this());
192 auto func = [self, role_attr](const std::shared_ptr<M0>& msg) {
193 auto start_time = Time::Now().ToMicrosecond();
194 auto ptr = self.lock();
195 if (ptr) {
196 ptr->Process(msg);
197 } else {
198 AERROR << "Component object has been destroyed.";
199 }
200 auto end_time = Time::Now().ToMicrosecond();
201 // sampling proc latency and cyber latency in microsecond
202 uint64_t process_start_time;
203 statistics::Statistics::Instance()->SamplingProcLatency<uint64_t>(
204 *role_attr, end_time - start_time);
205 if (statistics::Statistics::Instance()->GetProcStatus(
206 *role_attr, &process_start_time) &&
207 (start_time - process_start_time) > 0) {
208 statistics::Statistics::Instance()->SamplingCyberLatency(
209 *role_attr, start_time - process_start_time);
210 }
211 };
212
213 std::shared_ptr<Reader<M0>> reader = nullptr;
214
215 if (cyber_likely(is_reality_mode)) {
216 reader = node_->CreateReader<M0>(reader_cfg);
217 } else {
218 reader = node_->CreateReader<M0>(reader_cfg, func);
219 }
220
221 if (reader == nullptr) {
222 AERROR << "Component create reader failed.";
223 return false;
224 }
225 readers_.emplace_back(std::move(reader));
226
227 if (cyber_unlikely(!is_reality_mode)) {
228 return true;
229 }
230
231 data::VisitorConfig conf = {readers_[0]->ChannelId(),
232 readers_[0]->PendingQueueSize()};
233 auto dv = std::make_shared<data::DataVisitor<M0>>(conf);
235 croutine::CreateRoutineFactory<M0>(func, dv);
236 auto sched = scheduler::Instance();
237 return sched->CreateTask(factory, node_->Name());
238}
239
240template <typename M0, typename M1>
242 const std::shared_ptr<M0>& msg0, const std::shared_ptr<M1>& msg1) {
243 if (is_shutdown_.load()) {
244 return true;
245 }
246 return Proc(msg0, msg1);
247}
248
249template <typename M0, typename M1>
251 const ComponentConfig& config) {
252 node_.reset(new Node(config.name()));
253 LoadConfigFiles(config);
254
255 if (config.readers_size() < 2) {
256 AERROR << "Invalid config file: too few readers.";
257 return false;
258 }
259
260 if (!Init()) {
261 AERROR << "Component Init() failed.";
262 return false;
263 }
264
265 bool is_reality_mode = GlobalData::Instance()->IsRealityMode();
266
267 ReaderConfig reader_cfg;
268 reader_cfg.channel_name = config.readers(1).channel();
269 reader_cfg.qos_profile.CopyFrom(config.readers(1).qos_profile());
270 reader_cfg.pending_queue_size = config.readers(1).pending_queue_size();
271
272 auto reader1 = node_->template CreateReader<M1>(reader_cfg);
273
274 reader_cfg.channel_name = config.readers(0).channel();
275 reader_cfg.qos_profile.CopyFrom(config.readers(0).qos_profile());
276 reader_cfg.pending_queue_size = config.readers(0).pending_queue_size();
277
278 auto role_attr = std::make_shared<proto::RoleAttributes>();
279 role_attr->set_node_name(config.name());
280 role_attr->set_channel_name(config.readers(0).channel());
281
282 std::shared_ptr<Reader<M0>> reader0 = nullptr;
283 if (cyber_likely(is_reality_mode)) {
284 reader0 = node_->template CreateReader<M0>(reader_cfg);
285 } else {
286 std::weak_ptr<Component<M0, M1>> self =
287 std::dynamic_pointer_cast<Component<M0, M1>>(shared_from_this());
288
289 auto blocker1 = blocker::BlockerManager::Instance()->GetBlocker<M1>(
290 config.readers(1).channel());
291
292 auto func = [self, blocker1, role_attr](const std::shared_ptr<M0>& msg0) {
293 auto start_time = Time::Now().ToMicrosecond();
294 auto ptr = self.lock();
295 if (ptr) {
296 if (!blocker1->IsPublishedEmpty()) {
297 auto msg1 = blocker1->GetLatestPublishedPtr();
298 ptr->Process(msg0, msg1);
299 auto end_time = Time::Now().ToMicrosecond();
300 // sampling proc latency and cyber latency in microsecond
301 uint64_t process_start_time;
302 statistics::Statistics::Instance()->SamplingProcLatency<uint64_t>(
303 *role_attr, end_time - start_time);
304 if (statistics::Statistics::Instance()->GetProcStatus(
305 *role_attr, &process_start_time) &&
306 (start_time - process_start_time) > 0) {
307 statistics::Statistics::Instance()->SamplingCyberLatency(
308 *role_attr, start_time - process_start_time);
309 }
310 }
311 } else {
312 AERROR << "Component object has been destroyed.";
313 }
314 };
315
316 reader0 = node_->template CreateReader<M0>(reader_cfg, func);
317 }
318 if (reader0 == nullptr || reader1 == nullptr) {
319 AERROR << "Component create reader failed.";
320 return false;
321 }
322 readers_.push_back(std::move(reader0));
323 readers_.push_back(std::move(reader1));
324
325 if (cyber_unlikely(!is_reality_mode)) {
326 return true;
327 }
328
329 auto sched = scheduler::Instance();
330 std::weak_ptr<Component<M0, M1>> self =
331 std::dynamic_pointer_cast<Component<M0, M1>>(shared_from_this());
332 auto func = [self, role_attr](const std::shared_ptr<M0>& msg0,
333 const std::shared_ptr<M1>& msg1) {
334 auto start_time = Time::Now().ToMicrosecond();
335 auto ptr = self.lock();
336 if (ptr) {
337 ptr->Process(msg0, msg1);
338 auto end_time = Time::Now().ToMicrosecond();
339 // sampling proc latency and cyber latency in microsecond
340 uint64_t process_start_time;
341 statistics::Statistics::Instance()->SamplingProcLatency<uint64_t>(
342 *role_attr, end_time - start_time);
343 if (statistics::Statistics::Instance()->GetProcStatus(
344 *role_attr, &process_start_time) &&
345 (start_time - process_start_time) > 0) {
346 statistics::Statistics::Instance()->SamplingCyberLatency(
347 *role_attr, start_time - process_start_time);
348 }
349 } else {
350 AERROR << "Component object has been destroyed.";
351 }
352 };
353
354 std::vector<data::VisitorConfig> config_list;
355 for (auto& reader : readers_) {
356 config_list.emplace_back(reader->ChannelId(), reader->PendingQueueSize());
357 }
358 auto dv = std::make_shared<data::DataVisitor<M0, M1>>(config_list);
360 croutine::CreateRoutineFactory<M0, M1>(func, dv);
361 return sched->CreateTask(factory, node_->Name());
362}
363
364template <typename M0, typename M1, typename M2>
365bool Component<M0, M1, M2, NullType>::Process(const std::shared_ptr<M0>& msg0,
366 const std::shared_ptr<M1>& msg1,
367 const std::shared_ptr<M2>& msg2) {
368 if (is_shutdown_.load()) {
369 return true;
370 }
371 return Proc(msg0, msg1, msg2);
372}
373
374template <typename M0, typename M1, typename M2>
376 const ComponentConfig& config) {
377 node_.reset(new Node(config.name()));
378 LoadConfigFiles(config);
379
380 if (config.readers_size() < 3) {
381 AERROR << "Invalid config file: too few readers.";
382 return false;
383 }
384
385 if (!Init()) {
386 AERROR << "Component Init() failed.";
387 return false;
388 }
389
390 bool is_reality_mode = GlobalData::Instance()->IsRealityMode();
391
392 ReaderConfig reader_cfg;
393 reader_cfg.channel_name = config.readers(1).channel();
394 reader_cfg.qos_profile.CopyFrom(config.readers(1).qos_profile());
395 reader_cfg.pending_queue_size = config.readers(1).pending_queue_size();
396
397 auto reader1 = node_->template CreateReader<M1>(reader_cfg);
398
399 reader_cfg.channel_name = config.readers(2).channel();
400 reader_cfg.qos_profile.CopyFrom(config.readers(2).qos_profile());
401 reader_cfg.pending_queue_size = config.readers(2).pending_queue_size();
402
403 auto reader2 = node_->template CreateReader<M2>(reader_cfg);
404
405 reader_cfg.channel_name = config.readers(0).channel();
406 reader_cfg.qos_profile.CopyFrom(config.readers(0).qos_profile());
407 reader_cfg.pending_queue_size = config.readers(0).pending_queue_size();
408
409 auto role_attr = std::make_shared<proto::RoleAttributes>();
410 role_attr->set_node_name(config.name());
411 role_attr->set_channel_name(config.readers(0).channel());
412
413 std::shared_ptr<Reader<M0>> reader0 = nullptr;
414 if (cyber_likely(is_reality_mode)) {
415 reader0 = node_->template CreateReader<M0>(reader_cfg);
416 } else {
417 std::weak_ptr<Component<M0, M1, M2, NullType>> self =
418 std::dynamic_pointer_cast<Component<M0, M1, M2, NullType>>(
419 shared_from_this());
420
421 auto blocker1 = blocker::BlockerManager::Instance()->GetBlocker<M1>(
422 config.readers(1).channel());
423 auto blocker2 = blocker::BlockerManager::Instance()->GetBlocker<M2>(
424 config.readers(2).channel());
425
426 auto func = [self, blocker1, blocker2,
427 role_attr](const std::shared_ptr<M0>& msg0) {
428 auto start_time = Time::Now().ToMicrosecond();
429 auto ptr = self.lock();
430 if (ptr) {
431 if (!blocker1->IsPublishedEmpty() && !blocker2->IsPublishedEmpty()) {
432 auto msg1 = blocker1->GetLatestPublishedPtr();
433 auto msg2 = blocker2->GetLatestPublishedPtr();
434 ptr->Process(msg0, msg1, msg2);
435 auto end_time = Time::Now().ToMicrosecond();
436 // sampling proc latency and cyber latency in microsecond
437 uint64_t process_start_time;
438 statistics::Statistics::Instance()->SamplingProcLatency<uint64_t>(
439 *role_attr, end_time - start_time);
440 if (statistics::Statistics::Instance()->GetProcStatus(
441 *role_attr, &process_start_time) &&
442 (start_time - process_start_time) > 0) {
443 statistics::Statistics::Instance()->SamplingCyberLatency(
444 *role_attr, start_time - process_start_time);
445 }
446 }
447 } else {
448 AERROR << "Component object has been destroyed.";
449 }
450 };
451
452 reader0 = node_->template CreateReader<M0>(reader_cfg, func);
453 }
454
455 if (reader0 == nullptr || reader1 == nullptr || reader2 == nullptr) {
456 AERROR << "Component create reader failed.";
457 return false;
458 }
459 readers_.push_back(std::move(reader0));
460 readers_.push_back(std::move(reader1));
461 readers_.push_back(std::move(reader2));
462
463 if (cyber_unlikely(!is_reality_mode)) {
464 return true;
465 }
466
467 auto sched = scheduler::Instance();
468 std::weak_ptr<Component<M0, M1, M2, NullType>> self =
469 std::dynamic_pointer_cast<Component<M0, M1, M2, NullType>>(
470 shared_from_this());
471 auto func = [self, role_attr](const std::shared_ptr<M0>& msg0,
472 const std::shared_ptr<M1>& msg1,
473 const std::shared_ptr<M2>& msg2) {
474 auto start_time = Time::Now().ToMicrosecond();
475 auto ptr = self.lock();
476 if (ptr) {
477 ptr->Process(msg0, msg1, msg2);
478 auto end_time = Time::Now().ToMicrosecond();
479 // sampling proc latency and cyber latency in microsecond
480 uint64_t process_start_time;
481 statistics::Statistics::Instance()->SamplingProcLatency<uint64_t>(
482 *role_attr, end_time - start_time);
483 if (statistics::Statistics::Instance()->GetProcStatus(
484 *role_attr, &process_start_time) &&
485 (start_time - process_start_time) > 0) {
486 statistics::Statistics::Instance()->SamplingCyberLatency(
487 *role_attr, start_time - process_start_time);
488 }
489 } else {
490 AERROR << "Component object has been destroyed.";
491 }
492 };
493
494 std::vector<data::VisitorConfig> config_list;
495 for (auto& reader : readers_) {
496 config_list.emplace_back(reader->ChannelId(), reader->PendingQueueSize());
497 }
498 auto dv = std::make_shared<data::DataVisitor<M0, M1, M2>>(config_list);
500 croutine::CreateRoutineFactory<M0, M1, M2>(func, dv);
501 return sched->CreateTask(factory, node_->Name());
502}
503
504template <typename M0, typename M1, typename M2, typename M3>
505bool Component<M0, M1, M2, M3>::Process(const std::shared_ptr<M0>& msg0,
506 const std::shared_ptr<M1>& msg1,
507 const std::shared_ptr<M2>& msg2,
508 const std::shared_ptr<M3>& msg3) {
509 if (is_shutdown_.load()) {
510 return true;
511 }
512 return Proc(msg0, msg1, msg2, msg3);
513}
514
515template <typename M0, typename M1, typename M2, typename M3>
517 node_.reset(new Node(config.name()));
518 LoadConfigFiles(config);
519
520 if (config.readers_size() < 4) {
521 AERROR << "Invalid config file: too few readers_." << std::endl;
522 return false;
523 }
524
525 if (!Init()) {
526 AERROR << "Component Init() failed." << std::endl;
527 return false;
528 }
529
530 bool is_reality_mode = GlobalData::Instance()->IsRealityMode();
531
532 ReaderConfig reader_cfg;
533 reader_cfg.channel_name = config.readers(1).channel();
534 reader_cfg.qos_profile.CopyFrom(config.readers(1).qos_profile());
535 reader_cfg.pending_queue_size = config.readers(1).pending_queue_size();
536
537 auto reader1 = node_->template CreateReader<M1>(reader_cfg);
538
539 reader_cfg.channel_name = config.readers(2).channel();
540 reader_cfg.qos_profile.CopyFrom(config.readers(2).qos_profile());
541 reader_cfg.pending_queue_size = config.readers(2).pending_queue_size();
542
543 auto reader2 = node_->template CreateReader<M2>(reader_cfg);
544
545 reader_cfg.channel_name = config.readers(3).channel();
546 reader_cfg.qos_profile.CopyFrom(config.readers(3).qos_profile());
547 reader_cfg.pending_queue_size = config.readers(3).pending_queue_size();
548
549 auto reader3 = node_->template CreateReader<M3>(reader_cfg);
550
551 reader_cfg.channel_name = config.readers(0).channel();
552 reader_cfg.qos_profile.CopyFrom(config.readers(0).qos_profile());
553 reader_cfg.pending_queue_size = config.readers(0).pending_queue_size();
554
555 auto role_attr = std::make_shared<proto::RoleAttributes>();
556 role_attr->set_node_name(config.name());
557 role_attr->set_channel_name(config.readers(0).channel());
558
559 std::shared_ptr<Reader<M0>> reader0 = nullptr;
560 if (cyber_likely(is_reality_mode)) {
561 reader0 = node_->template CreateReader<M0>(reader_cfg);
562 } else {
563 std::weak_ptr<Component<M0, M1, M2, M3>> self =
564 std::dynamic_pointer_cast<Component<M0, M1, M2, M3>>(
565 shared_from_this());
566
567 auto blocker1 = blocker::BlockerManager::Instance()->GetBlocker<M1>(
568 config.readers(1).channel());
569 auto blocker2 = blocker::BlockerManager::Instance()->GetBlocker<M2>(
570 config.readers(2).channel());
571 auto blocker3 = blocker::BlockerManager::Instance()->GetBlocker<M3>(
572 config.readers(3).channel());
573
574 auto func = [self, blocker1, blocker2, blocker3,
575 role_attr](const std::shared_ptr<M0>& msg0) {
576 auto start_time = Time::Now().ToMicrosecond();
577 auto ptr = self.lock();
578 if (ptr) {
579 if (!blocker1->IsPublishedEmpty() && !blocker2->IsPublishedEmpty() &&
580 !blocker3->IsPublishedEmpty()) {
581 auto msg1 = blocker1->GetLatestPublishedPtr();
582 auto msg2 = blocker2->GetLatestPublishedPtr();
583 auto msg3 = blocker3->GetLatestPublishedPtr();
584 ptr->Process(msg0, msg1, msg2, msg3);
585 auto end_time = Time::Now().ToMicrosecond();
586 // sampling proc latency and cyber latency in microsecond
587 uint64_t process_start_time;
588 statistics::Statistics::Instance()->SamplingProcLatency<uint64_t>(
589 *role_attr, end_time - start_time);
590 if (statistics::Statistics::Instance()->GetProcStatus(
591 *role_attr, &process_start_time) &&
592 (start_time - process_start_time) > 0) {
593 statistics::Statistics::Instance()->SamplingCyberLatency(
594 *role_attr, start_time - process_start_time);
595 }
596 }
597 } else {
598 AERROR << "Component object has been destroyed.";
599 }
600 };
601
602 reader0 = node_->template CreateReader<M0>(reader_cfg, func);
603 }
604
605 if (reader0 == nullptr || reader1 == nullptr || reader2 == nullptr ||
606 reader3 == nullptr) {
607 AERROR << "Component create reader failed." << std::endl;
608 return false;
609 }
610 readers_.push_back(std::move(reader0));
611 readers_.push_back(std::move(reader1));
612 readers_.push_back(std::move(reader2));
613 readers_.push_back(std::move(reader3));
614
615 if (cyber_unlikely(!is_reality_mode)) {
616 return true;
617 }
618
619 auto sched = scheduler::Instance();
620 std::weak_ptr<Component<M0, M1, M2, M3>> self =
621 std::dynamic_pointer_cast<Component<M0, M1, M2, M3>>(shared_from_this());
622 auto func = [self, role_attr](const std::shared_ptr<M0>& msg0,
623 const std::shared_ptr<M1>& msg1,
624 const std::shared_ptr<M2>& msg2,
625 const std::shared_ptr<M3>& msg3) {
626 auto start_time = Time::Now().ToMicrosecond();
627 auto ptr = self.lock();
628 if (ptr) {
629 ptr->Process(msg0, msg1, msg2, msg3);
630 auto end_time = Time::Now().ToMicrosecond();
631 // sampling proc latency and cyber latency in microsecond
632 uint64_t process_start_time;
633 statistics::Statistics::Instance()->SamplingProcLatency<uint64_t>(
634 *role_attr, end_time - start_time);
635 if (statistics::Statistics::Instance()->GetProcStatus(
636 *role_attr, &process_start_time) &&
637 (start_time - process_start_time) > 0) {
638 statistics::Statistics::Instance()->SamplingCyberLatency(
639 *role_attr, start_time - process_start_time);
640 }
641 } else {
642 AERROR << "Component object has been destroyed." << std::endl;
643 }
644 };
645
646 std::vector<data::VisitorConfig> config_list;
647 for (auto& reader : readers_) {
648 config_list.emplace_back(reader->ChannelId(), reader->PendingQueueSize());
649 }
650 auto dv = std::make_shared<data::DataVisitor<M0, M1, M2, M3>>(config_list);
651 croutine::RoutineFactory factory =
652 croutine::CreateRoutineFactory<M0, M1, M2, M3>(func, dv);
653 return sched->CreateTask(factory, node_->Name());
654}
655
656#define CYBER_REGISTER_COMPONENT(name) \
657 CLASS_LOADER_REGISTER_CLASS(name, apollo::cyber::ComponentBase)
658
659} // namespace cyber
660} // namespace apollo
661
662#endif // CYBER_COMPONENT_COMPONENT_H_
bool Initialize(const ComponentConfig &config) override
bool Process(const std::shared_ptr< M0 > &msg0, const std::shared_ptr< M1 > &msg1, const std::shared_ptr< M2 > &msg2, const std::shared_ptr< M3 > &msg3)
Definition component.h:505
bool Initialize(const ComponentConfig &config) override
init the component by protobuf object.
Definition component.h:152
Node is the fundamental building block of Cyber RT.
Definition node.h:44
uint64_t ToMicrosecond() const
convert time to microsecond (us).
Definition time.cc:85
static Time Now()
get the current time.
Definition time.cc:57
static const std::shared_ptr< BlockerManager > & Instance()
#define cyber_likely(x)
Definition macros.h:29
#define cyber_unlikely(x)
Definition macros.h:30
#define AERROR
Definition log.h:44
bool Init(const char *binary_name, const std::string &dag_info)
Definition init.cc:98
class register implement
Definition arena_queue.h:37
uint32_t pending_queue_size
configuration for responding ChannelBuffer.