forked from ROMEO/nexosim
Simplify task_set & satisfy clippy
This commit is contained in:
parent
b5187ded44
commit
b544bcee92
@ -48,9 +48,9 @@ impl<T: Clone, R> BroadcasterInner<T, R> {
|
|||||||
self.shared.outputs.push(None);
|
self.shared.outputs.push(None);
|
||||||
|
|
||||||
// The storage is alway an empty vector so we just book some capacity.
|
// The storage is alway an empty vector so we just book some capacity.
|
||||||
self.shared.storage.as_mut().map(|s| {
|
if let Some(storage) = self.shared.storage.as_mut() {
|
||||||
let _ = s.try_reserve(self.senders.len());
|
let _ = storage.try_reserve(self.senders.len());
|
||||||
});
|
};
|
||||||
|
|
||||||
line_id
|
line_id
|
||||||
}
|
}
|
||||||
@ -83,6 +83,7 @@ impl<T: Clone, R> BroadcasterInner<T, R> {
|
|||||||
|
|
||||||
/// Return a list of futures broadcasting an event or query to multiple
|
/// Return a list of futures broadcasting an event or query to multiple
|
||||||
/// addresses.
|
/// addresses.
|
||||||
|
#[allow(clippy::type_complexity)]
|
||||||
fn futures(
|
fn futures(
|
||||||
&mut self,
|
&mut self,
|
||||||
arg: T,
|
arg: T,
|
||||||
|
@ -196,60 +196,12 @@ impl TaskSet {
|
|||||||
next: AtomicU32::new(SLEEPING),
|
next: AtomicU32::new(SLEEPING),
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Try to shrink the vector of tasks.
|
// The vector of tasks is never shrunk as this is a fairly costly
|
||||||
//
|
// operation and is not strictly necessary. Typically, inactive tasks
|
||||||
// The main issue when shrinking the vector of tasks is that stale
|
// left at the back of the vector are never waken anyway, and if they
|
||||||
// wakers may still be around and may at any moment be scheduled and
|
// are, they are filtered out by the task iterator.
|
||||||
// insert their task index in the list of scheduled tasks. If it cannot
|
|
||||||
// be guaranteed that this will not happen, then the vector of tasks
|
|
||||||
// cannot be shrunk further, otherwise the iterator for scheduled tasks
|
|
||||||
// will later fail when reaching a task with an invalid index.
|
|
||||||
//
|
|
||||||
// We follow a 2-steps strategy:
|
|
||||||
//
|
|
||||||
// 1) remove all tasks currently in the list of scheduled task and set
|
|
||||||
// them to `SLEEPING` state in case some of them might have an index
|
|
||||||
// that will be invalidated when the vector of tasks is shrunk;
|
|
||||||
//
|
|
||||||
// 2) attempt to iteratively shrink the vector of tasks by removing
|
|
||||||
// tasks starting from the back of the vector:
|
|
||||||
// - If a task is in the `SLEEPING` state, then its `next` pointer is
|
|
||||||
// changed to an arbitrary value other than`SLEEPING`, but the task
|
|
||||||
// is not inserted in the list of scheduled tasks; this way, the
|
|
||||||
// task will be effectively rendered inactive. The task can now be
|
|
||||||
// removed from the vector.
|
|
||||||
// - If a task is found in a non-`SLEEPING` state (meaning that there
|
|
||||||
// was a race and the task was scheduled after step 1) then abandon
|
|
||||||
// further shrinking and leave this task in the vector; the iterator
|
|
||||||
// for scheduled tasks mitigates such situation by only yielding
|
|
||||||
// task indices that are within the expected range.
|
|
||||||
|
|
||||||
// Step 1: unscheduled tasks that may be scheduled.
|
|
||||||
self.discard_scheduled();
|
|
||||||
|
|
||||||
// Step 2: attempt to remove tasks starting at the back of the vector.
|
|
||||||
while self.tasks.len() > len {
|
|
||||||
// There is at least one task since `len()` was non-zero.
|
|
||||||
let task = self.tasks.last().unwrap();
|
|
||||||
|
|
||||||
// Ordering: Relaxed ordering is sufficient since the task is
|
|
||||||
// effectively discarded.
|
|
||||||
if task
|
|
||||||
.next
|
|
||||||
.compare_exchange(SLEEPING, EMPTY, Ordering::Relaxed, Ordering::Relaxed)
|
|
||||||
.is_err()
|
|
||||||
{
|
|
||||||
// The task could not be removed for now so the set of tasks cannot
|
|
||||||
// be shrunk further.
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
self.tasks.pop();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns `true` if one or more sub-tasks are currently scheduled.
|
/// Returns `true` if one or more sub-tasks are currently scheduled.
|
||||||
@ -271,10 +223,6 @@ impl TaskSet {
|
|||||||
|
|
||||||
waker_ref(&self.tasks[idx])
|
waker_ref(&self.tasks[idx])
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn len(&self) -> usize {
|
|
||||||
self.task_count
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Internals shared between a `TaskSet` and its associated `Task`s.
|
/// Internals shared between a `TaskSet` and its associated `Task`s.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user