MayaFlux 0.4.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 623 of file Scheduler.cpp.

624{
625 if (m_conditional_pending_count.load(std::memory_order_acquire) == 0)
626 return;
627
628 for (auto& op : m_conditional_pending_ops) {
629 if (!op.active.load(std::memory_order_acquire))
630 continue;
631
632 if (op.is_addition) {
633 auto it = std::ranges::find_if(m_conditional_tasks,
634 [&](const TaskEntry& e) { return e.name == op.entry.name; });
635 if (it != m_conditional_tasks.end()) {
636 if (it->routine && it->routine->is_active())
637 it->routine->set_should_terminate(true);
638 m_conditional_tasks.erase(it);
639 }
640 m_conditional_tasks.push_back(std::move(op.entry));
641 } else {
642 auto it = std::ranges::find_if(m_conditional_tasks,
643 [&](const TaskEntry& e) { return e.name == op.entry.name; });
644 if (it != m_conditional_tasks.end()) {
645 if (it->routine && it->routine->is_active())
646 it->routine->set_should_terminate(true);
647 m_conditional_tasks.erase(it);
648 }
649 }
650
651 op.entry = { nullptr, "" };
652 op.active.store(false, std::memory_order_release);
653 m_conditional_pending_count.fetch_sub(1, std::memory_order_relaxed);
654 }
655}
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: