aboutsummaryrefslogtreecommitdiff
path: root/libc
diff options
context:
space:
mode:
authorJoseph Huber <jhuber6@vols.utk.edu>2023-07-19 18:03:02 -0500
committerJoseph Huber <jhuber6@vols.utk.edu>2023-07-20 08:11:18 -0500
commitcc92212d75dff07644e478c55a6f145c020f6f8e (patch)
tree771acf198528123ec6f10a7ff8884c60120f61b6 /libc
parent60152f1983336e7098f0d28343cc0cf7c92af702 (diff)
downloadllvm-cc92212d75dff07644e478c55a6f145c020f6f8e.zip
llvm-cc92212d75dff07644e478c55a6f145c020f6f8e.tar.gz
llvm-cc92212d75dff07644e478c55a6f145c020f6f8e.tar.bz2
[libc] Remove global constructors on File type
The `File` interface currently has a destructor to delete the buffer if it is owned by the file. This is problematic for the globally allocated `stdout`, `stdin`, and `stderr` files. This causes the file interface to have global constructors to initialize the destructors to use these. However, these never use the destructors because they don't own the buffer. This patch removes the destructor and calls in manually in the close implementation. The platform close should never need to access the buffer and it needs to be done before clearing the whole thing, so this should work. Reviewed By: sivachandra Differential Revision: https://reviews.llvm.org/D155762
Diffstat (limited to 'libc')
-rw-r--r--libc/src/__support/File/file.h16
1 files changed, 7 insertions, 9 deletions
diff --git a/libc/src/__support/File/file.h b/libc/src/__support/File/file.h
index 97dc5ff..2c6aff3 100644
--- a/libc/src/__support/File/file.h
+++ b/libc/src/__support/File/file.h
@@ -151,15 +151,6 @@ protected:
static_cast<ModeFlags>(OpenMode::PLUS));
}
- // The GPU build should not emit a destructor because we do not support global
- // destructors in all cases and it is unneccessary without buffering.
-#if !defined(LIBC_TARGET_ARCH_IS_GPU)
- ~File() {
- if (own_buf)
- delete buf;
- }
-#endif
-
public:
// We want this constructor to be constexpr so that global file objects
// like stdout do not require invocation of the constructor which can
@@ -234,6 +225,13 @@ public:
}
}
}
+
+ // If we own the buffer, delete it before calling the platform close
+ // implementation. The platform close should not need to access the buffer
+ // and we need to clean it up before the entire structure is removed.
+ if (own_buf)
+ delete buf;
+
// Platform close is expected to cleanup the file data structure which
// includes the file mutex. Hence, we call platform_close after releasing
// the file lock. Another thread doing file operations while a thread is