+2018-12-09 Thomas Koenig <tkoenig@gcc.gnu.org>
+
+ 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 <jb@gcc.gnu.org>
PR libfortran/88137
}
}
- if (au)
+ if (au && dtp->u.p.async)
{
NOTE ("enqueue_data_transfer");
enqueue_data_transfer_init (au, dtp, read_flag);
*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
{
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
+2018-12-09 Thomas Koenig <tkoenig@gcc.gnu.org>
+
+ PR fortran/88411
+ * testsuite/libgomp.fortran/async_io_8.f90: New test.
+
2018-12-09 Thomas Schwinge <thomas@codesourcery.com>
Jakub Jelinek <jakub@redhat.com>
--- /dev/null
+! { 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