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. */