[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:35:17 PST 2023
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-flang-runtime
Author: None (NimishMishra)
<details>
<summary>Changes</summary>
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.
---
Full diff: https://github.com/llvm/llvm-project/pull/74181.diff
1 Files Affected:
- (modified) flang/runtime/stop.cpp (+6-2)
``````````diff
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 {
``````````
</details>
https://github.com/llvm/llvm-project/pull/74181
More information about the flang-commits
mailing list