summaryrefslogtreecommitdiff
path: root/libgfortran
diff options
context:
space:
mode:
authorThomas Koenig <tkoenig@gcc.gnu.org>2018-12-09 18:54:47 +0000
committerThomas Koenig <tkoenig@gcc.gnu.org>2018-12-09 18:54:47 +0000
commitd0cbb206e2068e97efc3022c587bdaa16b85d9c0 (patch)
tree73a313fa1bb5731bfb41b304166e42efd23d89d8 /libgfortran
parent59cd1934df18511835b88e36edf0327db5db738b (diff)
re PR libfortran/88411 (Random crashes for ASYNCHRONOUS writes (bad locking?))
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-09 Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/88411 * testsuite/libgomp.fortran/async_io_8.f90: New test. From-SVN: r266929
Diffstat (limited to 'libgfortran')
-rw-r--r--libgfortran/ChangeLog11
-rw-r--r--libgfortran/io/transfer.c20
2 files changed, 19 insertions, 12 deletions
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 <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
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