Skip to content
Snippets Groups Projects
Commit 5bcb1d5c authored by Avi Kivity's avatar Avi Kivity
Browse files

sched: wait_for() support for predicates


Allow arbitrary predicates to be waited on.

Signed-off-by: default avatarAvi Kivity <avi@cloudius-systems.com>
parent d125e4a2
No related branches found
No related tags found
No related merge requests found
......@@ -641,6 +641,31 @@ bool preemptable() __attribute__((no_instrument_function));
thread* current();
// wait_for() support for predicates
//
template <typename Pred>
class predicate_wait_object {
public:
predicate_wait_object(Pred pred, mutex* mtx = nullptr) : _pred(pred) {}
void arm() {}
void disarm() {}
bool poll() { return _pred(); }
private:
Pred _pred;
};
// only instantiate wait_object<Pred> if Pred is indeed a predicate
template <typename Pred>
class wait_object
: public std::enable_if<std::is_same<bool, decltype((*static_cast<Pred*>(nullptr))())>::value,
predicate_wait_object<Pred>>::type
{
using predicate_wait_object<Pred>::predicate_wait_object;
// all contents from predicate_wait_object<>
};
class wait_guard {
public:
wait_guard(thread* t) : _t(t) { t->prepare_wait(); }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment