diff --git a/include/llvm/System/MappedFile.h b/include/llvm/System/MappedFile.h index a68303bfb05..8cd926bc143 100644 --- a/include/llvm/System/MappedFile.h +++ b/include/llvm/System/MappedFile.h @@ -134,7 +134,7 @@ namespace sys { /// areas of memory after this call. /// @throws std::string if an error occurs /// @brief Set the size of the file and memory mapping. - void size(size_t new_size); + bool size(size_t new_size, std::string* ErrMsg = 0); void close() { if (info_) terminate(); } diff --git a/include/llvm/System/Signals.h b/include/llvm/System/Signals.h index 21feb5b3161..f4b8b14e4c7 100644 --- a/include/llvm/System/Signals.h +++ b/include/llvm/System/Signals.h @@ -24,13 +24,13 @@ namespace sys { /// This function registers signal handlers to ensure that if a signal gets /// delivered that the named file is removed. /// @brief Remove a file if a fatal signal occurs. - void RemoveFileOnSignal(const Path &Filename); + bool RemoveFileOnSignal(const Path &Filename, std::string* ErrMsg = 0); /// This function registers a signal handler to ensure that if a fatal signal /// gets delivered to the process that the named directory and all its /// contents are removed. /// @brief Remove a directory if a fatal signal occurs. - void RemoveDirectoryOnSignal(const Path& path); + bool RemoveDirectoryOnSignal(const Path& path, std::string* ErrMsg = 0); /// When an error signal (such as SIBABRT or SIGSEGV) is delivered to the /// process, print a stack trace and then exit. diff --git a/lib/System/Unix/MappedFile.inc b/lib/System/Unix/MappedFile.inc index ef959bacab2..4dccd138c1e 100644 --- a/lib/System/Unix/MappedFile.inc +++ b/lib/System/Unix/MappedFile.inc @@ -122,7 +122,7 @@ size_t MappedFile::size() const { return info_->Size; } -void MappedFile::size(size_t new_size) { +bool MappedFile::size(size_t new_size, std::string* ErrMsg) { assert(info_ && "MappedFile not initialized"); // Take the mapping out of memory @@ -140,12 +140,14 @@ void MappedFile::size(size_t new_size) { if (new_size > cur_size) { // Ensure we can allocate at least the idodes necessary to handle the // file size requested. - ::lseek(info_->FD, new_size, SEEK_SET); - ::write(info_->FD, "\0", 1); + if ((off_t)-1 == ::lseek(info_->FD, new_size, SEEK_SET)) + return MakeErrMsg(ErrMsg, "Can't lseek: "); + if (-1 == ::write(info_->FD, "\0", 1)) + return MakeErrMsg(ErrMsg, "Can't write: "); } // Put the mapping back into memory. - this->map(0); + return this->map(ErrMsg); } } diff --git a/lib/System/Unix/Signals.inc b/lib/System/Unix/Signals.inc index e464106df01..35c628ba33f 100644 --- a/lib/System/Unix/Signals.inc +++ b/lib/System/Unix/Signals.inc @@ -154,7 +154,7 @@ void sys::SetInterruptFunction(void (*IF)()) { } // RemoveFileOnSignal - The public API -void sys::RemoveFileOnSignal(const sys::Path &Filename) { +bool sys::RemoveFileOnSignal(const sys::Path &Filename, std::string* ErrMsg) { if (FilesToRemove == 0) FilesToRemove = new std::vector; @@ -162,14 +162,18 @@ void sys::RemoveFileOnSignal(const sys::Path &Filename) { std::for_each(IntSigs, IntSigsEnd, RegisterHandler); std::for_each(KillSigs, KillSigsEnd, RegisterHandler); + return false; } // RemoveDirectoryOnSignal - The public API -void sys::RemoveDirectoryOnSignal(const sys::Path& path) { +bool sys::RemoveDirectoryOnSignal(const sys::Path& path, std::string* ErrMsg) { // Not a directory? sys::FileStatus Status; - if (path.getFileStatus(Status) || !Status.isDir) - return; + if (path.getFileStatus(Status) || !Status.isDir) { + if (ErrMsg) + *ErrMsg = path.toString() + " is not a directory"; + return true; + } if (DirectoriesToRemove == 0) DirectoriesToRemove = new std::vector; @@ -178,6 +182,7 @@ void sys::RemoveDirectoryOnSignal(const sys::Path& path) { std::for_each(IntSigs, IntSigsEnd, RegisterHandler); std::for_each(KillSigs, KillSigsEnd, RegisterHandler); + return false; } /// PrintStackTraceOnErrorSignal - When an error signal (such as SIBABRT or diff --git a/lib/System/Unix/Unix.h b/lib/System/Unix/Unix.h index 29730fd10be..c38c652aece 100644 --- a/lib/System/Unix/Unix.h +++ b/lib/System/Unix/Unix.h @@ -94,7 +94,7 @@ inline bool MakeErrMsg( // but, oh well, just use a generic message sprintf(buffer, "Error #%d", errnum); #endif - *ErrMsg = buffer; + *ErrMsg = prefix + buffer; return true; } diff --git a/lib/System/Win32/DynamicLibrary.inc b/lib/System/Win32/DynamicLibrary.inc index 287a4c009e6..19cd3ab7d3e 100644 --- a/lib/System/Win32/DynamicLibrary.inc +++ b/lib/System/Win32/DynamicLibrary.inc @@ -65,16 +65,6 @@ DynamicLibrary::DynamicLibrary() : handle(0) { OpenedHandles.push_back((HMODULE)handle); } -DynamicLibrary::DynamicLibrary(const char*filename) : handle(0) { - HMODULE a_handle = LoadLibrary(filename); - - if (a_handle == 0) - ThrowError(std::string(filename) + ": Can't open : "); - - handle = a_handle; - OpenedHandles.push_back(a_handle); -} - DynamicLibrary::~DynamicLibrary() { if (handle == 0) return; @@ -100,7 +90,7 @@ bool DynamicLibrary::LoadLibraryPermanently(const char *filename, HMODULE a_handle = LoadLibrary(filename); if (a_handle == 0) - return GetError(std::string(filename) + ": Can't open : ", ErrMsg); + return MakeErrMsg(ErrMsg, std::string(filename) + ": Can't open : "); OpenedHandles.push_back(a_handle); } else { diff --git a/lib/System/Win32/MappedFile.inc b/lib/System/Win32/MappedFile.inc index e7963c6b6a4..d5bedfcfed8 100644 --- a/lib/System/Win32/MappedFile.inc +++ b/lib/System/Win32/MappedFile.inc @@ -27,7 +27,7 @@ struct sys::MappedFileInfo { size_t size; }; -void MappedFile::initialize() { +bool MappedFile::initialize(std::string* ErrMsg) { assert(!info_); info_ = new MappedFileInfo; info_->hFile = INVALID_HANDLE_VALUE; @@ -42,7 +42,8 @@ void MappedFile::initialize() { if (info_->hFile == INVALID_HANDLE_VALUE) { delete info_; info_ = NULL; - ThrowError(std::string("Can't open file: ") + path_.toString()); + return MakeErrMsg(ErrMsg, + std::string("Can't open file: ") + path_.toString()); } LARGE_INTEGER size; @@ -51,7 +52,8 @@ void MappedFile::initialize() { CloseHandle(info_->hFile); delete info_; info_ = NULL; - ThrowError(std::string("Can't get size of file: ") + path_.toString()); + return MakeErrMsg(ErrMsg, + std::string("Can't get size of file: ") + path_.toString()); } } @@ -75,7 +77,7 @@ void MappedFile::unmap() { } } -void* MappedFile::map() { +void* MappedFile::map(std::string* ErrMsg) { if (!isMapped()) { DWORD prot = PAGE_READONLY; if (options_ & EXEC_ACCESS) @@ -83,15 +85,18 @@ void* MappedFile::map() { else if (options_ & WRITE_ACCESS) prot = PAGE_READWRITE; info_->hMapping = CreateFileMapping(info_->hFile, NULL, prot, 0, 0, NULL); - if (info_->hMapping == NULL) - ThrowError(std::string("Can't map file: ") + path_.toString()); + if (info_->hMapping == NULL) { + MakeErrMsg(ErrMsg, std::string("Can't map file: ") + path_.toString()); + return 0; + } prot = (options_ & WRITE_ACCESS) ? FILE_MAP_WRITE : FILE_MAP_READ; base_ = MapViewOfFileEx(info_->hMapping, prot, 0, 0, 0, NULL); if (base_ == NULL) { CloseHandle(info_->hMapping); info_->hMapping = NULL; - ThrowError(std::string("Can't map file: ") + path_.toString()); + MakeErrMsg(ErrMsg, std::string("Can't map file: ") + path_.toString()); + return 0; } } return base_; @@ -102,7 +107,7 @@ size_t MappedFile::size() const { return info_->size; } -void MappedFile::size(size_t new_size) { +bool MappedFile::size(size_t new_size, std::string* ErrMsg) { assert(info_ && "MappedFile not initialized"); // Take the mapping out of memory. @@ -117,14 +122,16 @@ void MappedFile::size(size_t new_size) { LARGE_INTEGER eof; eof.QuadPart = new_size; if (!SetFilePointerEx(info_->hFile, eof, NULL, FILE_BEGIN)) - ThrowError(std::string("Can't set end of file: ") + path_.toString()); + return MakeErrMsg(ErrMsg, + std::string("Can't set end of file: ") + path_.toString()); if (!SetEndOfFile(info_->hFile)) - ThrowError(std::string("Can't set end of file: ") + path_.toString()); + return MakeErrMsg(ErrMsg, + std::string("Can't set end of file: ") + path_.toString()); info_->size = new_size; } // Remap the file. - map(); + return map(ErrMsg); } } diff --git a/lib/System/Win32/Memory.inc b/lib/System/Win32/Memory.inc index 3b70cc8e4f1..739d530f4ca 100644 --- a/lib/System/Win32/Memory.inc +++ b/lib/System/Win32/Memory.inc @@ -36,7 +36,7 @@ MemoryBlock Memory::AllocateRWX(unsigned NumBytes, void *pa = VirtualAlloc(NULL, NumPages*pageSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE); if (pa == NULL) { - GetError("Can't allocate RWX Memory: ", ErrMsg); + MakeErrMsg(ErrMsg, "Can't allocate RWX Memory: "); return MemoryBlock(); } @@ -49,7 +49,7 @@ MemoryBlock Memory::AllocateRWX(unsigned NumBytes, bool Memory::ReleaseRWX(MemoryBlock &M, std::string *ErrMsg) { if (M.Address == 0 || M.Size == 0) return false; if (!VirtualFree(M.Address, 0, MEM_RELEASE)) - return GetError("Can't release RWX Memory: ", ErrMsg); + return MakeErrMsg(ErrMsg, "Can't release RWX Memory: "); return false; } diff --git a/lib/System/Win32/Path.inc b/lib/System/Win32/Path.inc index c13cb3bd94a..96a59ded6fa 100644 --- a/lib/System/Win32/Path.inc +++ b/lib/System/Win32/Path.inc @@ -292,8 +292,8 @@ bool Path::getFileStatus(FileStatus &info, std::string *ErrStr) const { WIN32_FILE_ATTRIBUTE_DATA fi; if (!GetFileAttributesEx(path.c_str(), GetFileExInfoStandard, &fi)) - return GetError("getStatusInfo():" + std::string(path) + - ": Can't get status: ", ErrStr); + return MakeErrMsg(ErrStr, "getStatusInfo():" + std::string(path) + + ": Can't get status: "); info.fileSize = fi.nFileSizeHigh; info.fileSize <<= sizeof(fi.nFileSizeHigh)*8; @@ -547,7 +547,7 @@ Path::eraseFromDisk(bool remove_contents, std::string *ErrStr) const { // attribute first. if (attr & FILE_ATTRIBUTE_READONLY) { if (!SetFileAttributes(path.c_str(), attr & ~FILE_ATTRIBUTE_READONLY)) - return GetError(path + ": Can't destroy file: ", ErrStr); + return MakeErrMsg(ErrStr, path + ": Can't destroy file: "); } if (!DeleteFile(path.c_str())) @@ -593,7 +593,7 @@ Path::eraseFromDisk(bool remove_contents, std::string *ErrStr) const { FindClose(h); if (err != ERROR_NO_MORE_FILES) { SetLastError(err); - return GetError(path + ": Can't read directory: ", ErrStr); + return MakeErrMsg(ErrStr, path + ": Can't read directory: "); } for (std::vector::iterator I = list.begin(); I != list.end(); @@ -603,14 +603,14 @@ Path::eraseFromDisk(bool remove_contents, std::string *ErrStr) const { } } else { if (GetLastError() != ERROR_FILE_NOT_FOUND) - return GetError(path + ": Can't read directory: ", ErrStr); + return MakeErrMsg(ErrStr, path + ": Can't read directory: "); } } pathname[lastchar] = 0; if (!RemoveDirectory(pathname)) - return GetError(std::string(pathname) + ": Can't destroy directory: ", - ErrStr); + return MakeErrMsg(ErrStr, + std::string(pathname) + ": Can't destroy directory: "); return false; } // It appears the path doesn't exist. @@ -671,7 +671,7 @@ Path::setStatusInfoOnDisk(const FileStatus &si, std::string *ErrStr) const { DWORD err = GetLastError(); CloseHandle(h); SetLastError(err); - return GetError(path + ": GetFileInformationByHandle: ", ErrStr); + return MakeErrMsg(ErrStr, path + ": GetFileInformationByHandle: "); } FILETIME ft; @@ -681,7 +681,7 @@ Path::setStatusInfoOnDisk(const FileStatus &si, std::string *ErrStr) const { CloseHandle(h); if (!ret) { SetLastError(err); - return GetError(path + ": SetFileTime: ", ErrStr); + return MakeErrMsg(path + ": SetFileTime: "); } // Best we can do with Unix permission bits is to interpret the owner @@ -690,13 +690,13 @@ Path::setStatusInfoOnDisk(const FileStatus &si, std::string *ErrStr) const { if (bhfi.dwFileAttributes & FILE_ATTRIBUTE_READONLY) { if (!SetFileAttributes(path.c_str(), bhfi.dwFileAttributes & ~FILE_ATTRIBUTE_READONLY)) - return GetError(path + ": SetFileAttributes: ", ErrStr); + return MakeErrMsg(ErrStr, path + ": SetFileAttributes: "); } } else { if (!(bhfi.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) { if (!SetFileAttributes(path.c_str(), bhfi.dwFileAttributes | FILE_ATTRIBUTE_READONLY)) - return GetError(path + ": SetFileAttributes: ", ErrStr); + return MakeErrMsg(ErrStr, path + ": SetFileAttributes: "); } } diff --git a/lib/System/Win32/Signals.inc b/lib/System/Win32/Signals.inc index c2bfb01b386..0c93b228c3c 100644 --- a/lib/System/Win32/Signals.inc +++ b/lib/System/Win32/Signals.inc @@ -80,11 +80,14 @@ static void RegisterHandler() { } // RemoveFileOnSignal - The public API -void sys::RemoveFileOnSignal(const sys::Path &Filename) { +bool sys::RemoveFileOnSignal(const sys::Path &Filename, std::string* ErrMsg) { RegisterHandler(); - if (CleanupExecuted) - throw std::string("Process terminating -- cannot register for removal"); + if (CleanupExecuted) { + if (ErrMsg) + *ErrMsg = "Process terminating -- cannot register for removal"; + return true; + } if (FilesToRemove == NULL) FilesToRemove = new std::vector; @@ -92,25 +95,33 @@ void sys::RemoveFileOnSignal(const sys::Path &Filename) { FilesToRemove->push_back(Filename); LeaveCriticalSection(&CriticalSection); + return false; } // RemoveDirectoryOnSignal - The public API -void sys::RemoveDirectoryOnSignal(const sys::Path& path) { +bool sys::RemoveDirectoryOnSignal(const sys::Path& path, std::string* ErrMsg) { // Not a directory? sys::FileStatus Status; - if (path.getFileStatus(Status) || !Status.isDir) - return; + if (path.getFileStatus(Status) || !Status.isDir) { + if (ErrMsg) + *ErrMsg = path.toString() + " is not a directory"; + return true; + } RegisterHandler(); - if (CleanupExecuted) - throw std::string("Process terminating -- cannot register for removal"); + if (CleanupExecuted) { + if (ErrMsg) + *ErrMsg = "Process terminating -- cannot register for removal"; + return true; + } if (DirectoriesToRemove == NULL) DirectoriesToRemove = new std::vector; DirectoriesToRemove->push_back(path); LeaveCriticalSection(&CriticalSection); + return false; } /// PrintStackTraceOnErrorSignal - When an error signal (such as SIBABRT or diff --git a/lib/System/Win32/Win32.h b/lib/System/Win32/Win32.h index 2238faa8485..0180bfabcf0 100644 --- a/lib/System/Win32/Win32.h +++ b/lib/System/Win32/Win32.h @@ -24,26 +24,6 @@ #include #include -inline bool GetError(const std::string &Prefix, std::string *Dest) { - if (Dest == 0) return true; - char *buffer = NULL; - FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM, - NULL, GetLastError(), 0, (LPSTR)&buffer, 1, NULL); - *Dest = Prefix + buffer; - LocalFree(buffer); - return true; -} - -inline void ThrowError(const std::string& msg) { - char *buffer = NULL; - FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM, - NULL, GetLastError(), 0, (LPSTR)&buffer, 1, NULL); - std::string s(msg); - s += buffer; - LocalFree(buffer); - throw s; -} - inline bool MakeErrMsg(std::string* ErrMsg, const std::string& prefix) { if (!ErrMsg) return true; @@ -55,10 +35,6 @@ inline bool MakeErrMsg(std::string* ErrMsg, const std::string& prefix) { return true; } -inline void ThrowErrno(const std::string& prefix) { - ThrowError(prefix + ": " + strerror(errno)); -} - inline void MakeErrnoMsg(std::string* ErrMsg, const std::string & prefix) { MakeErrorMsg(prefix + ": " + strerror(errno)); }