diff --git a/src/client.cpp b/src/client.cpp index 6f3112c..cc0656a 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -211,7 +211,8 @@ Context::Pvt::Pvt(const Config& conf) ,tcp_loop("PVXCTCP", epicsThreadPriorityCAServerLow) ,searchRx(event_new(tcp_loop.base, searchTx.sock, EV_READ|EV_PERSIST, &Pvt::onSearchS, this)) ,searchTimer(event_new(tcp_loop.base, -1, EV_TIMEOUT, &Pvt::tickSearchS, this)) - ,beaconCleaner(event_new(tcp_loop.base, -1, EV_TIMEOUT, &Pvt::tickBeaconCleanS, this)) + ,manager(UDPManager::instance()) + ,beaconCleaner(event_new(manager.loop().base, -1, EV_TIMEOUT, &Pvt::tickBeaconCleanS, this)) { effective.expand(); @@ -271,8 +272,6 @@ Context::Pvt::Pvt(const Config& conf) searchDest.emplace_back(saddr, isucast); } - auto manager = UDPManager::instance(); - for(auto& iface : effective.interfaces) { SockAddr addr(AF_INET, iface.c_str(), effective.udp_port); log_info_printf(io, "Listening for beacons on %s\n", addr.tostring().c_str()); @@ -289,7 +288,7 @@ Context::Pvt::Pvt(const Config& conf) log_err_printf(setup, "Error enabling search timer\n%s", ""); if(event_add(searchRx.get(), nullptr)) log_err_printf(setup, "Error enabling search RX\n%s", ""); - if(event_add(searchTimer.get(), &beaconCleanInterval)) + if(event_add(beaconCleaner.get(), &beaconCleanInterval)) log_err_printf(setup, "Error enabling beacon clean timer on\n%s", ""); } @@ -645,7 +644,7 @@ void Context::Pvt::tickBeaconClean() } } - if(event_add(searchTimer.get(), &beaconCleanInterval)) + if(event_add(beaconCleaner.get(), &beaconCleanInterval)) log_err_printf(setup, "Error re-enabling beacon clean timer on\n%s", ""); } diff --git a/src/clientimpl.h b/src/clientimpl.h index 36fe437..79c54e9 100644 --- a/src/clientimpl.h +++ b/src/clientimpl.h @@ -162,12 +162,6 @@ struct Context::Pvt std::list > beaconRx; - struct BTrack { - std::array guid; - epicsTimeStamp lastRx; - }; - std::map beaconSenders; - std::map> chanByCID; std::map> chanByName; @@ -176,6 +170,17 @@ struct Context::Pvt evbase tcp_loop; const evevent searchRx; const evevent searchTimer; + + struct BTrack { + std::array guid; + epicsTimeStamp lastRx; + }; + std::map beaconSenders; + + // beacon handling done on UDP worker. + // we keep a ref here as long as beaconCleaner is in use + UDPManager manager; + const evevent beaconCleaner; Pvt(const Config& conf); diff --git a/src/udp_collector.cpp b/src/udp_collector.cpp index be79d7c..24d88b4 100644 --- a/src/udp_collector.cpp +++ b/src/udp_collector.cpp @@ -290,6 +290,14 @@ static struct udp_gbl_t { UDPManager::~UDPManager() {} +evbase& UDPManager::loop() +{ + if(!pvt) + throw std::logic_error("NULL UDPManager"); + + return pvt->loop; +} + namespace { epicsThreadOnceId collector_once = EPICS_THREAD_ONCE_INIT; void collector_init(void *unused) diff --git a/src/udp_collector.h b/src/udp_collector.h index 9c312fd..d7e04d7 100644 --- a/src/udp_collector.h +++ b/src/udp_collector.h @@ -29,6 +29,8 @@ struct PVXS_API UDPManager static void cleanup(); ~UDPManager(); + evbase& loop(); + struct Beacon { SockAddr& src; SockAddr server;