[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