#pragma once #include "gp/vfs/system.hpp" namespace gp{ class simple_lockfree_scheduling : gp::scheduling_scheme { gp::topic_list running; gp::topic_list waiting; gp::topic_list to_clean; gp::topic_list naughty; scheduler me; public: virtual gp::topic_list::node_ptr one(size_t) { auto v = running.try_pop(); do{ if(v) return v; v = running.try_pop(); }while(true); } virtual gp::topic_list::node_ptr next(size_t, gp::topic_list::node_ptr current) { switch(current->value->state) { case process_status::inactive: case process_status::running: do{}while(!running.try_push(current)); break; case process_status::finished: do{}while(!to_clean.try_push(current)); break; case process_status::zombie: do{}while(!naughty.try_push(current)); break; case process_status::waiting: do{}while(!waiting.try_push(current)); break; } return one(0); } virtual gp::scheduler& current_scheduler() { return me; } }; }