MayaFlux 0.5.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches

◆ drain_conditional_pending()

void MayaFlux::Vruta::TaskScheduler::drain_conditional_pending ( )
private

Drain pending conditional task operations before processing.

Similar to drain_pending_tasks, but specifically for conditional tasks that may have been added or removed while the conditional processing thread is running.

Definition at line 615 of file Scheduler.cpp.

616{
617 if (m_conditional_pending_count.load(std::memory_order_acquire) == 0)
618 return;
619
620 for (auto& op : m_conditional_pending_ops) {
621 if (!op.active.load(std::memory_order_acquire))
622 continue;
623
624 if (op.is_addition) {
625 auto it = std::ranges::find_if(m_conditional_tasks,
626 [&](const TaskEntry& e) { return e.name == op.entry.name; });
627 if (it != m_conditional_tasks.end()) {
628 if (it->routine && it->routine->is_active())
629 it->routine->set_should_terminate(true);
630 m_conditional_tasks.erase(it);
631 }
632 m_conditional_tasks.push_back(std::move(op.entry));
633 } else {
634 auto it = std::ranges::find_if(m_conditional_tasks,
635 [&](const TaskEntry& e) { return e.name == op.entry.name; });
636 if (it != m_conditional_tasks.end()) {
637 if (it->routine && it->routine->is_active())
638 it->routine->set_should_terminate(true);
639 m_conditional_tasks.erase(it);
640 }
641 }
642
643 op.entry = { nullptr, "" };
644 op.active.store(false, std::memory_order_release);
645 m_conditional_pending_count.fetch_sub(1, std::memory_order_relaxed);
646 }
647}
std::atomic< uint32_t > m_conditional_pending_count
std::vector< TaskEntry > m_conditional_tasks
PendingTaskOp m_conditional_pending_ops[MAX_PENDING_CONDITIONAL]

References m_conditional_pending_count, m_conditional_pending_ops, m_conditional_tasks, and MayaFlux::Vruta::TaskEntry::name.

Referenced by pump_conditional(), and terminate_all_tasks().

+ Here is the caller graph for this function: