Fix subsystem-remove bug
This commit is contained in:
@@ -455,7 +455,7 @@ SGSubsystemGroup::set_subsystem (const string &name, SGSubsystem * subsystem,
|
|||||||
subsystem->set_group(this);
|
subsystem->set_group(this);
|
||||||
notifyDidChange(subsystem, State::ADD);
|
notifyDidChange(subsystem, State::ADD);
|
||||||
|
|
||||||
if (_state != State::INVALID) {
|
if (_state != State::INVALID && (_state <= State::POSTINIT)) {
|
||||||
// transition to the correct state
|
// transition to the correct state
|
||||||
if (_state >= State::BIND) {
|
if (_state >= State::BIND) {
|
||||||
notifyWillChange(subsystem, State::BIND);
|
notifyWillChange(subsystem, State::BIND);
|
||||||
@@ -469,7 +469,7 @@ SGSubsystemGroup::set_subsystem (const string &name, SGSubsystem * subsystem,
|
|||||||
notifyDidChange(subsystem, State::INIT);
|
notifyDidChange(subsystem, State::INIT);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_state >= State::POSTINIT) {
|
if (_state == State::POSTINIT) {
|
||||||
notifyWillChange(subsystem, State::POSTINIT);
|
notifyWillChange(subsystem, State::POSTINIT);
|
||||||
subsystem->postinit();
|
subsystem->postinit();
|
||||||
notifyDidChange(subsystem, State::POSTINIT);
|
notifyDidChange(subsystem, State::POSTINIT);
|
||||||
@@ -515,13 +515,13 @@ SGSubsystemGroup::remove_subsystem(const string &name)
|
|||||||
|
|
||||||
if (_state != State::INVALID) {
|
if (_state != State::INVALID) {
|
||||||
// transition out correctly
|
// transition out correctly
|
||||||
if (_state >= State::INIT) {
|
if ((_state >= State::INIT) && (_state < State::SHUTDOWN)) {
|
||||||
notifyWillChange(sub, State::SHUTDOWN);
|
notifyWillChange(sub, State::SHUTDOWN);
|
||||||
sub->shutdown();
|
sub->shutdown();
|
||||||
notifyDidChange(sub, State::SHUTDOWN);
|
notifyDidChange(sub, State::SHUTDOWN);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_state >= State::BIND) {
|
if ((_state >= State::BIND) && (_state < State::UNBIND)) {
|
||||||
notifyWillChange(sub, State::UNBIND);
|
notifyWillChange(sub, State::UNBIND);
|
||||||
sub->unbind();
|
sub->unbind();
|
||||||
notifyDidChange(sub, State::UNBIND);
|
notifyDidChange(sub, State::UNBIND);
|
||||||
|
|||||||
@@ -301,6 +301,10 @@ public:
|
|||||||
/// get the parent group of this subsystem
|
/// get the parent group of this subsystem
|
||||||
SGSubsystemGroup* get_group() const;
|
SGSubsystemGroup* get_group() const;
|
||||||
|
|
||||||
|
// ordering here is exceptionally important, due to
|
||||||
|
// liveness of ranges. If you're extending this consider
|
||||||
|
// carefully where the new state lies and position it correctly.
|
||||||
|
// Also extend the tests to ensure you handle all cases.
|
||||||
enum class State {
|
enum class State {
|
||||||
INVALID = -1,
|
INVALID = -1,
|
||||||
ADD = 0,
|
ADD = 0,
|
||||||
@@ -310,8 +314,8 @@ public:
|
|||||||
REINIT,
|
REINIT,
|
||||||
SUSPEND,
|
SUSPEND,
|
||||||
RESUME,
|
RESUME,
|
||||||
UNBIND,
|
|
||||||
SHUTDOWN,
|
SHUTDOWN,
|
||||||
|
UNBIND,
|
||||||
REMOVE
|
REMOVE
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -451,6 +451,11 @@ void testAddRemoveAfterInit()
|
|||||||
auto radio1 = manager->createInstance<FakeRadioSub>("nav1");
|
auto radio1 = manager->createInstance<FakeRadioSub>("nav1");
|
||||||
group->set_subsystem(radio1);
|
group->set_subsystem(radio1);
|
||||||
|
|
||||||
|
auto com1 = manager->createInstance<FakeRadioSub>("com1");
|
||||||
|
group->set_subsystem(com1);
|
||||||
|
auto com2 = manager->createInstance<FakeRadioSub>("com2");
|
||||||
|
group->set_subsystem(com2);
|
||||||
|
|
||||||
manager->bind();
|
manager->bind();
|
||||||
manager->init();
|
manager->init();
|
||||||
|
|
||||||
@@ -473,8 +478,34 @@ void testAddRemoveAfterInit()
|
|||||||
SG_VERIFY(d->hasEvent("fake-radio.nav1-will-remove"));
|
SG_VERIFY(d->hasEvent("fake-radio.nav1-will-remove"));
|
||||||
SG_VERIFY(d->hasEvent("fake-radio.nav1-did-remove"));
|
SG_VERIFY(d->hasEvent("fake-radio.nav1-did-remove"));
|
||||||
|
|
||||||
|
manager->shutdown();
|
||||||
|
|
||||||
|
SG_VERIFY(d->hasEvent("fake-radio.nav2-will-shutdown"));
|
||||||
|
SG_VERIFY(d->hasEvent("fake-radio.nav2-did-shutdown"));
|
||||||
|
SG_VERIFY(d->hasEvent("fake-radio.com1-will-shutdown"));
|
||||||
|
SG_VERIFY(d->hasEvent("fake-radio.com1-did-shutdown"));
|
||||||
|
|
||||||
|
d->events.clear();
|
||||||
|
|
||||||
|
ok = manager->remove("fake-radio.com1");
|
||||||
|
SG_VERIFY(d->hasEvent("fake-radio.com1-will-remove"));
|
||||||
|
SG_VERIFY(d->hasEvent("fake-radio.com1-did-remove"));
|
||||||
|
SG_VERIFY(d->hasEvent("fake-radio.com1-will-unbind"));
|
||||||
|
SG_VERIFY(d->hasEvent("fake-radio.com1-did-unbind"));
|
||||||
|
SG_VERIFY(!d->hasEvent("fake-radio.com1-will-shutdown"));
|
||||||
|
SG_VERIFY(!d->hasEvent("fake-radio.com1-did-shutdown"));
|
||||||
|
|
||||||
|
manager->unbind();
|
||||||
|
|
||||||
|
SG_VERIFY(d->hasEvent("fake-radio.com2-will-unbind"));
|
||||||
|
SG_VERIFY(d->hasEvent("fake-radio.com2-did-unbind"));
|
||||||
|
|
||||||
|
d->events.clear();
|
||||||
|
manager->remove("fake-radio.com2");
|
||||||
|
SG_VERIFY(!d->hasEvent("fake-radio.com2-will-unbind"));
|
||||||
|
SG_VERIFY(!d->hasEvent("fake-radio.com2-did-unbind"));
|
||||||
|
SG_VERIFY(d->hasEvent("fake-radio.com2-will-remove"));
|
||||||
|
SG_VERIFY(d->hasEvent("fake-radio.com2-did-remove"));
|
||||||
}
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|||||||
Reference in New Issue
Block a user