On Mon, 27 Mar 2023 02:46:31 GMT, David Holmes <dhol...@openjdk.org> wrote:
> > AFAIU, these places now could get outdated information from the contains > > function: either getting a false positive or a false negative when asking > > for a given object. But if I understand correctly, this had been the case > > before, too. Since the information about ownership may be outdated as soon > > as one read the BasicLock* address from the markwork. So these APIs do only > > report a state that once had been, but never the current state. > > Sure but my concern is not stale data, it is whether the lock-stack code may > crash (or otherwise misbehave) if there are concurrent changes to it whilst > it is being queried. Lockstack is a fixed sized array of oop with a ptr-sized member indicating the current offset. It is embedded into Thread. Modifying the LockStack (push, pop, remove) is non-atomic: write the element, then update the current offset. The contains function - the only function not only called from current thread (and we should assert that) - reads current offset, then iterates the whole array up to offset, comparing each oop with the given one. The only way I see this crashing is if we read the current offset in a half-written state. Not sure if any of our platforms read/write a pointer-sized field non-atomic. All other misreads - would "just" result in a time window where contains() gives the wrong answer. So we should read the offset atomically. Alternatively, have a second contains(), e.g. `contains_full()`, just for the sake of concurrent iteration, and let that one iterate the whole stack incl. unused slots. Iteration limits would be hardcoded offsets from Thread*, no need to read offset. The obvious disadvantage would be that we'd need to mark/zero out popped slots in release builds. ------------- PR Comment: https://git.openjdk.org/jdk/pull/10907#issuecomment-1484583227