https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119136
--- Comment #29 from GCC Commits <cvs-commit at gcc dot gnu.org> --- The trunk branch has been updated by Thomas Koenig <[email protected]>: https://gcc.gnu.org/g:e32c3fb4311bcaf767a87934d6495f05fbae7bc9 commit r16-6515-ge32c3fb4311bcaf767a87934d6495f05fbae7bc9 Author: Thomas Koenig <[email protected]> Date: Sun Jan 4 20:09:39 2026 +0100 Generate a runtime error on recursive I/O, thread-safe This patch is a version of Jerry's patch with one additional feature. When locking a unit, the thread ID of the locking thread also stored in the gfc_unit structure. When the unit is found to be locked, it can be either have been locked by the same thread (bad, recursive I/O) or by another thread (harmless). Regression-tested fully (make -j8 check in the gcc build directory) on Linux, which links in pthreads by default. Steve checked on FreeBSD, which does not do so. Jerry DeLisle <[email protected]> Thomas Koenig <[email protected]> PR libfortran/119136 gcc/fortran/ChangeLog: * libgfortran.h: Add enum for new LIBERROR_RECURSIVE_IO. libgfortran/ChangeLog: * io/async.h (UNLOCK_UNIT): New macro. (TRYLOCK_UNIT): New macro. (LOCK_UNIT): New macro. * io/io.h: Delete prototype for unused stash_internal_unit. (check_for_recursive): Add prototype for this new function. * io/transfer.c (data_transfer_init): Add call to new check_for_recursive. * io/unit.c (delete_unit): Fix comment. (check_for_recursive): Add new function. (init_units): Use new macros. (close_unit_1): Likewise. (unlock_unit): Likewise. * io/unix.c (flush_all_units_1): Likewise. (flush_all_units): Likewise. * runtime/error.c (translate_error): : Add translation for "Recursive I/O not allowed runtime error message. gcc/testsuite/ChangeLog: * gfortran.dg/pr119136.f90: New test.
