diff --git a/include/Support/FileUtilities.h b/include/Support/FileUtilities.h index 4c02605400a..a6a1dc2456f 100644 --- a/include/Support/FileUtilities.h +++ b/include/Support/FileUtilities.h @@ -102,6 +102,27 @@ bool MakeFileExecutable (const std::string & Filename); /// bool MakeFileReadable (const std::string & Filename); + +/// FDHandle - Simple handle class to make sure a file descriptor gets closed +/// when the object is destroyed. +/// +class FDHandle { + int FD; + FDHandle(const FDHandle &); // DO NOT IMPLEMENT + void operator=(const FDHandle&); // DO NOT IMPLEMENT +public: + FDHandle() : FD(-1) {} + FDHandle(int fd) : FD(fd) {} + ~FDHandle(); + + operator int() const { return FD; } + + FDHandle &operator=(int fd); + + /// take - Take ownership of the file descriptor away from the FDHandle + /// object, so that the file is not closed when the FDHandle is destroyed. + int take(); +}; } // End llvm namespace #endif diff --git a/lib/Bytecode/Reader/ReaderWrappers.cpp b/lib/Bytecode/Reader/ReaderWrappers.cpp index 291ad873443..bc3cbbd3309 100644 --- a/lib/Bytecode/Reader/ReaderWrappers.cpp +++ b/lib/Bytecode/Reader/ReaderWrappers.cpp @@ -16,12 +16,13 @@ #include "ReaderInternals.h" #include "llvm/Module.h" #include "llvm/Instructions.h" +#include "Support/FileUtilities.h" #include "Support/StringExtras.h" #include "Config/fcntl.h" -#include -#include #include "Config/unistd.h" #include "Config/sys/mman.h" +#include +#include using namespace llvm; //===----------------------------------------------------------------------===// @@ -29,19 +30,6 @@ using namespace llvm; // namespace { - /// FDHandle - Simple handle class to make sure a file descriptor gets closed - /// when the object is destroyed. - /// - class FDHandle { - int FD; - public: - FDHandle(int fd) : FD(fd) {} - operator int() const { return FD; } - ~FDHandle() { - if (FD != -1) close(FD); - } - }; - /// BytecodeFileReader - parses a bytecode file from a file /// class BytecodeFileReader : public BytecodeParser { @@ -63,7 +51,7 @@ static std::string ErrnoMessage (int savedErrNum, std::string descr) { } BytecodeFileReader::BytecodeFileReader(const std::string &Filename) { - FDHandle FD = open(Filename.c_str(), O_RDONLY); + FDHandle FD(open(Filename.c_str(), O_RDONLY)); if (FD == -1) throw ErrnoMessage(errno, "open '" + Filename + "'"); diff --git a/lib/Support/FileUtilities.cpp b/lib/Support/FileUtilities.cpp index e6abc8fb40e..02b4edd5573 100644 --- a/lib/Support/FileUtilities.cpp +++ b/lib/Support/FileUtilities.cpp @@ -194,3 +194,26 @@ bool llvm::MakeFileExecutable(const std::string &Filename) { bool llvm::MakeFileReadable(const std::string &Filename) { return AddPermissionsBits(Filename, 0444); } + +//===----------------------------------------------------------------------===// +// FDHandle class implementation +// + +FDHandle::~FDHandle() { + if (FD != -1) close(FD); +} + +FDHandle &FDHandle::operator=(int fd) { + if (FD != -1) close(FD); + FD = fd; + return *this; +} + + +/// take - Take ownership of the file descriptor away from the FDHandle +/// object, so that the file is not closed when the FDHandle is destroyed. +int FDHandle::take() { + int Ret = FD; + FD = -1; + return Ret; +}