-
Notifications
You must be signed in to change notification settings - Fork 631
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
fix FuturesOrdered #2664
fix FuturesOrdered #2664
Conversation
Thanks for the PR! Considering the overflow of isize (which can actually happen on 32-bit targets), this still seems broken, but this seems more correct than the current one. |
Yeah. I have some ideas how to fix the overflow too, but it's not as trivial a fix Essentially, if the next_outgoing_index has the MSB set, then it flips the MSB of every task/output. This preserves the order and ensures that the outgoing is <= Reason this is correctLet's say our system is 16-bit. So we can have a theoretical maximum memory of 65536 bytes. Our futures are `[(usize, F)]` which is at least 2 bytes assuming ZST future. Our ready queue similarly stores `[(usize, F::Output)]` which is also at least 2 bytes with a ZST output.In total, we can only fit 65536/2 entries into memory, ignoring any extra necessary overhead. Therefore, we only need to be able to store at maximum In our
If our head gets over half way through our usize, then to store our theoretical maximum, tail can be at most usize::MAX+1, which is 0. We can't insert any more without OOM as shown, so this index is never read or compared against. Since all other indices must be It should be possible to implement here too, but it might not be super efficient with the task linked list |
Thanks! Opened #2689 to track overflow issue. |
This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [futures](https://rust-lang.github.io/futures-rs) ([source](https://github.com/rust-lang/futures-rs)) | dependencies | patch | `0.3.25` -> `0.3.26` | --- ### Release Notes <details> <summary>rust-lang/futures-rs</summary> ### [`v0.3.26`](https://github.com/rust-lang/futures-rs/blob/HEAD/CHANGELOG.md#​0326---2023-01-30) [Compare Source](rust-lang/futures-rs@0.3.25...0.3.26) - Add `Either::as_pin_mut` and `Either::as_pin_ref` ([#​2691](rust-lang/futures-rs#2691)) - Add `Shared::ptr_eq` and `Shared::ptr_hash` ([#​2691](rust-lang/futures-rs#2691)) - Implement `FusedStream` for `Buffered` ([#​2676](rust-lang/futures-rs#2676)) - Implement `FusedStream` for all streams in `ReadyChunks` ([#​2693](rust-lang/futures-rs#2693)) - Fix bug in `FuturesOrdered::push_front` ([#​2664](rust-lang/futures-rs#2664)) - Remove `Fut::Output: Clone` bounds from some `Shared` methods ([#​2662](rust-lang/futures-rs#2662)) - Remove `T: Debug` bounds from `Debug` implementations of `mpsc` and `oneshot` types ([#​2666](rust-lang/futures-rs#2666), [#​2667](rust-lang/futures-rs#2667)) </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNC4xMTYuMSIsInVwZGF0ZWRJblZlciI6IjM0LjExOS4yIn0=--> Co-authored-by: cabr2-bot <[email protected]> Reviewed-on: https://codeberg.org/Calciumdibromid/CaBr2/pulls/1762 Reviewed-by: crapStone <[email protected]> Co-authored-by: Calciumdibromid Bot <[email protected]> Co-committed-by: Calciumdibromid Bot <[email protected]>
fixes #2663