40 if (
not thread_.joinable()) {
45 if (std::this_thread::get_id() == thread_.get_id()) {
55 std::lock_guard lock(jobLock_);
63 const char* filename,
uint32_t linum)
65 std::lock_guard lock(jobLock_);
66 auto now = clock::now();
67 jobs_[
now].emplace_back(std::move(job), filename, linum);
73 const char* filename,
uint32_t linum)
75 auto ret = std::make_shared<Task>(std::move(job), filename, linum);
82 const char* filename,
uint32_t linum)
84 return schedule(std::move(job), clock::now() +
dt,
88std::shared_ptr<RepeatedTask>
91 const char* filename,
uint32_t linum)
93 auto ret = std::make_shared<RepeatedTask>(std::move(job), filename, linum);
94 reschedule(
ret, clock::now(),
dt);
99ScheduledExecutor::reschedule(std::shared_ptr<RepeatedTask>
task, time_point t, duration
dt)
101 const char* filename =
task->job().filename;
104 if (
task->run(name_.c_str()))
105 reschedule(std::move(
task), t +
dt,
dt);
113 const char* filename =
task->job().filename;
115 std::lock_guard lock(jobLock_);
116 jobs_[t].emplace_back([
task = std::move(
task),
this] {
task->run(name_.c_str()); },
122ScheduledExecutor::loop()
124 std::vector<Job>
jobs;
126 std::unique_lock lock(jobLock_);
127 while (*running_
and (jobs_.empty()
or jobs_.begin()->first > clock::now())) {
131 auto nextJob = jobs_.begin()->first;
137 jobs = std::move(jobs_.begin()->second);
138 jobs_.erase(jobs_.begin());
140 for (
auto& job :
jobs) {
143 }
catch (
const std::exception&
e) {
144 JAMI_ERR(
"Exception running job: %s",
e.what());
std::shared_ptr< Task > scheduleIn(std::function< void()> &&job, duration dt, const char *filename=CURRENT_FILENAME(), uint32_t linum=CURRENT_LINE())
Schedule job to be run after delay dt.
ScheduledExecutor(const std::string &name_)
clock::time_point time_point
void stop()
Stop the scheduler, it is unable to be reversed.
std::shared_ptr< RepeatedTask > scheduleAtFixedRate(std::function< bool()> &&job, duration dt, const char *filename=CURRENT_FILENAME(), uint32_t linum=CURRENT_LINE())
Schedule job to be run every dt, starting now.
std::shared_ptr< Task > schedule(std::function< void()> &&job, time_point t, const char *filename=CURRENT_FILENAME(), uint32_t linum=CURRENT_LINE())
Schedule job to be run at time t.
void run(std::function< void()> &&job, const char *filename=CURRENT_FILENAME(), uint32_t linum=CURRENT_LINE())
Schedule job to be run ASAP.
void emitSignal(Args... args)
std::atomic< uint64_t > task_cookie