summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2011-02-19 18:02:17 +0000
committerrubidium <rubidium@openttd.org>2011-02-19 18:02:17 +0000
commit68bc93f95074702fde2876904198f585969201cc (patch)
treed4e944285ebe4ed2ea5bc068c1b854fbb5f95a4e
parentf575b45bae4b84ad734541cdd59b794352f6c0c7 (diff)
downloadopenttd-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.cpp10
-rw-r--r--src/cargopacket.h2
-rw-r--r--src/station.cpp7
-rw-r--r--src/vehicle.cpp5
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 */