[flang-commits] [flang] Move deallocation of I/O resources under STOP to a critical section (PR #74181)
via flang-commits
flang-commits at lists.llvm.org
Fri Dec 1 22:34:42 PST 2023
https://github.com/NimishMishra created https://github.com/llvm/llvm-project/pull/74181
Presence of a STOP region in a multithreaded environment (eg. inside OpenMP parallel) causes race in deallocation of I/O resources. This leads to runtime failures like reported in https://github.com/llvm/llvm-project/issues/73104. This patch moves such deallocations to a critical section.
>From 2998b46bc4f5b71268135df1f6f3d0915221485f Mon Sep 17 00:00:00 2001
From: Nimish Mishra <neelam.nimish at gmail.com>
Date: Sat, 2 Dec 2023 06:32:15 +0000
Subject: [PATCH] Move deallocation of I/O resources under STOP to a critical
section
---
flang/runtime/stop.cpp | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/flang/runtime/stop.cpp b/flang/runtime/stop.cpp
index 98324da1d91e166..f6e5f0c593024b7 100644
--- a/flang/runtime/stop.cpp
+++ b/flang/runtime/stop.cpp
@@ -16,6 +16,7 @@
#include <cstdio>
#include <cstdlib>
+static Fortran::runtime::Lock lock;
extern "C" {
static void DescribeIEEESignaledExceptions() {
@@ -52,7 +53,8 @@ static void CloseAllExternalUnits(const char *why) {
[[noreturn]] void RTNAME(StopStatement)(
int code, bool isErrorStop, bool quiet) {
- CloseAllExternalUnits("STOP statement");
+
+ Fortran::runtime::CriticalSection critical{lock};
if (Fortran::runtime::executionEnvironment.noStopMessage && code == 0) {
quiet = true;
}
@@ -64,12 +66,13 @@ static void CloseAllExternalUnits(const char *why) {
std::fputc('\n', stderr);
DescribeIEEESignaledExceptions();
}
+ CloseAllExternalUnits("STOP statement");
std::exit(code);
}
[[noreturn]] void RTNAME(StopStatementText)(
const char *code, std::size_t length, bool isErrorStop, bool quiet) {
- CloseAllExternalUnits("STOP statement");
+ Fortran::runtime::CriticalSection critical{lock};
if (!quiet) {
if (Fortran::runtime::executionEnvironment.noStopMessage && !isErrorStop) {
std::fprintf(stderr, "%.*s\n", static_cast<int>(length), code);
@@ -79,6 +82,7 @@ static void CloseAllExternalUnits(const char *why) {
}
DescribeIEEESignaledExceptions();
}
+ CloseAllExternalUnits("STOP statement");
if (isErrorStop) {
std::exit(EXIT_FAILURE);
} else {
More information about the flang-commits
mailing list