-
-
Notifications
You must be signed in to change notification settings - Fork 4.1k
Use SlotMap
s to store systems and system sets in Schedule
s
#19352
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Your PR increases Bevy Minimum Supported Rust Version. Please update the |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Well done! I like how this improved type safety here and there!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, the extra type safety is really nice!
I left some thoughts, but nothing blocking.
Good stuff :) I'm looking forward to progress on dynamic system scheduling after all these years <3 |
# Objective Make the schedule graph code more understandable, and replace some panics with `Result`s. I found the `check_edges` and `check_hierarchy` functions [a little confusing](#19352 (comment)), as they combined two concerns: Initializing graph nodes for system sets, and checking for self-edges on system sets. It was hard to understand the self-edge checks because it wasn't clear what `NodeId` was being checked against! So, let's separate those concerns, and move them to more appropriate locations. Fix a bug where `schedule.configure_sets((SameSet, SameSet).chain());` would panic with an unhelpful message: `assertion failed: index_a < index_b`. ## Solution Remove the `check_edges` and `check_hierarchy` functions, separating the initialization behavior and the checking behavior and moving them where they are easier to understand. For initializing graph nodes, do this on-demand using the `entry` API by replacing later `self.system_set_ids[&set]` calls with a `self.system_sets.get_or_add_set(set)` method. This should avoid the need for an extra pass over the graph and an extra lookup. Unfortunately, implementing that method directly on `ScheduleGraph` leads to borrowing errors as it borrows the entire `struct`. So, split out the collections managing system sets into a separate `struct`. For checking self-edges, move this check later so that it can be reported by returning a `Result` from `Schedule::initialize` instead of having to panic in `configure_set_inner`. The issue was that `iter_sccs` does not report self-edges as cycles, since the resulting components only have one node, but that later code assumes all edges point forward. So, check for self-edges directly, immediately before calling `iter_sccs`. This also ensures we catch *every* way that self-edges can be added. The previous code missed an edge case where `chain()`ing a set to itself would create a self-edge and would trigger a `debug_assert`.
Objective
Solution
Makes the necessary internal data structure changes in order to allow system removal to be added in a future PR:
Vec
s storing systems and system sets inScheduleGraph
have been replaced withSlotMap
s.See the included migration guide for the required changes.
Testing
Internal changes only and no new features should mean no new tests are requried.