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 */