<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/59226>59226</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[flang][OpenMP] IO bug in multi-threaded program
</td>
</tr>
<tr>
<th>Labels</th>
<td>
flang:runtime
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
PeixinQiao
</td>
</tr>
</table>
<pre>
```fortran
$ cat m.f90
Module test
private
public ESMF_TimeGet
type, public :: e_time
integer :: year, month, dayofmonth, hour, minute, second
end type
contains
subroutine ESMF_TimeGet(time, timeString)
type(e_time) :: time
character (len=*), intent(out), optional :: timeString
integer :: year, month, dayofmonth, hour, minute, second
year = time%year
month = time%month
dayofmonth = time%dayofmonth
hour = time%hour
minute = time%minute
second = time%second
if (present(timeString)) then
CALL ESMFold_TimeGetString( year, month, dayofmonth, &
hour, minute, second, timeString )
endif
end subroutine ESMF_TimeGet
subroutine ESMFold_TimeGetString( year, month, dayofmonth, &
hour, minute, second, TimeString)
integer, intent(in) :: year
integer, intent(in) :: month
integer, intent(in) :: dayofmonth
integer, intent(in) :: hour
integer, intent(in) :: minute
integer, intent(in) :: second
character*(*), intent(out) :: TimeString
write(TimeString,FMT="(I4.4,'-',I2.2,'-',I2.2,'_',I2.2,':',I2.2,':',I2.2)") &
year,month,dayofmonth,hour,minute,second
end subroutine ESMFold_TimeGetString
end
$ cat test.f90
program main
use test
call foo(10)
contains
subroutine foo(n)
type(e_time) :: t = e_time(2022, 10, 30, 03, 30, 20)
character(100) :: s
integer :: n
!$omp parallel
!$omp do
do i = 1, n
call ESMF_TimeGet(t, s)
print *, s
enddo
!$omp end do
!$omp end parallel
end
end
```
```
$ gfortran m.f90 test.f90 -fopenmp && ./a.out
2022-10-30_03:30:20
2022-10-30_03:30:20
2022-10-30_03:30:20
2022-10-30_03:30:20
2022-10-30_03:30:20
2022-10-30_03:30:20
2022-10-30_03:30:20
2022-10-30_03:30:20
2022-10-30_03:30:20
2022-10-30_03:30:20
$ export OMP_NUM_THREADS=1
$ flang-new -flang-experimental-exec m.f90 test.f90 -fopenmp && ./a.out
2022-10-30_03:30:20
2022-10-30_03:30:20
2022-10-30_03:30:20
2022-10-30_03:30:20
2022-10-30_03:30:20
2022-10-30_03:30:20
2022-10-30_03:30:20
2022-10-30_03:30:20
2022-10-30_03:30:20
2022-10-30_03:30:20
$ export OMP_NUM_THREADS=2
$ flang-new -flang-experimental-exec m.f90 test.f90 -fopenmp && ./a.out
2022-10-30_03:30:20
fatal Fortran runtime error 2022-10-30_03:30:20
(./test.f90:13 2022-10-30_03:30:20
): 2022-10-30_03:30:20
Could not acquire exclusive lock on unit 6, perhaps due to an attempt to perform recursive I/O 2022-10-30_03:30:20
Aborted (core dumped)
```
@klausler Is this the bug in IO runtime? Does LLVM Flang need IO runtime to handle this multi-threaded case?
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJztWNFy6jYQ_RrzooGx5eDgBx4oXNrMhCZtaF8ZYQmsXllyZTk3-fuuZBtkEnLpTDuZaWEIsaXVnqPdo5XlraKv0yAJm-9OaaOJDMJFEM4CfIMyYlAx2qUhatpWitaCIcMq0zSUmj8Tw9qbeit4hr48rZabNS_Yj6y1an7Na8kCPEetWRDP4IvYxoBpY4EQl4btme46XxnRdkihpMntBSWvane4y1XddHNZG-e7YpmStPHGJEUO0-MAvYZwWfltVb3VqjZcsj51PHHMwKv9_2Q0l_sApx3VxjeetBPAaUfanw_KcqJJZuyU8EQwGcSLAM-sG_BrZystEMC3Tao0XEkifGctdOfyn4wRuLPjwdei4Y3Hzl_X6dz4vY3frvsI5dt4BDpDy8I3cawOII5aD6Uh2xk0jH2DkznwnQ1vqVnVxLOfMEiNyZk8WCM0n93fu2QrQbt8d_aT70U0wInn6qPP2dj3NIV8UYFo-c5Xp1XxOYWeF_G_O68PJ7Z-u1h8t616e_Ln0ls-Pf1dMqCvtEtGvCPQS4b1RHsRs76MLxlyImy_gri6MTlbPToP67cVAz7fNLeJmvjZmS9Xa1ePMHTc3YxuoCnAt0P4g6s7PMJnGjanDRb646bUoaRnRNYqs5NiT5et1g5S8yN0dom81X9n2d_c7E7m7W-lVntNClTAHtHRrCt_w4N8ECHQTimIWRQeJN7fWJDPp7GV_io_v3e4Itc1T3BoozZHFmiOYvcbxsdrHPa8elIBbqEvq6PRyfbhlcUARxAXVZSoBD9CMPFeH1XHVqoQd4wjy0b2ZGvDdLqfukrRo4wQPEJImLaV9dznCbnyoY4EbLrP95xSZ97jQJv77nHn_VtQxr59EGqffQ4iGe5UySQAWRXjBI0CvCQju_waMJuuYRQO43ADWYpnkKR4hsPv19O_-bnCXeGucP8TOFuQ2EsJFQk9rB43P_-22qx_-vXLbPEEhTc62uwEkfuhZN-gTLlLGMQ01F7YmATcsOzzy9mHz5dX1CvqFfWKegnqh0UR_-eKYvO7I0AaLdtnU11Le0pATGulPysLExueLnaAGMWfxSS1h5nPAZ-rWlAklUEk-7PmGnLykom64s8MCZV9RUqiWnKDEvf6k-mclBWiNZwrFYJMEmNYURp7B51w9iiQZlmtnYM7CPDDZ6putgXBMWpfsGUK5kbromT05N3O6SHqJvwqSF0JOGfeVcjk3P4wtK33cP5Edw-deoN4iRaKVej-_vcVWtoliiQDtKOJDUtOJLXvna2fohaGD02uGaFgmJHKehmwaZQkaRKO09t0QKcxTeOUDAw3gk2D8Q9u9QfjBVw-wPpePcK1BWkZnTht3wMMai2muTFl5d5mLOG75yavt6NMFXAjxHP3bwhD_mAZnHCXvKpqBqfc5TjFOBnkU8y20ZjGhCY0mtCI4huKIxbvKI224TbdDQTZMlFZmgHGDdN41kUIY6A64FMrgSjCkzDGSZSOSEgmNIkyGo1jzG7HEHJWEC5Gls1I6f1ATx0xmGEFnYJXpjp2kqrie4i0AwX_pDa50tNHxl-4_IUTNXDTmLo5_AUZIsB4">