summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorsmatz <smatz@openttd.org>2011-02-08 18:27:21 +0000
committersmatz <smatz@openttd.org>2011-02-08 18:27:21 +0000
commitb4273bcd35d4d0083dc9bd88a207283b4e3ba014 (patch)
tree80b6912d15868478bcd766083f738c8d197415fd /src
parent7af2470a78d73ac2953a6ed2eb36bca15c03d3e4 (diff)
downloadopenttd-b4273bcd35d4d0083dc9bd88a207283b4e3ba014.tar.xz
(svn r22023) -Fix: verify we can allocate a CargoPacket and CargoPayment before we actually try to do so
-Codechange: increase the limit of number of CargoPayments to match the limit of Vehicles (Rubidium)
Diffstat (limited to 'src')
-rw-r--r--src/cargopacket.cpp7
-rw-r--r--src/economy.cpp4
-rw-r--r--src/economy_base.h4
-rw-r--r--src/station_cmd.cpp4
4 files changed, 16 insertions, 3 deletions
diff --git a/src/cargopacket.cpp b/src/cargopacket.cpp
index 676e408ea..f7d4348f9 100644
--- a/src/cargopacket.cpp
+++ b/src/cargopacket.cpp
@@ -88,10 +88,12 @@ CargoPacket::CargoPacket(uint16 count, byte days_in_transit, StationID source, T
/**
* Split this packet in two and return the split off part.
* @param new_size Size of the remaining part.
- * @return Split off part.
+ * @return Split off part, or NULL if no packet could be allocated!
*/
FORCEINLINE CargoPacket *CargoPacket::Split(uint new_size)
{
+ if (!CargoPacket::CanAllocateItem()) return NULL;
+
Money fs = this->feeder_share * new_size / static_cast<uint>(this->count);
CargoPacket *cp_new = new CargoPacket(new_size, this->days_in_transit, this->source, this->source_xy, this->loaded_at_xy, fs, this->source_type, this->source_id);
this->feeder_share -= fs;
@@ -315,6 +317,9 @@ bool CargoList<Tinst>::MoveTo(Tother_inst *dest, uint max_move, MoveToAction mta
/* But... the rest needs package splitting. */
CargoPacket *cp_new = cp->Split(max_move);
+ /* We could not allocate a CargoPacket? Is the map that full? */
+ if (cp_new == NULL) return false;
+
static_cast<Tinst *>(this)->RemoveFromCache(cp_new); // this reflects the changes in cp.
if (mta == MTA_TRANSFER) {
diff --git a/src/economy.cpp b/src/economy.cpp
index c9e55653a..3d2a419ee 100644
--- a/src/economy.cpp
+++ b/src/economy.cpp
@@ -1093,6 +1093,10 @@ void PrepareUnload(Vehicle *front_v)
}
assert(front_v->cargo_payment == NULL);
+ /* One CargoPayment per vehicle and the vehicle limit equals the
+ * limit in number of CargoPayments. Can't go wrong. */
+ assert_compile(CargoPaymentPool::MAX_SIZE == VehiclePool::MAX_SIZE);
+ assert(CargoPayment::CanAllocateItem());
front_v->cargo_payment = new CargoPayment(front_v);
}
diff --git a/src/economy_base.h b/src/economy_base.h
index 5d7124c1b..edad76ed2 100644
--- a/src/economy_base.h
+++ b/src/economy_base.h
@@ -15,8 +15,8 @@
#include "cargopacket.h"
#include "company_type.h"
-/** Type of pool to store cargo payments in. */
-typedef Pool<CargoPayment, CargoPaymentID, 512, 64000> CargoPaymentPool;
+/** Type of pool to store cargo payments in; little over 1 million. */
+typedef Pool<CargoPayment, CargoPaymentID, 512, 0xFF000> CargoPaymentPool;
/** The actual pool to store cargo payments in. */
extern CargoPaymentPool _cargo_payment_pool;
diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp
index d584b3131..5e72ded7f 100644
--- a/src/station_cmd.cpp
+++ b/src/station_cmd.cpp
@@ -3165,6 +3165,10 @@ void ModifyStationRatingAround(TileIndex tile, Owner owner, int amount, uint rad
static uint UpdateStationWaiting(Station *st, CargoID type, uint amount, SourceType source_type, SourceID source_id)
{
+ /* We can't allocate a CargoPacket? Then don't do anything
+ * at all; i.e. just discard the incoming cargo. */
+ if (!CargoPacket::CanAllocateItem()) return 0;
+
GoodsEntry &ge = st->goods[type];
amount += ge.amount_fract;
ge.amount_fract = GB(amount, 0, 8);