News for hackers. Stuff that matters.
Re:Zig's new LinkedList API (it's time to learn fieldParentPtr) by Diggsey on Monday April 14, 2025 @09:09AM (#43680885)
They are definitely more error-prone usage patterns, and coming from Rust the amount of hidden unsafety is quite unsettling (in addition to the obvious potential for user errors, depending on the aliasing model of your language/compiler, which I suspect Zig hasn't figured out yet, this parent pointer trick could even lead to miscompilations...)

Having said that, intrusive linked lists are quite an important data structure in code which is required to be allocation-free. Kernel code, signal handlers and code which requires consistent performance (eg. audio processing) need to be able to move objects between containers or have objects in multiple containers without allocating.

Re:Zig's new LinkedList API (it's time to learn fieldParentPtr) by rowanG077 on Monday April 14, 2025 @09:40AM (#43681163)
Use a separate data structure and then index into it with a linked list like API. No need to do something so dangerous if you simply need an allocation less linked list interface.

But yes there is a place for these data structures. It just shouldn't be common.

Re:Zig's new LinkedList API (it's time to learn fieldParentPtr) by Diggsey on Monday April 14, 2025 @11:35AM (#43682475)
If you just mean using array indexes instead of pointers, that can work in some cases, but can run into concurrency issues when the container needs to be resized. With pointers to nodes, new nodes can be allocated and old nodes freed on a separate thread without interfering with the performance sensitive thread, whereas resizing an array requires all access to stop while the backing memory is re-allocated.

I don't think you mean this, but elaborating on why a non-intrusive linked list is not very useful, that's because it takes linear time to find an object in a non-intrusive linked list, but constant time in an intrusive linked list.

For example:

    struct Node {
        Node* prev_by_last_update;
        Node* next_by_last_update;
        Node* prev_with_owner;
        Node* next_with_owner;
        Payload data;
    }
This intrusive structure allows reassigning and updating nodes, whilst being able to efficiently find eg. the next most recently updated node, or to iterate over nodes with the same owner.
Re:Zig's new LinkedList API (it's time to learn fieldParentPtr) by bananabiscuit on Monday April 14, 2025 @09:37AM (#43681133)
Do you mean you will likely make an error when implementing a standard textbook linked list? Or that a standard textbook linked list has non-obvious errors in its design? If so, would be curious to learn more.
Re:Zig's new LinkedList API (it's time to learn fieldParentPtr) by simonask on Monday April 14, 2025 @11:28AM (#43682370)
Most programmers can implement a linked list.

Extremely few can use one safely.

They're an elegant weapon for a more civilized age - namely one without multithreading, aliasing-based optimization, and a host of other nice things.

Re:Zig's new LinkedList API (it's time to learn fieldParentPtr) by tauoverpi on Monday April 14, 2025 @05:21PM (#43686457)
Multithreading is exactly where linked lists are useful as in the implementation of MPSC, MPMC, SPMC, and so on it allows one to safely construct objects out of vire of other threads then use a CAS to append the new item to the list making it visible for other threads to consume even without needing to allocate additional memory.

They're also pretty useful for free-list structures which overwrite entries to be removed (they're scheduled for deletion thus assumptiong here is that the object is now dead) with linked list nodes that would fit in that space thus never needing to allocate any additional as you can reuse existing space.

Re:Zig's new LinkedList API (it's time to learn fieldParentPtr) by simonask on Tuesday April 15, 2025 @03:24PM (#43697317)
Yeah, wait-free data structures often contain linked lists. That doesn’t cancel out all of the other problems.

Anecdotally, I’ve seen wait-free structures used incorrectly many more times than I’ve seen them used correctly. Some people think they are magically faster because “acquiring a mutex lock is expensive”, but that’s far from always the case.

Re:Zig's new LinkedList API (it's time to learn fieldParentPtr) by mgaunard on Friday April 18, 2025 @04:51PM (#43731756)
a CAS-loop, as suggested in the message you're replying to, is certainly not wait-free, only lock-free.
Re:Zig's new LinkedList API (it's time to learn fieldParentPtr) by simonask on Thursday April 24, 2025 @10:32AM (#43783295)
Thanks, my mistake. :-)
Re:Zig's new LinkedList API (it's time to learn fieldParentPtr) by codr7 on Wednesday April 16, 2025 @08:30AM (#43704549)
I don't see a problem with their safety, even in C.

More the opposite, their simplicity makes them safer to deal with than the alternatives. And sometimes their unique features (mostly the intrusive variant) are exactly what you need.

Multi-threaded accesses to a vector would be just as bad?

Re:Zig's new LinkedList API (it's time to learn fieldParentPtr) by im3w1l on Monday April 14, 2025 @10:16AM (#43681588)
Implementing anything is more error prone than using something battle-tested.
Re:Zig's new LinkedList API (it's time to learn fieldParentPtr) by throwawaymaths on Monday April 14, 2025 @01:07PM (#43683482)
Maybe advocate for wrappers in the stdlib to implement typesafe. LL, typesafe extrusive LL, etc. Using this as a primitive?