Skip to content

Commit

Permalink
Revert "rt: reduce no-op wakeups in the multi-threaded scheduler (tok…
Browse files Browse the repository at this point in the history
…io-rs#4383)"

This reverts commit 4eed411.
  • Loading branch information
manaswini05 committed Jul 26, 2022
1 parent 0dc62da commit 156772f
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 18 deletions.
16 changes: 6 additions & 10 deletions tokio/src/runtime/thread_pool/idle.rs
Expand Up @@ -64,7 +64,7 @@ impl Idle {

// A worker should be woken up, atomically increment the number of
// searching workers as well as the number of unparked workers.
State::unpark_one(&self.state, 1);
State::unpark_one(&self.state);

// Get the worker to unpark
let ret = sleepers.pop();
Expand Down Expand Up @@ -111,23 +111,19 @@ impl Idle {

/// Unpark a specific worker. This happens if tasks are submitted from
/// within the worker's park routine.
///
/// Returns `true` if the worker was parked before calling the method.
pub(super) fn unpark_worker_by_id(&self, worker_id: usize) -> bool {
pub(super) fn unpark_worker_by_id(&self, worker_id: usize) {
let mut sleepers = self.sleepers.lock();

for index in 0..sleepers.len() {
if sleepers[index] == worker_id {
sleepers.swap_remove(index);

// Update the state accordingly while the lock is held.
State::unpark_one(&self.state, 0);
State::unpark_one(&self.state);

return true;
return;
}
}

false
}

/// Returns `true` if `worker_id` is contained in the sleep set.
Expand Down Expand Up @@ -155,8 +151,8 @@ impl State {
State(cell.load(ordering))
}

fn unpark_one(cell: &AtomicUsize, num_searching: usize) {
cell.fetch_add(num_searching | (1 << UNPARK_SHIFT), SeqCst);
fn unpark_one(cell: &AtomicUsize) {
cell.fetch_add(1 | (1 << UNPARK_SHIFT), SeqCst);
}

fn inc_num_searching(cell: &AtomicUsize, ordering: Ordering) {
Expand Down
12 changes: 4 additions & 8 deletions tokio/src/runtime/thread_pool/worker.rs
Expand Up @@ -537,9 +537,8 @@ impl Context {
// Place `park` back in `core`
core.park = Some(park);

// If there are tasks available to steal, but this worker is not
// looking for tasks to steal, notify another worker.
if !core.is_searching && core.run_queue.is_stealable() {
// If there are tasks available to steal, notify a worker
if core.run_queue.is_stealable() {
self.worker.shared.notify_parked();
}

Expand Down Expand Up @@ -651,11 +650,8 @@ impl Core {
// If a task is in the lifo slot, then we must unpark regardless of
// being notified
if self.lifo_slot.is_some() {
// When a worker wakes, it should only transition to the "searching"
// state when the wake originates from another worker *or* a new task
// is pushed. We do *not* want the worker to transition to "searching"
// when it wakes when the I/O driver receives new events.
self.is_searching = !worker.shared.idle.unpark_worker_by_id(worker.index);
worker.shared.idle.unpark_worker_by_id(worker.index);
self.is_searching = true;
return true;
}

Expand Down

0 comments on commit 156772f

Please sign in to comment.