diff options
author | Jonathan G Rennison <j.g.rennison@gmail.com> | 2019-01-22 18:31:08 +0000 |
---|---|---|
committer | Patric Stout <github@truebrain.nl> | 2020-12-22 15:17:57 +0100 |
commit | 0c5dc5d41eff0ac0a62dd67882a718bb3c99ec3a (patch) | |
tree | ae5c1cb8322cd28fa627f942fb93d59f5029cfe3 /src/linkgraph/linkgraphjob.h | |
parent | 9a45a0f535e312cd97db12c3a2ec1068fa381136 (diff) | |
download | openttd-0c5dc5d41eff0ac0a62dd67882a718bb3c99ec3a.tar.xz |
Change: [Linkgraph] Pause the game when linkgraph jobs lag (#6470)
Check if the job is still running two date fract ticks before it is due
to join, and if so pause the game until its done.
When loading a game, check if the game would block immediately due to
a job which is scheduled to be joined within two date fract ticks,
and if so pause the game until its done.
This avoids the main thread being blocked on a thread join, which appears
to the user as if the game is unresponsive, as the UI does not repaint
and cannot be interacted with.
Show if pause is due to link graph job in status bar, update network
messages.
This does not apply for network clients.
Diffstat (limited to 'src/linkgraph/linkgraphjob.h')
-rw-r--r-- | src/linkgraph/linkgraphjob.h | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/src/linkgraph/linkgraphjob.h b/src/linkgraph/linkgraphjob.h index cd7ece4b1..ab5e07fb1 100644 --- a/src/linkgraph/linkgraphjob.h +++ b/src/linkgraph/linkgraphjob.h @@ -13,6 +13,7 @@ #include "../thread.h" #include "linkgraph.h" #include <list> +#include <atomic> class LinkGraphJob; class Path; @@ -61,6 +62,7 @@ protected: Date join_date; ///< Date when the job is to be joined. NodeAnnotationVector nodes; ///< Extra node data necessary for link graph calculation. EdgeAnnotationMatrix edges; ///< Extra edge data necessary for link graph calculation. + std::atomic<bool> job_completed; ///< Is the job still running. This is accessed by multiple threads and reads may be stale. void EraseFlows(NodeID from); void JoinThread(); @@ -265,7 +267,7 @@ public: * settings have to be brutally const-casted in order to populate them. */ LinkGraphJob() : settings(_settings_game.linkgraph), - join_date(INVALID_DATE) {} + join_date(INVALID_DATE), job_completed(false) {} LinkGraphJob(const LinkGraph &orig); ~LinkGraphJob(); @@ -273,10 +275,17 @@ public: void Init(); /** + * Check if job has actually finished. + * This is allowed to spuriously return an incorrect value. + * @return True if job has actually finished. + */ + inline bool IsJobCompleted() const { return this->job_completed.load(std::memory_order_acquire); } + + /** * Check if job is supposed to be finished. * @return True if job should be finished by now, false if not. */ - inline bool IsFinished() const { return this->join_date <= _date; } + inline bool IsScheduledToBeJoined() const { return this->join_date <= _date; } /** * Get the date when the job should be finished. |