From 8464ef48e832857b4214411ebc14f3deeabc04dd Mon Sep 17 00:00:00 2001 From: Richard Harrison Date: Sun, 2 May 2021 17:34:33 +0200 Subject: [PATCH] Fixes #2579 Emesary segfault on reset. Need to call OnDeregister before the object is deleted (because not using smart pointers for receivers). --- simgear/emesary/IReceiver.hxx | 3 ++- simgear/emesary/Transmitter.hxx | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/simgear/emesary/IReceiver.hxx b/simgear/emesary/IReceiver.hxx index b5197517..6318d01b 100644 --- a/simgear/emesary/IReceiver.hxx +++ b/simgear/emesary/IReceiver.hxx @@ -38,7 +38,8 @@ namespace simgear { } - /// Called when de-registered at a transmitter + /// Called when de-registered at a transmitter; i.e. as a result of + /// Transmitter::DeRegister. virtual void OnDeRegisteredAtTransmitter(class Transmitter *p) { } diff --git a/simgear/emesary/Transmitter.hxx b/simgear/emesary/Transmitter.hxx index d51fe7ed..a5feface 100644 --- a/simgear/emesary/Transmitter.hxx +++ b/simgear/emesary/Transmitter.hxx @@ -89,7 +89,9 @@ namespace simgear } } - // Removes an object from receving message from this transmitter + /// Removes an object from receving message from this transmitter. + /// NOTES: OnDeRegisteredAtTransmitter will be called as a result of this method + /// If recipient is in the list of new recipients it will be removed from that list virtual void DeRegister(IReceiverPtr r) { std::lock_guard scopeLock(_lock); @@ -102,6 +104,7 @@ namespace simgear new_recipient_list.erase(location); } deleted_recipient_list.push_back(r); + r->OnDeRegisteredAtTransmitter(this); pendingDeletions++; } @@ -125,7 +128,6 @@ namespace simgear RecipientList::iterator location = std::find(recipient_list.begin(), recipient_list.end(), r); if (location != recipient_list.end()) { - r->OnDeRegisteredAtTransmitter(this); recipient_list.erase(location); } });