• Alice Ryhl's avatar
    rust: list: add cursor · 9078a4f9
    Alice Ryhl authored
    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: default avatarBenno Lossin <benno.lossin@proton.me>
    Signed-off-by: default avatarAlice Ryhl <aliceryhl@google.com>
    Link: https://lore.kernel.org/r/20240814-linked-list-v5-8-f5f5e8075da0@google.comSigned-off-by: default avatarMiguel Ojeda <ojeda@kernel.org>
    9078a4f9
list.rs 24.5 KB