Advertisement
Guest User

Untitled

a guest
Apr 1st, 2020
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.00 KB | None | 0 0
  1. void Scheduler::RunLoop() {
  2. while (!run_queue_.IsEmpty() || !sleep_queue_.IsEmpty()) {
  3. if (!sleep_queue_.IsEmpty()) {
  4. SleepyFiber next_sleepy = sleep_queue_.GetTopFiber();
  5. if (std::chrono::steady_clock::now() >= next_sleepy.expected_time_) {
  6. next_sleepy.fiber_->SetState(FiberState::Runnable);
  7. Schedule(next_sleepy.fiber_);
  8. sleep_queue_.PopTopFiber();
  9. }
  10. }
  11. if (!run_queue_.IsEmpty()) {
  12. Fiber* next = run_queue_.PopFront();
  13. SwitchTo(next);
  14. Reschedule(next);
  15. }
  16. if (run_queue_.IsEmpty() && !sleep_queue_.IsEmpty()) {
  17. SleepyFiber next_sleepy = sleep_queue_.GetTopFiber();
  18. auto sleep_time =
  19. next_sleepy.expected_time_ - std::chrono::steady_clock::now();
  20. if (next_sleepy.expected_time_ - sleep_time <
  21. next_sleepy.expected_time_) {
  22. std::this_thread::sleep_for(next_sleepy.expected_time_ -
  23. std::chrono::steady_clock::now());
  24. }
  25. }
  26. }
  27. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement