summaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorAlice Ryhl <aliceryhl@google.com>2024-08-14 10:05:27 +0200
committerMiguel Ojeda <ojeda@kernel.org>2024-08-23 06:26:57 +0200
commit9078a4f956dbef9366e1657915c883b380e6db39 (patch)
tree04585d89dfc07092872d4e28da0440acbdf3b207 /include
parentrust: list: add iterators (diff)
downloadlinux-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