[fpc-devel] Suspicion about TThread.Synchronize
fpc at mfriebe.de
Sat Feb 3 17:39:52 CET 2018
All based on win32
I have an issue with a crash in PopThreadQueueHead called by
It happens in the Lazarus IDE, but at a low percentage only. (And not
yet in the debugger)
I don't think the below is related, but I found it while looking around.
Potential Issue: (3.0.2 and trunk 37936)
I have not looked very deep into the threading internals, so I may have
missed something, but I thought I just bring it up for review.
class procedure TThread.Synchronize(AThread: TThread; AMethod:
contains those lines (outside a CriticalSection):
AThread.FSynchronizeEntry^.Method := Nil;
AThread.FSynchronizeEntry^.Next := Nil; // outside of critical
ThreadQueueAppend will enter a CriticalSection.
It will add the passed in FSynchronizeEntry (param aEntry) to
ThreadQueueHead/Tail. For this it may use another entries Next pointer.
So what happens, if 2 (or more) threads call TThread.Synchronize?
What happens if
- thread 1, has just finished the line
- thread 2 now calls synchronize, and
- as soon as thread1 leaves the CriticalSection in ThreadQueueAppend
=> thread2 enters that CriticalSection
- thread2 adds it entry to the list, assigning it the Next^ of thread
- now thread1 continues, it sets Next^ to nil, removing the reference to
thread 2's entry.
Thread 2 would no longer be in the list.
That also means, if thread 2's entry has a Next^, then this may not be
set to nil, if the entry it points to is removed?
More information about the fpc-devel