[OpenMP] Fix hang on Windows
Debug dump on large machine shows when many OpenMP threads (401 in total) sleep on a barrier, one of the innermost nesting levels sleeps on a child's b_arrived flag whose value is equal to 4 and is equal to checker value. i.e., (1) sleep bit is 0, and (2) done_check() would return true if called. It is unclear how this might happen. It could be Windows Server 2016's error of EnterCriticalSection / LeaveCriticalSection, or error of WaitForSingleObject / SetEvent / ResetEvent, or error in the library which is very difficult to find. As a workaround, change INFINITE wait to timed wait, so that each thread awakens each 5 seconds (the timeout was chosen arbitrary to not disturb other threads much), check flag condition under the lock, and either go to sleep again or stop sleeping as a result of the check. Patch by Andrey Churbanov Differential Revision: https://reviews.llvm.org/D59793 llvm-svn: 357722
Loading
Please sign in to comment