https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100352

Tobias Burnus <burnus at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
   Last reconfirmed|                            |2021-05-01
   Target Milestone|---                         |11.2
            Summary|libgomp.fortran/async_io_1. |[11/12 Regression]
                   |f90   -O0  execution test   |libgomp.fortran/async_io_1.
                   |                            |f90   -O0  execution test
     Ever confirmed|0                           |1
             Status|UNCONFIRMED                 |NEW

--- Comment #6 from Tobias Burnus <burnus at gcc dot gnu.org> ---
For debugging, it helps:

(a) to compile with -fsanitize=address,undefined
    or (here) -fsanitize=thread
(b) to comment '#undef DEBUG_ASYNC' in libgfortran/io/async.h


Issue introduced for PR99529 in
r11-7647-ga6e9633ccb593937fceec67fafc2afe5d518d735

Patch:

diff --git a/libgfortran/io/async.c b/libgfortran/io/async.c
index d216ace1947..247008ca801 100644
--- a/libgfortran/io/async.c
+++ b/libgfortran/io/async.c
@@ -120 +120 @@ async_io (void *arg)
-                 st_write_done_worker (au->pdt);
+                 st_write_done_worker (au->pdt, false);
@@ -126 +126 @@ async_io (void *arg)
-                 st_read_done_worker (au->pdt);
+                 st_read_done_worker (au->pdt, false);
diff --git a/libgfortran/io/io.h b/libgfortran/io/io.h
index e0007c6bfe5..3355bc2fd8d 100644
--- a/libgfortran/io/io.h
+++ b/libgfortran/io/io.h
@@ -1086 +1086 @@ extern void
-st_write_done_worker (st_parameter_dt *);
+st_write_done_worker (st_parameter_dt *, bool);
@@ -1090 +1090 @@ extern void
-st_read_done_worker (st_parameter_dt *);
+st_read_done_worker (st_parameter_dt *, bool);
diff --git a/libgfortran/io/transfer.c b/libgfortran/io/transfer.c
index 71a935652e3..36e35b48cd3 100644
--- a/libgfortran/io/transfer.c
+++ b/libgfortran/io/transfer.c
@@ -4340 +4340 @@ void
-st_read_done_worker (st_parameter_dt *dtp)
+st_read_done_worker (st_parameter_dt *dtp, bool unlock)
@@ -4370 +4370,2 @@ st_read_done_worker (st_parameter_dt *dtp)
-   unlock_unit (dtp->u.p.current_unit);
+   if (unlock)
+     unlock_unit (dtp->u.p.current_unit);
@@ -4397 +4398 @@ st_read_done (st_parameter_dt *dtp)
-       st_read_done_worker (dtp);  /* Calls unlock_unit.  */
+       st_read_done_worker (dtp, true);  /* Calls unlock_unit.  */
@@ -4415 +4416 @@ void
-st_write_done_worker (st_parameter_dt *dtp)
+st_write_done_worker (st_parameter_dt *dtp, bool unlock)
@@ -4466 +4467,2 @@ st_write_done_worker (st_parameter_dt *dtp)
-   unlock_unit (dtp->u.p.current_unit);
+   if (unlock)
+     unlock_unit (dtp->u.p.current_unit);
@@ -4499 +4501 @@ st_write_done (st_parameter_dt *dtp)
-       st_write_done_worker (dtp);  /* Calls unlock_unit.  */
+       st_write_done_worker (dtp, true);  /* Calls unlock_unit.  */

Reply via email to