From 05545755676b9ff35d244e55d749a15e28bb228b Mon Sep 17 00:00:00 2001 From: Reid Spencer Date: Fri, 25 Aug 2006 21:37:17 +0000 Subject: For PR797: Make the Win32 code exception free (untested/uncompiled) which forced some interface changes which had ripple effect. This should be the last of 797. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@29884 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/System/Win32/DynamicLibrary.inc | 12 +----------- lib/System/Win32/MappedFile.inc | 29 ++++++++++++++++++----------- lib/System/Win32/Memory.inc | 4 ++-- lib/System/Win32/Path.inc | 22 +++++++++++----------- lib/System/Win32/Signals.inc | 27 +++++++++++++++++++-------- lib/System/Win32/Win32.h | 24 ------------------------ 6 files changed, 51 insertions(+), 67 deletions(-) (limited to 'lib/System/Win32') diff --git a/lib/System/Win32/DynamicLibrary.inc b/lib/System/Win32/DynamicLibrary.inc index 287a4c0..19cd3ab 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 e7963c6..d5bedfc 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 3b70cc8..739d530 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 c13cb3b..96a59de 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 c2bfb01..0c93b22 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 2238faa..0180bfa 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)); } -- cgit v1.1