87 lines
2.2 KiB
C++
87 lines
2.2 KiB
C++
/*
|
|
Copyright (c) 2016 Microsoft Corporation. All rights reserved.
|
|
Released under Apache 2.0 license as described in the file LICENSE.
|
|
|
|
Author: Gabriel Ebner
|
|
*/
|
|
#pragma once
|
|
#include <deque>
|
|
#include <vector>
|
|
#include <unordered_set>
|
|
#include <map>
|
|
#include <functional>
|
|
#include "util/task.h"
|
|
|
|
namespace lean {
|
|
|
|
#if defined(LEAN_MULTI_THREAD)
|
|
|
|
class mt_task_queue : public task_queue {
|
|
mutex m_mutex;
|
|
std::map<unsigned, std::deque<gtask>> m_queue;
|
|
std::unordered_set<gtask> m_waiting;
|
|
condition_variable m_queue_added, m_queue_changed;
|
|
void notify_queue_changed();
|
|
|
|
bool m_shutting_down = false;
|
|
condition_variable m_shut_down_cv;
|
|
|
|
struct worker_info {
|
|
std::unique_ptr<lthread> m_thread;
|
|
gtask m_current_task;
|
|
};
|
|
std::vector<std::shared_ptr<worker_info>> m_workers;
|
|
void spawn_worker();
|
|
|
|
unsigned m_sleeping_workers = 0;
|
|
int m_required_workers;
|
|
condition_variable m_wake_up_worker;
|
|
|
|
gtask dequeue();
|
|
void enqueue(gtask const &);
|
|
|
|
bool check_deps(gtask const &);
|
|
void submit_core(gtask const &, unsigned);
|
|
void bump_prio(gtask const &, unsigned);
|
|
void cancel_core(gtask const &);
|
|
bool empty_core();
|
|
|
|
void handle_finished(gtask const &);
|
|
|
|
struct mt_sched_info : public scheduling_info {
|
|
unsigned m_prio;
|
|
std::vector<gtask> m_reverse_deps;
|
|
std::shared_ptr<condition_variable> m_has_finished;
|
|
|
|
mt_sched_info(unsigned prio) : m_prio(prio) {}
|
|
|
|
template <class Fn> void wait(unique_lock<mutex> &, Fn &&);
|
|
void notify();
|
|
};
|
|
mt_sched_info & get_sched_info(gtask const & t) {
|
|
return static_cast<mt_sched_info &>(*get_data(t)->m_sched_info);
|
|
}
|
|
|
|
unsigned & get_prio(gtask const & t) { return get_sched_info(t).m_prio; }
|
|
gtask_imp * get_imp(gtask const & t) { return get_data(t)->m_imp.get(); }
|
|
|
|
unsigned get_default_prio();
|
|
|
|
public:
|
|
mt_task_queue(unsigned num_workers);
|
|
~mt_task_queue();
|
|
|
|
void wait_for_finish(gtask const & t) override;
|
|
void fail_and_dispose(gtask const &t) override;
|
|
|
|
void submit(gtask const & t, unsigned prio) override;
|
|
void submit(gtask const & t) override;
|
|
|
|
void evacuate() override;
|
|
|
|
void join() override;
|
|
};
|
|
|
|
#endif
|
|
|
|
}
|