Hi, As already noted[1], LWLocks don't currently work in DSM segments, because they use dlist for the list of waiters. Even though all of the waiter nodes are in PGPROC and therefore have stable addresses, the dlist code internally constructs a circular list including pointers to a special sentinel node inside the dlist_head object, and those pointers may be invalid in other backends.
One solution could be to provide a non-circular variant of the dlist interface that uses NULL list termination. I've attached a quick sketch of something like that which seems to work correctly. It is only lightly tested so far and probably buggy, but shows the general idea. Any thoughts on this approach, or better ways to solve this problem? How valuable is the branch-free property of the circular push and delete operations? [1] https://www.postgresql.org/message-id/ca+tgmobjia49ccj0zazbwavv7nkgyt+1zo5cwxkh9aahgn2...@mail.gmail.com -- Thomas Munro http://www.enterprisedb.com
lwlocks-in-dsm.patch
Description: Binary data
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers