diff options
author | frosch <frosch@openttd.org> | 2015-03-07 18:27:01 +0000 |
---|---|---|
committer | frosch <frosch@openttd.org> | 2015-03-07 18:27:01 +0000 |
commit | 780e5959331b39eda19868126af41398a904818b (patch) | |
tree | e2d592a1b2ec24af7ae1190c9ef970289b2e8e03 /src/station_cmd.cpp | |
parent | e77de936366fd4a0773386b8bdbe5bd6da354c89 (diff) | |
download | openttd-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.cpp | 15 |
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 { |