Actually manage memory in the old-style AOS logging
LeakSanitizer should be happy with it now. It's also still just as
thread-safe.
Change-Id: Id09a0349657cf4f719267b053f0ea3d8ec366256
diff --git a/aos/events/aos_logging.cc b/aos/events/aos_logging.cc
index d312925..5b6f72c 100644
--- a/aos/events/aos_logging.cc
+++ b/aos/events/aos_logging.cc
@@ -5,7 +5,7 @@
void AosLogToFbs::Initialize(Sender<logging::LogMessageFbs> log_sender) {
log_sender_ = std::move(log_sender);
if (log_sender_) {
- logging::RegisterCallbackImplementation(
+ implementation_ = std::make_shared<logging::CallbackLogImplementation>(
[this](const logging::LogMessage &message_data) {
aos::Sender<logging::LogMessageFbs>::Builder message =
log_sender_.MakeBuilder();
@@ -23,8 +23,7 @@
builder.add_name(name_str);
message.Send(builder.Finish());
- },
- false);
+ });
}
}
diff --git a/aos/events/aos_logging.h b/aos/events/aos_logging.h
index b50569c..e99edb7 100644
--- a/aos/events/aos_logging.h
+++ b/aos/events/aos_logging.h
@@ -11,13 +11,14 @@
public:
AosLogToFbs() {}
- // TODO(Tyler): Deregister logger on destruction to avoid memory leaks
-
void Initialize(Sender<logging::LogMessageFbs> log_sender);
+ std::shared_ptr<logging::LogImplementation> implementation() const {
+ return implementation_;
+ }
private:
Sender<logging::LogMessageFbs> log_sender_;
- logging::ScopedLogRestorer prev_logger_;
+ std::shared_ptr<logging::LogImplementation> implementation_;
};
} // namespace aos
diff --git a/aos/events/event_loop.h b/aos/events/event_loop.h
index de397e2..1e7d25b 100644
--- a/aos/events/event_loop.h
+++ b/aos/events/event_loop.h
@@ -358,7 +358,7 @@
// Returns the name of the underlying queue.
const Channel *channel() const { return sender_->channel(); }
- operator bool() { return sender_ ? true : false; }
+ operator bool() const { return sender_ ? true : false; }
// Returns the time_points that the last message was sent at.
aos::monotonic_clock::time_point monotonic_sent_time() const {
diff --git a/aos/events/shm_event_loop.cc b/aos/events/shm_event_loop.cc
index 29f01a4..406325d 100644
--- a/aos/events/shm_event_loop.cc
+++ b/aos/events/shm_event_loop.cc
@@ -964,9 +964,11 @@
ReserveEvents();
{
+ logging::ScopedLogRestorer prev_logger;
AosLogToFbs aos_logger;
if (!skip_logger_) {
aos_logger.Initialize(MakeSender<logging::LogMessageFbs>("/aos"));
+ prev_logger.Swap(aos_logger.implementation());
}
aos::SetCurrentThreadName(name_.substr(0, 16));
diff --git a/aos/events/simulated_event_loop.cc b/aos/events/simulated_event_loop.cc
index a7301bf..c429eef 100644
--- a/aos/events/simulated_event_loop.cc
+++ b/aos/events/simulated_event_loop.cc
@@ -570,9 +570,8 @@
void Setup() {
MaybeScheduleTimingReports();
if (!skip_logger_) {
- logging::ScopedLogRestorer prev_logger;
log_sender_.Initialize(MakeSender<logging::LogMessageFbs>("/aos"));
- log_impl_ = logging::GetImplementation();
+ log_impl_ = log_sender_.implementation();
}
}
@@ -614,7 +613,7 @@
const pid_t tid_;
AosLogToFbs log_sender_;
- logging::LogImplementation *log_impl_ = nullptr;
+ std::shared_ptr<logging::LogImplementation> log_impl_ = nullptr;
};
void SimulatedEventLoopFactory::set_send_delay(
@@ -720,8 +719,8 @@
const monotonic_clock::time_point monotonic_now =
simulated_event_loop_->monotonic_now();
logging::ScopedLogRestorer prev_logger;
- if (simulated_event_loop_->log_impl_ != nullptr) {
- logging::SetImplementation(simulated_event_loop_->log_impl_);
+ if (simulated_event_loop_->log_impl_) {
+ prev_logger.Swap(simulated_event_loop_->log_impl_);
}
Context context = msgs_.front()->context;
@@ -837,8 +836,8 @@
const ::aos::monotonic_clock::time_point monotonic_now =
simulated_event_loop_->monotonic_now();
logging::ScopedLogRestorer prev_logger;
- if (simulated_event_loop_->log_impl_ != nullptr) {
- logging::SetImplementation(simulated_event_loop_->log_impl_);
+ if (simulated_event_loop_->log_impl_) {
+ prev_logger.Swap(simulated_event_loop_->log_impl_);
}
if (token_ != scheduler_->InvalidToken()) {
scheduler_->Deschedule(token_);
@@ -889,8 +888,8 @@
monotonic_clock::time_point monotonic_now =
simulated_event_loop_->monotonic_now();
logging::ScopedLogRestorer prev_logger;
- if (simulated_event_loop_->log_impl_ != nullptr) {
- logging::SetImplementation(simulated_event_loop_->log_impl_);
+ if (simulated_event_loop_->log_impl_) {
+ prev_logger.Swap(simulated_event_loop_->log_impl_);
}
Call(
[monotonic_now]() { return monotonic_now; },