Explicitly delete can fds in CanLogger
Signed-off-by: Maxwell Henderson <mxwhenderson@gmail.com>
Change-Id: I1a80fcca8e226dcfa010369a2d8cf68d8bfad1ce
diff --git a/frc971/can_logger/can_logger.cc b/frc971/can_logger/can_logger.cc
index d7c2df7..cfc3dd8 100644
--- a/frc971/can_logger/can_logger.cc
+++ b/frc971/can_logger/can_logger.cc
@@ -5,10 +5,11 @@
CanLogger::CanLogger(aos::ShmEventLoop *event_loop,
std::string_view channel_name,
std::string_view interface_name)
- : fd_(socket(PF_CAN, SOCK_RAW | SOCK_NONBLOCK, CAN_RAW)),
- frames_sender_(event_loop->MakeSender<CanFrame>(channel_name)) {
+ : shm_event_loop_(event_loop),
+ fd_(socket(PF_CAN, SOCK_RAW | SOCK_NONBLOCK, CAN_RAW)),
+ frames_sender_(shm_event_loop_->MakeSender<CanFrame>(channel_name)) {
// TOOD(max): Figure out a proper priority
- event_loop->SetRuntimeRealtimePriority(10);
+ shm_event_loop_->SetRuntimeRealtimePriority(10);
struct ifreq ifr;
strcpy(ifr.ifr_name, interface_name.data());
PCHECK(ioctl(fd_.get(), SIOCGIFINDEX, &ifr) == 0)
@@ -34,7 +35,7 @@
CHECK_EQ(opt_size, sizeof(recieve_buffer_size));
VLOG(0) << "CAN recieve bufffer is " << recieve_buffer_size << " bytes large";
- event_loop->epoll()->OnReadable(fd_.get(), [this]() { Poll(); });
+ shm_event_loop_->epoll()->OnReadable(fd_.get(), [this]() { Poll(); });
}
void CanLogger::Poll() {
diff --git a/frc971/can_logger/can_logger.h b/frc971/can_logger/can_logger.h
index a144265..6bad877 100644
--- a/frc971/can_logger/can_logger.h
+++ b/frc971/can_logger/can_logger.h
@@ -33,6 +33,8 @@
CanLogger(const CanLogger &) = delete;
CanLogger &operator=(const CanLogger &) = delete;
+ ~CanLogger() { shm_event_loop_->epoll()->DeleteFd(fd_.get()); }
+
private:
void Poll();
@@ -40,6 +42,7 @@
// Returns true if successful and false if the recieve buffer is empty.
bool ReadFrame();
+ aos::ShmEventLoop *shm_event_loop_;
aos::ScopedFD fd_;
aos::Sender<CanFrame> frames_sender_;
};