unsigned mt_task_queue::get_default_prio() { if (g_current_task && get_imp(*g_current_task)) { return get_prio(*g_current_task); } else { return 0; } }
bool mt_task_queue::check_deps(gtask const & t) { check_stack("mt_task_queue::check_deps"); lean_always_assert(get_data(t)); buffer<gtask> deps; try { get_data(t)->m_imp->get_dependencies(deps); } catch (...) {} auto prio = get_prio(t); for (auto & dep : deps) { if (dep) { submit_core(dep, prio); bump_prio(dep, prio); } } for (auto & dep : deps) { if (!dep) continue; switch (get_state(dep).load()) { case task_state::Waiting: case task_state::Queued: case task_state::Running: lean_always_assert(get_imp(dep)); get_sched_info(dep).m_reverse_deps.push_back(t); return false; case task_state::Success: break; case task_state::Failed: break; default: lean_unreachable(); } } return true; }
IMP class_getMethodImplementation_stret(Class cls, SEL name) { if (Nil == cls || 0 == name) { return 0; } return (IMP) get_imp(cls, name); }
void mt_task_queue::enqueue(gtask const & t) { lean_always_assert(get_state(t).load() < task_state::Running); lean_always_assert(get_imp(t)); get_state(t) = task_state::Queued; m_queue[get_prio(t)].push_back(t); if (m_required_workers > 0) { spawn_worker(); } else { m_queue_added.notify_one(); } notify_queue_changed(); }