MayaFlux 1.0.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 741 of file Scheduler.cpp.

742{
743 if (m_conditional_pending_count.load(std::memory_order_acquire) == 0)
744 return;
745
746 DrainScope drain_scope(this);
747
748 for (auto& op : m_conditional_pending_ops) {
749 if (!op.active.load(std::memory_order_acquire))
750 continue;
751
752 if (op.is_addition) {
753 auto it = std::ranges::find_if(m_conditional_tasks,
754 [&](const TaskEntry& e) { return e.name == op.entry.name; });
755 if (it != m_conditional_tasks.end()) {
756 if (it->routine && it->routine->is_active())
757 it->routine->set_should_terminate(true);
758 m_conditional_tasks.erase(it);
759 }
760 m_conditional_tasks.push_back(std::move(op.entry));
761 } else {
762 auto it = std::ranges::find_if(m_conditional_tasks,
763 [&](const TaskEntry& e) { return e.name == op.entry.name; });
764 if (it != m_conditional_tasks.end()) {
765 if (it->routine && it->routine->is_active())
766 it->routine->set_should_terminate(true);
767 m_conditional_tasks.erase(it);
768 }
769 }
770
771 op.entry = { nullptr, "" };
772 op.active.store(false, std::memory_order_release);
773 m_conditional_pending_count.fetch_sub(1, std::memory_order_relaxed);
774 }
775}
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: