diff options
author | Alice Ryhl <aliceryhl@google.com> | 2024-08-14 10:05:27 +0200 |
---|---|---|
committer | Miguel Ojeda <ojeda@kernel.org> | 2024-08-23 06:26:57 +0200 |
commit | 9078a4f956dbef9366e1657915c883b380e6db39 (patch) | |
tree | 04585d89dfc07092872d4e28da0440acbdf3b207 /include | |
parent | rust: list: add iterators (diff) | |
download | linux-9078a4f956dbef9366e1657915c883b380e6db39.tar.xz linux-9078a4f956dbef9366e1657915c883b380e6db39.zip |
rust: list: add cursor
The cursor is very similar to the list iterator, but it has one
important feature that the iterator doesn't: it can be used to remove
items from the linked list.
This feature cannot be added to the iterator because the references you
get from the iterator are considered borrows of the original list,
rather than borrows of the iterator. This means that there's no way to
prevent code like this:
let item = iter.next();
iter.remove();
use(item);
If `iter` was a cursor instead of an iterator, then `item` will be
considered a borrow of `iter`. Since `remove` destroys `iter`, this
means that the borrow-checker will prevent uses of `item` after the call
to `remove`.
So there is a trade-off between supporting use in traditional for loops,
and supporting removal of elements as you iterate. Iterators and cursors
represents two different choices on that spectrum.
Rust Binder needs cursors for the list of death notifications that a
process is currently handling. When userspace tells Binder that it has
finished processing the death notification, Binder will iterate the list
to search for the relevant item and remove it.
Reviewed-by: Benno Lossin <benno.lossin@proton.me>
Signed-off-by: Alice Ryhl <aliceryhl@google.com>
Link: https://lore.kernel.org/r/20240814-linked-list-v5-8-f5f5e8075da0@google.com
Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
Diffstat (limited to 'include')
0 files changed, 0 insertions, 0 deletions