OpenTTD Source  20241108-master-g80f628063a
linkgraphschedule.h
Go to the documentation of this file.
1 /*
2  * This file is part of OpenTTD.
3  * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
4  * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
5  * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
6  */
7 
10 #ifndef LINKGRAPHSCHEDULE_H
11 #define LINKGRAPHSCHEDULE_H
12 
13 #include "linkgraph.h"
14 
15 class LinkGraphJob;
16 
22 public:
26  virtual ~ComponentHandler() = default;
27 
33  virtual void Run(LinkGraphJob &job) const = 0;
34 };
35 
37 private:
40  typedef std::list<LinkGraph *> GraphList;
41  typedef std::list<LinkGraphJob *> JobList;
43 
44 protected:
45  std::array<std::unique_ptr<ComponentHandler>, 6> handlers{};
46  GraphList schedule;
47  JobList running;
48 
49 public:
50  /* This is a tick where not much else is happening, so a small lag might go unnoticed. */
51  static const uint SPAWN_JOIN_TICK = 21;
53 
54  static void Run(LinkGraphJob *job);
55  static void Clear();
56 
57  void SpawnNext();
58  bool IsJoinWithUnfinishedJobDue() const;
59  void JoinNext();
60  void SpawnAll();
61  void ShiftDates(TimerGameEconomy::Date interval);
62 
67  void Queue(LinkGraph *lg)
68  {
69  assert(LinkGraph::Get(lg->index) == lg);
70  this->schedule.push_back(lg);
71  }
72 
77  void Unqueue(LinkGraph *lg) { this->schedule.remove(lg); }
78 };
79 
82 
83 #endif /* LINKGRAPHSCHEDULE_H */
A handler doing "something" on a link graph component.
virtual ~ComponentHandler()=default
Destroy the handler.
virtual void Run(LinkGraphJob &job) const =0
Run the handler.
Class for calculation jobs to be run on link graphs.
Definition: linkgraphjob.h:29
LinkGraphSchedule()
Create a link graph schedule and initialize its handlers.
GraphList schedule
Queue for new jobs.
void SpawnNext()
Start the next job in the schedule.
static LinkGraphSchedule instance
Static instance of LinkGraphSchedule.
static void Clear()
Clear all link graphs and jobs from the schedule.
void ShiftDates(TimerGameEconomy::Date interval)
Shift all dates (join dates and edge annotations) of link graphs and link graph jobs by the number of...
~LinkGraphSchedule()
Delete a link graph schedule and its handlers.
friend SaveLoadTable GetLinkGraphScheduleDesc()
Get a SaveLoad array for the link graph schedule.
bool IsJoinWithUnfinishedJobDue() const
Check if the next job is supposed to be finished, but has not yet completed.
static const uint SPAWN_JOIN_TICK
Tick when jobs are spawned or joined every day.
void Unqueue(LinkGraph *lg)
Remove a link graph from the execution queue.
void Queue(LinkGraph *lg)
Queue a link graph for execution.
static void Run(LinkGraphJob *job)
Run all handlers for the given Job.
void JoinNext()
Join the next finished job, if available.
std::array< std::unique_ptr< ComponentHandler >, 6 > handlers
Handlers to be run for each job.
JobList running
Currently running jobs.
void SpawnAll()
Start all threads in the running list.
A connected component of a link graph.
Definition: linkgraph.h:37
Declaration of link graph classes used for cargo distribution.
void StateGameLoop_LinkGraphPauseControl()
Pause the game if in 2 TimerGameEconomy::date_fract ticks, we would do a join with the next link grap...
void AfterLoad_LinkGraphPauseControl()
Pause the game on load if we would do a join with the next link graph job, but it is still running,...
std::span< const struct SaveLoad > SaveLoadTable
A table of SaveLoad entries.
Definition: saveload.h:511
Tindex index
Index of this pool item.
Definition: pool_type.hpp:238
static Titem * Get(size_t index)
Returns Titem with given index.
Definition: pool_type.hpp:339