# HG changeset patch # User smatz # Date 2011-02-08 18:27:21 # Node ID b5e141ad8e0041020107d530886bf33933412479 # Parent d3411816d0792870acaf87fb4d8b6526ebb3e1b5 (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) diff --git a/src/cargopacket.cpp b/src/cargopacket.cpp --- a/src/cargopacket.cpp +++ b/src/cargopacket.cpp @@ -88,10 +88,12 @@ CargoPacket::CargoPacket(uint16 count, b /** * 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(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::MoveTo(Tother_ins /* 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(this)->RemoveFromCache(cp_new); // this reflects the changes in cp. if (mta == MTA_TRANSFER) { diff --git a/src/economy.cpp b/src/economy.cpp --- 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 --- 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 CargoPaymentPool; +/** Type of pool to store cargo payments in; little over 1 million. */ +typedef Pool 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 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -3165,6 +3165,10 @@ void ModifyStationRatingAround(TileIndex 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);