> On Jun 21, 2018, at 8:03 AM, Pavel Labath via Phabricator 
> <revi...@reviews.llvm.org> wrote:
> 
> labath added a comment.
> 
> In https://reviews.llvm.org/D48393#1139270, @clayborg wrote:
> 
>> In https://reviews.llvm.org/D48393#1138989, @labath wrote:
>> 
>>> I am not sure this will actually solve the problems you are seeing. This 
>>> may avoid corrupting the internal DenseMap data structures, but it will not 
>>> make the algorithm using them actually correct.
>>> For example the pattern in `ParseTypeFromDWARF` is:
>>> 
>>> 1. check the "already parsed map". If the DIE is already parsed then you're 
>>> done.
>>> 2. if the map contains the magic "DIE_IS_BEING_PARSED" key, abort 
>>> (recursive dwarf references)
>>> 3. otherwise, insert the  "DIE_IS_BEING_PARSED" key into the map
>>> 4. do the parsing, which potentially involves recursive 
>>> `ParseTypeFromDWARF` calls
>>> 5. insert the parsed type into the map
>>> 
>>>  What you do is make each of the steps (1), (3), (5) atomic individually. 
>>> However, the whole algorithm is not correct unless the whole sequence is 
>>> atomic as a whole. Otherwise, if you have two threads trying to parse the 
>>> same DIE (directly or indirectly), one of them could see the intermediate 
>>> DIE_IS_BEING_PARSED and incorrectly assume that it encountered recursive 
>>> types.
>> 
>> 
>> We need to make #1 atomic.
>> #2 would need to somehow know if the type is already being parsed 
>> recursively by the current thread. If so, then do what we do now. If not, we 
>> need a way to wait on the completion of this type so the other parsing 
>> thread can complete it and put it into the map, at which time we grab the 
>> right value from the map
>> So #6 step would need to be added so after we do put it into the map, we can 
>> notify other threads that might be waiting
> 
> 
> It's even more complicated than that, in case you really have reference 
> cycles, you can have multiple threads starting parsing from different points 
> in that cycle, and getting deadlocked waiting for the DIE_IS_BEING_PARSED 
> results from each other.
> 
> The only sane algorithm I can come up right now is to make the list of parsed 
> dies local to each thread/parsing entity (e.g. via a "visited" list), and 
> only update the global map once the parsing has completed (successfully or 
> not). This can potentially duplicate some effort where one thread parses a 
> type only to find out that it has already been parsed, but hopefully that is 
> not going to be the common case. The alternative is some complicated resource 
> cycle detection scheme.

Doh, that sounds like what I just tried to describe in my other mail. I should 
read threads completely before replying.

Fred 
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to