refactor(#2500): skip the empty acquire for fully re-entrant nodes
When every resource dep of a node re-enters an ancestor's lock, `owned_reqs` is empty; the old code still called `acquire(vec![])` and stored a no-op empty guard in `owned`. Gate the acquire + guard insertion on `!owned_reqs.is_empty()` — one fewer `borrow_mut` + `HashMap` entry per fully-re-entrant node in the settle loop. `node_owns` already treats a missing `owned` entry as non-owning, so behaviour is unchanged.
This commit is contained in:
parent
144912f8e0
commit
02167caf60
1 changed files with 11 additions and 6 deletions
|
|
@ -125,12 +125,17 @@ impl<N, R: Clone + Eq + Hash> Scheduler<N, R> {
|
|||
owned_reqs.push((name, count));
|
||||
}
|
||||
}
|
||||
// Owned units are all-or-nothing; borrow slots were all confirmed free
|
||||
// above, so this is the only fallible step. Nothing mutated until here.
|
||||
let Some(guard) = self.resources.acquire(owned_reqs) else {
|
||||
return false;
|
||||
};
|
||||
self.owned.entry(id).or_default().push(guard);
|
||||
// Owned units (if any) are all-or-nothing; borrow slots were all
|
||||
// confirmed free above, so acquiring them is the only fallible step.
|
||||
// Nothing is mutated until here. Skip the acquire + guard entirely when
|
||||
// every dep was re-entrant (no owned units): an empty guard would just
|
||||
// be a no-op `Drop` plus a wasted `owned` entry.
|
||||
if !owned_reqs.is_empty() {
|
||||
let Some(guard) = self.resources.acquire(owned_reqs) else {
|
||||
return false;
|
||||
};
|
||||
self.owned.entry(id).or_default().push(guard);
|
||||
}
|
||||
for slot in borrows {
|
||||
self.borrow_slots.insert(slot, id);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue