diff options
author | rubidium <rubidium@openttd.org> | 2011-02-19 18:02:17 +0000 |
---|---|---|
committer | rubidium <rubidium@openttd.org> | 2011-02-19 18:02:17 +0000 |
commit | 68bc93f95074702fde2876904198f585969201cc (patch) | |
tree | d4e944285ebe4ed2ea5bc068c1b854fbb5f95a4e | |
parent | f575b45bae4b84ad734541cdd59b794352f6c0c7 (diff) | |
download | openttd-68bc93f95074702fde2876904198f585969201cc.tar.xz |
(svn r22111) -Codechange/fix-ish: upon cleaning a pool a destructor should not delete items from other pools
-rw-r--r-- | src/cargopacket.cpp | 10 | ||||
-rw-r--r-- | src/cargopacket.h | 2 | ||||
-rw-r--r-- | src/station.cpp | 7 | ||||
-rw-r--r-- | src/vehicle.cpp | 5 |
4 files changed, 22 insertions, 2 deletions
diff --git a/src/cargopacket.cpp b/src/cargopacket.cpp index f7d4348f9..012ae78f5 100644 --- a/src/cargopacket.cpp +++ b/src/cargopacket.cpp @@ -155,6 +155,16 @@ CargoList<Tinst>::~CargoList() } /** + * Empty the cargo list, but don't free the cargo packets; + * the cargo packets are cleaned by CargoPacket's CleanPool. + */ +template <class Tinst> +void CargoList<Tinst>::OnCleanPool() +{ + this->packets.clear(); +} + +/** * Update the cached values to reflect the removal of this packet. * Decreases count and days_in_transit. * @param cp Packet to be removed from cache. diff --git a/src/cargopacket.h b/src/cargopacket.h index 72465d90d..063896476 100644 --- a/src/cargopacket.h +++ b/src/cargopacket.h @@ -197,6 +197,8 @@ public: ~CargoList(); + void OnCleanPool(); + /** * Returns a pointer to the cargo packet list (so you can iterate over it etc). * @return Pointer to the packet list. diff --git a/src/station.cpp b/src/station.cpp index 9f59d72f8..8933015f8 100644 --- a/src/station.cpp +++ b/src/station.cpp @@ -70,7 +70,12 @@ Station::Station(TileIndex tile) : */ Station::~Station() { - if (CleaningPool()) return; + if (CleaningPool()) { + for (CargoID c = 0; c < NUM_CARGO; c++) { + this->goods[c].cargo.OnCleanPool(); + } + return; + } while (!this->loading_vehicles.empty()) { this->loading_vehicles.front()->LeaveStation(); diff --git a/src/vehicle.cpp b/src/vehicle.cpp index ec78d8f42..573610c6d 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -736,7 +736,10 @@ Vehicle::~Vehicle() { free(this->name); - if (CleaningPool()) return; + if (CleaningPool()) { + this->cargo.OnCleanPool(); + return; + } /* sometimes, eg. for disaster vehicles, when company bankrupts, when removing crashed/flooded vehicles, * it may happen that vehicle chain is deleted when visible */ |