summaryrefslogtreecommitdiff
path: root/src/station_cmd.cpp
diff options
context:
space:
mode:
authorfrosch <frosch@openttd.org>2015-03-07 18:27:01 +0000
committerfrosch <frosch@openttd.org>2015-03-07 18:27:01 +0000
commit780e5959331b39eda19868126af41398a904818b (patch)
treee2d592a1b2ec24af7ae1190c9ef970289b2e8e03 /src/station_cmd.cpp
parente77de936366fd4a0773386b8bdbe5bd6da354c89 (diff)
downloadopenttd-780e5959331b39eda19868126af41398a904818b.tar.xz
(svn r27178) -Fix [FS#5969]: Data race due to lazy initialisation of objects.
Diffstat (limited to 'src/station_cmd.cpp')
-rw-r--r--src/station_cmd.cpp15
1 files changed, 11 insertions, 4 deletions
diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp
index 0d8236ddc..37b553f1a 100644
--- a/src/station_cmd.cpp
+++ b/src/station_cmd.cpp
@@ -59,6 +59,13 @@
#include "safeguards.h"
/**
+ * Static instance of FlowStat::SharesMap.
+ * Note: This instance is created on task start.
+ * Lazy creation on first usage results in a data race between the CDist threads.
+ */
+/* static */ const FlowStat::SharesMap FlowStat::empty_sharesmap;
+
+/**
* Check whether the given tile is a hangar.
* @param t the tile to of whether it is a hangar.
* @pre IsTileType(t, MP_STATION)
@@ -3536,7 +3543,7 @@ void IncreaseStats(Station *st, CargoID cargo, StationID next_station_id, uint c
if (ge2.link_graph == INVALID_LINK_GRAPH) {
if (LinkGraph::CanAllocateItem()) {
lg = new LinkGraph(cargo);
- LinkGraphSchedule::Instance()->Queue(lg);
+ LinkGraphSchedule::instance.Queue(lg);
ge2.link_graph = lg->index;
ge2.node = lg->AddNode(st2);
} else {
@@ -3558,11 +3565,11 @@ void IncreaseStats(Station *st, CargoID cargo, StationID next_station_id, uint c
if (ge1.link_graph != ge2.link_graph) {
LinkGraph *lg2 = LinkGraph::Get(ge2.link_graph);
if (lg->Size() < lg2->Size()) {
- LinkGraphSchedule::Instance()->Unqueue(lg);
+ LinkGraphSchedule::instance.Unqueue(lg);
lg2->Merge(lg); // Updates GoodsEntries of lg
lg = lg2;
} else {
- LinkGraphSchedule::Instance()->Unqueue(lg2);
+ LinkGraphSchedule::instance.Unqueue(lg2);
lg->Merge(lg2); // Updates GoodsEntries of lg2
}
}
@@ -3684,7 +3691,7 @@ static uint UpdateStationWaiting(Station *st, CargoID type, uint amount, SourceT
if (ge.link_graph == INVALID_LINK_GRAPH) {
if (LinkGraph::CanAllocateItem()) {
lg = new LinkGraph(type);
- LinkGraphSchedule::Instance()->Queue(lg);
+ LinkGraphSchedule::instance.Queue(lg);
ge.link_graph = lg->index;
ge.node = lg->AddNode(st);
} else {