@@ -248,14 +248,21 @@ bool TaskScheduler::nextTaskReady()
248248 return next_deadline <= now;
249249}
250250
251- uint64_t TaskScheduler::scheduleOnce ( std::function<void (void )> &&fn, millis_t delay_ms, const std::source_location &src_location)
251+ uint64_t TaskScheduler::scheduleOnceNoAlloc (aligned_storage<Task> *task_buffer, std::function<void (void )> &&fn, millis_t delay_ms, const std::source_location &src_location, bool transfer_task_ownership )
252252{
253253 std::lock_guard<std::mutex> lock{this ->task_mutex };
254254 uint64_t task_id = ++last_task_id;
255- tasks.emplace (new Task (std::move (fn), task_id, delay_ms, 0_us, src_location.file_name (), src_location.line (), true ));
255+ Task *ptr = new (task_buffer) Task (std::move (fn), task_id, delay_ms, 0_us, src_location.file_name (), src_location.line (), true );
256+ ptr->owned = transfer_task_ownership;
257+ tasks.emplace (ptr);
256258 return task_id;
257259}
258260
261+ uint64_t TaskScheduler::scheduleOnce (std::function<void (void )> &&fn, millis_t delay_ms, const std::source_location &src_location)
262+ {
263+ return this ->scheduleOnceNoAlloc (new aligned_storage<Task>, std::move (fn), delay_ms, src_location, true );
264+ }
265+
259266uint64_t TaskScheduler::scheduleWithFixedDelay (std::function<void (void )> &&fn, millis_t first_delay_ms, millis_t delay_ms, const std::source_location &src_location)
260267{
261268 std::lock_guard<std::mutex> lock{this ->task_mutex };
@@ -268,7 +275,9 @@ uint64_t TaskScheduler::scheduleUncancelable(std::function<void(void)> &&fn, mil
268275{
269276 std::lock_guard<std::mutex> lock{this ->task_mutex };
270277 uint64_t task_id = ++last_task_id | (1ull << 62ull );
271- tasks.emplace (perm_new<Task>(DRAM , std::move (fn), task_id, first_delay_ms, delay_ms, src_location.file_name (), src_location.line (), false ));
278+ auto *task = perm_new<Task>(DRAM , std::move (fn), task_id, first_delay_ms, delay_ms, src_location.file_name (), src_location.line (), false );
279+ task->owned = false ;
280+ tasks.emplace (task);
272281 return task_id;
273282}
274283
0 commit comments