mirror of
https://github.com/async-rs/async-std.git
synced 2025-04-24 01:06:46 +00:00
Merge pull request #747 from async-rs/fix/scheduler-perf
Fix new scheduler loop
This commit is contained in:
commit
aebba2bd95
1 changed files with 8 additions and 6 deletions
|
@ -249,6 +249,8 @@ impl Machine {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let mut sched = rt.sched.lock().unwrap();
|
||||||
|
|
||||||
// One final check for available tasks while the scheduler is locked.
|
// One final check for available tasks while the scheduler is locked.
|
||||||
if let Some(task) = iter::repeat_with(|| self.find_task(rt))
|
if let Some(task) = iter::repeat_with(|| self.find_task(rt))
|
||||||
.find(|s| !s.is_retry())
|
.find(|s| !s.is_retry())
|
||||||
|
@ -258,19 +260,19 @@ impl Machine {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut sched = rt.sched.lock().unwrap();
|
// If another thread is already blocked on the reactor, there is no point in keeping
|
||||||
|
// the current thread around since there is too little work to do.
|
||||||
if sched.polling {
|
if sched.polling {
|
||||||
thread::sleep(Duration::from_micros(10));
|
break;
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Unlock the schedule poll the reactor until new I/O events arrive.
|
||||||
sched.polling = true;
|
sched.polling = true;
|
||||||
drop(sched);
|
drop(sched);
|
||||||
|
|
||||||
rt.reactor.poll(None).unwrap();
|
rt.reactor.poll(None).unwrap();
|
||||||
|
|
||||||
let mut sched = rt.sched.lock().unwrap();
|
// Lock the scheduler again and re-register the machine.
|
||||||
|
sched = rt.sched.lock().unwrap();
|
||||||
sched.polling = false;
|
sched.polling = false;
|
||||||
|
|
||||||
runs = 0;
|
runs = 0;
|
||||||
|
|
Loading…
Reference in a new issue