From fb64e29c6c86bbd22ac7a589de9b4a3b51f31ed5 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Tue, 16 Mar 2021 03:23:00 +0000 Subject: [PATCH] Fix assertion failure when command triggers PBS tunnel/bridge unreserve In the case where the signal update buffer is not currently empty --- src/pbs.cpp | 4 +++- src/signal.cpp | 12 ++++++++++++ src/signal_func.h | 1 + 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/pbs.cpp b/src/pbs.cpp index 44123c6105..589ca63fb3 100644 --- a/src/pbs.cpp +++ b/src/pbs.cpp @@ -241,7 +241,9 @@ void UnreserveRailTrack(TileIndex tile, Track t) if (IsTunnelBridgePBS(tile)) { SetTunnelBridgeExitSignalState(tile, SIGNAL_STATE_RED); } else { - UpdateSignalsOnSegment(tile, INVALID_DIAGDIR, GetTileOwner(tile)); + UpdateSignalsInBufferIfOwnerNotAddable(GetTileOwner(tile)); + AddSideToSignalBuffer(tile, INVALID_DIAGDIR, GetTileOwner(tile)); + UpdateSignalsInBuffer(); } } MarkBridgeOrTunnelDirtyOnReservationChange(tile, VMDF_NOT_MAP_MODE); diff --git a/src/signal.cpp b/src/signal.cpp index e5584ca0a8..ef52a32807 100644 --- a/src/signal.cpp +++ b/src/signal.cpp @@ -735,6 +735,18 @@ void UpdateSignalsInBuffer() } } +/** + * Update signals in buffer if the owner could not be added to the current buffer + * Called from 'outside' + */ +void UpdateSignalsInBufferIfOwnerNotAddable(Owner owner) +{ + if (!_globset.IsEmpty() && !IsOneSignalBlock(owner, _last_owner)) { + UpdateSignalsInBuffer(_last_owner); + _last_owner = INVALID_OWNER; // invalidate + } +} + /** * Add track to signal update buffer diff --git a/src/signal_func.h b/src/signal_func.h index 04baf24dac..4655f8aa5f 100644 --- a/src/signal_func.h +++ b/src/signal_func.h @@ -152,5 +152,6 @@ void SetSignalsOnBothDir(TileIndex tile, Track track, Owner owner); void AddTrackToSignalBuffer(TileIndex tile, Track track, Owner owner); void AddSideToSignalBuffer(TileIndex tile, DiagDirection side, Owner owner); void UpdateSignalsInBuffer(); +void UpdateSignalsInBufferIfOwnerNotAddable(Owner owner); #endif /* SIGNAL_FUNC_H */