From: Thomas Koenig Date: Sun, 9 Dec 2018 18:54:47 +0000 (+0000) Subject: re PR libfortran/88411 (Random crashes for ASYNCHRONOUS writes (bad locking?)) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=d0cbb206e2068e97efc3022c587bdaa16b85d9c0;p=gcc.git re PR libfortran/88411 (Random crashes for ASYNCHRONOUS writes (bad locking?)) 2018-12-09 Thomas Koenig PR fortran/88411 * io/transfer.c (dta_transfer_init): Do not treat as an asynchronous statement unless the statement has ASYNCHRONOUS="YES". (st_write_done): Likewise. (st_read_done): Do not perform async_wait for synchronous I/O on an async unit. (st_read_done): Likewise. 2018-12-09 Thomas Koenig PR fortran/88411 * testsuite/libgomp.fortran/async_io_8.f90: New test. From-SVN: r266929 --- diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 42dbc803443..7e56fead3a5 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,14 @@ +2018-12-09 Thomas Koenig + + PR fortran/88411 + * io/transfer.c (dta_transfer_init): Do not treat as an + asynchronous statement unless the statement has + ASYNCHRONOUS="YES". + (st_write_done): Likewise. + (st_read_done): Do not perform async_wait for synchronous I/O + on an async unit. + (st_read_done): Likewise. + 2018-12-02 Janne Blomqvist PR libfortran/88137 diff --git a/libgfortran/io/transfer.c b/libgfortran/io/transfer.c index 4013b3be60a..6fcec8a479e 100644 --- a/libgfortran/io/transfer.c +++ b/libgfortran/io/transfer.c @@ -3189,7 +3189,7 @@ data_transfer_init (st_parameter_dt *dtp, int read_flag) } } - if (au) + if (au && dtp->u.p.async) { NOTE ("enqueue_data_transfer"); enqueue_data_transfer_init (au, dtp, read_flag); @@ -4313,11 +4313,8 @@ st_read_done (st_parameter_dt *dtp) *dtp->id = enqueue_done_id (dtp->u.p.current_unit->au, AIO_READ_DONE); else { - enqueue_done (dtp->u.p.current_unit->au, AIO_READ_DONE); - /* An asynchronous unit without ASYNCHRONOUS="YES" - make this - synchronous by performing a wait operation. */ - if (!dtp->u.p.async) - async_wait (&dtp->common, dtp->u.p.current_unit->au); + if (dtp->u.p.async) + enqueue_done (dtp->u.p.current_unit->au, AIO_READ_DONE); } } else @@ -4401,18 +4398,17 @@ st_write_done (st_parameter_dt *dtp) { if (dtp->u.p.current_unit) { - if (dtp->u.p.current_unit->au) + if (dtp->u.p.current_unit->au && dtp->u.p.async) { if (dtp->common.flags & IOPARM_DT_HAS_ID) *dtp->id = enqueue_done_id (dtp->u.p.current_unit->au, AIO_WRITE_DONE); else { - enqueue_done (dtp->u.p.current_unit->au, AIO_WRITE_DONE); - /* An asynchronous unit without ASYNCHRONOUS="YES" - make this - synchronous by performing a wait operation. */ - if (!dtp->u.p.async) - async_wait (&dtp->common, dtp->u.p.current_unit->au); + /* We perform synchronous I/O on an asynchronous unit, so no need + to enqueue AIO_READ_DONE. */ + if (dtp->u.p.async) + enqueue_done (dtp->u.p.current_unit->au, AIO_WRITE_DONE); } } else diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog index 99417ef62cf..13ec674809a 100644 --- a/libgomp/ChangeLog +++ b/libgomp/ChangeLog @@ -1,3 +1,8 @@ +2018-12-09 Thomas Koenig + + PR fortran/88411 + * testsuite/libgomp.fortran/async_io_8.f90: New test. + 2018-12-09 Thomas Schwinge Jakub Jelinek diff --git a/libgomp/testsuite/libgomp.fortran/async_io_8.f90 b/libgomp/testsuite/libgomp.fortran/async_io_8.f90 new file mode 100644 index 00000000000..f5ae93dc3a8 --- /dev/null +++ b/libgomp/testsuite/libgomp.fortran/async_io_8.f90 @@ -0,0 +1,30 @@ +! { dg-do run } +! PR libfortran/88411 +! This used to generate errors due to a mixup of +! synchronous and asynchronous execution. +! Test case by Harald Anlauf. +program gfcbug153 + implicit none + integer :: iu, irecl + real :: a(100,20), b(1,3000) + iu = 10 + a = 0. + b = 0. + inquire (iolength = irecl) a + open (iu, file="file1.dat", access='direct', & + asynchronous='yes', & + recl=irecl) + write(iu, rec=1) a(:,:) + write(iu, rec=2) a(:,:) + write(iu, rec=3) a(:,:) + close (iu,status="delete") + + inquire (iolength = irecl) b + open (iu, file="file2.dat", access='direct', & + asynchronous='yes', & + recl=irecl) + write(iu, rec=1) b(:,:) + write(iu, rec=2) b(:,:) + write(iu, rec=3) b(:,:) + close (iu,status="delete") +end program