summaryrefslogtreecommitdiff
path: root/lib/Support/raw_ostream.cpp
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2011-02-03 03:32:32 +0000
committerDaniel Dunbar <daniel@zuster.org>2011-02-03 03:32:32 +0000
commitb0cfa6cab85ce19c8ecaf9cdd3e34a3593d0b001 (patch)
treebd821944d76dfe9eb287e228ef5aded11fcce4d5 /lib/Support/raw_ostream.cpp
parent3e46293c27ee6d35240d6308a84be0f2c2e91940 (diff)
downloadllvm-b0cfa6cab85ce19c8ecaf9cdd3e34a3593d0b001.tar.gz
llvm-b0cfa6cab85ce19c8ecaf9cdd3e34a3593d0b001.tar.bz2
llvm-b0cfa6cab85ce19c8ecaf9cdd3e34a3593d0b001.tar.xz
raw_fd_ostream: Add a SetUseAtomicWrites() method (uses writev).
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@124771 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Support/raw_ostream.cpp')
-rw-r--r--lib/Support/raw_ostream.cpp24
1 files changed, 21 insertions, 3 deletions
diff --git a/lib/Support/raw_ostream.cpp b/lib/Support/raw_ostream.cpp
index e7d75e7128..80ea7407b4 100644
--- a/lib/Support/raw_ostream.cpp
+++ b/lib/Support/raw_ostream.cpp
@@ -32,6 +32,9 @@
#if defined(HAVE_FCNTL_H)
# include <fcntl.h>
#endif
+#if defined(HAVE_SYS_UIO_H) && defined(HAVE_WRITEV)
+# include <sys/uio.h>
+#endif
#if defined(__CYGWIN__)
#include <io.h>
@@ -375,7 +378,9 @@ void format_object_base::home() {
/// stream should be immediately destroyed; the string will be empty
/// if no error occurred.
raw_fd_ostream::raw_fd_ostream(const char *Filename, std::string &ErrorInfo,
- unsigned Flags) : Error(false), pos(0) {
+ unsigned Flags)
+ : Error(false), UseAtomicWrites(false), pos(0)
+{
assert(Filename != 0 && "Filename is null");
// Verify that we don't have both "append" and "excl".
assert((!(Flags & F_Excl) || !(Flags & F_Append)) &&
@@ -426,7 +431,7 @@ raw_fd_ostream::raw_fd_ostream(const char *Filename, std::string &ErrorInfo,
/// ShouldClose is true, this closes the file when the stream is destroyed.
raw_fd_ostream::raw_fd_ostream(int fd, bool shouldClose, bool unbuffered)
: raw_ostream(unbuffered), FD(fd),
- ShouldClose(shouldClose), Error(false) {
+ ShouldClose(shouldClose), Error(false), UseAtomicWrites(false) {
#ifdef O_BINARY
// Setting STDOUT and STDERR to binary mode is necessary in Win32
// to avoid undesirable linefeed conversion.
@@ -467,7 +472,20 @@ void raw_fd_ostream::write_impl(const char *Ptr, size_t Size) {
pos += Size;
do {
- ssize_t ret = ::write(FD, Ptr, Size);
+ ssize_t ret;
+
+ // Check whether we should attempt to use atomic writes.
+ if (BUILTIN_EXPECT(!UseAtomicWrites, true)) {
+ ret = ::write(FD, Ptr, Size);
+ } else {
+ // Use ::writev() where available.
+#if defined(HAVE_WRITEV)
+ struct iovec IOV = { (void*) Ptr, Size };
+ ret = ::writev(FD, &IOV, 1);
+#else
+ ret = ::write(FD, Ptr, Size);
+#endif
+ }
if (ret < 0) {
// If it's a recoverable error, swallow it and retry the write.