Berserk
Scheduler.hpp
Go to the documentation of this file.
1 /**********************************************************************************/
2 /* This file is part of Berserk Engine project */
3 /* https://github.com/EgorOrachyov/Berserk */
4 /**********************************************************************************/
5 /* MIT License */
6 /* */
7 /* Copyright (c) 2018 - 2021 Egor Orachyov */
8 /* */
9 /* Permission is hereby granted, free of charge, to any person obtaining a copy */
10 /* of this software and associated documentation files (the "Software"), to deal */
11 /* in the Software without restriction, including without limitation the rights */
12 /* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell */
13 /* copies of the Software, and to permit persons to whom the Software is */
14 /* furnished to do so, subject to the following conditions: */
15 /* */
16 /* The above copyright notice and this permission notice shall be included in all */
17 /* copies or substantial portions of the Software. */
18 /* */
19 /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR */
20 /* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, */
21 /* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE */
22 /* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER */
23 /* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, */
24 /* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE */
25 /* SOFTWARE. */
26 /**********************************************************************************/
27 
28 #ifndef BERSERK_SCHEDULER_HPP
29 #define BERSERK_SCHEDULER_HPP
30 
31 #include <core/Config.hpp>
32 #include <core/Typedefs.hpp>
33 
34 #include <functional>
35 #include <mutex>
36 #include <unordered_map>
37 #include <vector>
38 
40 
59 class Scheduler final {
60 public:
62  using ScheduledFunc = std::function<void(float)>;
64  using PerformFunc = std::function<void()>;
66  using Handle = size_t;
68  static const uint32 REPEAT_FOREVER = 0x7fffffff;
69 
89  BRK_API Handle Schedule(ScheduledFunc func, float interval, uint32 repeat = 0, float delay = 0.0f, bool paused = false);
90 
106  BRK_API Handle ScheduleOnce(ScheduledFunc func, float delay, bool paused = false);
107 
126  BRK_API Handle ScheduleUpdate(ScheduledFunc func, uint32 repeat = 0, float delay = 0.0f, bool paused = false);
127 
137 
145  BRK_API void Cancel(Handle handle);
146 
154  BRK_API void Pause(Handle handle);
155 
163  BRK_API void Resume(Handle handle);
164 
165 private:
166  friend class Engine;
167 
169  struct Scheduled {
170  float elapsed = 0.0f;
171  float interval = 0.0f;
172  float delay = 0.0f;
173  uint32 repeat = 0;
174  uint32 executed = 0;
175  bool paused = false;
176  bool forever = false;
177  bool update = false;
178  bool delayed = false;
179  ScheduledFunc callback;
180  };
181 
182  void Update(float dt);
183  bool Exhausted(Scheduled &scheduled) const;
184  Handle GetNext();
185 
186 private:
188  std::unordered_map<Handle, Scheduled> mScheduled;
189 
191  std::vector<Handle> mPendingRemove;
193  std::vector<std::pair<Handle, Scheduled>> mPendingAdd;
195  std::vector<std::pair<Handle, bool>> mPendingPause;
196 
198  std::vector<PerformFunc> mToPerform;
199  std::vector<PerformFunc> mToPerformExec;
200  mutable std::mutex mMutex;
201 
203  Handle mNextHandle = 0;
204 
206  float mTimeScale = 1.0f;
207 };
208 
214 
215 #endif//BERSERK_SCHEDULER_HPP
#define BRK_NS_END
Definition: Config.hpp:48
#define BRK_API
Definition: Config.hpp:32
std::size_t size_t
Definition: Typedefs.hpp:49
std::uint32_t uint32
Definition: Typedefs.hpp:44
Root manager class.
Definition: Engine.hpp:72
Scheduler is responsible for triggering the scheduled callbacks.
Definition: Scheduler.hpp:59
BRK_API void Cancel(Handle handle)
Unschedule function associated with specified handle.
Definition: Scheduler.cpp:93
size_t Handle
Definition: Scheduler.hpp:66
BRK_API Handle ScheduleOnce(ScheduledFunc func, float delay, bool paused=false)
Schedule function for execution on game thread.
Definition: Scheduler.cpp:55
static const uint32 REPEAT_FOREVER
Definition: Scheduler.hpp:68
std::function< void(float)> ScheduledFunc
Definition: Scheduler.hpp:62
std::function< void()> PerformFunc
Definition: Scheduler.hpp:64
BRK_API void Resume(Handle handle)
Resume scheduling of function associated with specified handle.
Definition: Scheduler.cpp:101
BRK_API void ScheduleOnGameThread(PerformFunc func)
Schedule function to perform exactly on the game thread.
Definition: Scheduler.cpp:88
BRK_API Handle ScheduleUpdate(ScheduledFunc func, uint32 repeat=0, float delay=0.0f, bool paused=false)
Schedule function for execution on game thread.
Definition: Scheduler.cpp:70
BRK_API Handle Schedule(ScheduledFunc func, float interval, uint32 repeat=0, float delay=0.0f, bool paused=false)
Schedule function for execution on game thread.
Definition: Scheduler.cpp:36
BRK_API void Pause(Handle handle)
Pause scheduling of function associated with specified handle.
Definition: Scheduler.cpp:97
Definition: GLDevice.cpp:46