For PR797:
authorReid Spencer <rspencer@reidspencer.com>
Fri, 25 Aug 2006 21:37:17 +0000 (21:37 +0000)
committerReid Spencer <rspencer@reidspencer.com>
Fri, 25 Aug 2006 21:37:17 +0000 (21:37 +0000)
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

include/llvm/System/MappedFile.h
include/llvm/System/Signals.h
lib/System/Unix/MappedFile.inc
lib/System/Unix/Signals.inc
lib/System/Unix/Unix.h
lib/System/Win32/DynamicLibrary.inc
lib/System/Win32/MappedFile.inc
lib/System/Win32/Memory.inc
lib/System/Win32/Path.inc
lib/System/Win32/Signals.inc
lib/System/Win32/Win32.h

index a68303bfb05abdd7036e7ef22ba283dbd8b5aa4a..8cd926bc14362e8ecb8c429e5a94a62bb8864211 100644 (file)
@@ -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(); }
 
index 21feb5b3161a96e77a88277d070d054fafa93a3d..f4b8b14e4c74bbcd11419c432a082dc86f68f32f 100644 (file)
@@ -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.
index ef959bacab21751710818c8271d3117e3fba3720..4dccd138c1e95b1869b24be168ca997680c29bdb 100644 (file)
@@ -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);
 }
 
 }
index e464106df019ca98d92b470baf7247b83d1fe916..35c628ba33f509dd0d780a59c3508993a436b035 100644 (file)
@@ -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<sys::Path>;
 
@@ -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<sys::Path>;
@@ -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
index 29730fd10be1f59ca639fed13eda60d5ba9a02e3..c38c652aeceead4d5ea330531b12728ef7687171 100644 (file)
@@ -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;
 }
 
index 287a4c009e688b6109458bcdaa593a8c16b57a96..19cd3ab7d3edbd8f96de4ff5f20a967cae4b43e2 100644 (file)
@@ -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 {
index e7963c6b6a40da98ee9effff7fe30643a293f4e7..d5bedfcfed85398b5cb8244eed48c44f150bb045 100644 (file)
@@ -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);
 }
 
 }
index 3b70cc8e4f1263a58becd3fd32d55d432adfaf2a..739d530f4ca2643c8166b37cd9e49c4e066a7882 100644 (file)
@@ -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;
 }
 
index c13cb3bd94ae3cc5b1cd9128cd541b6113c7e1b3..96a59ded6fa465b042c2637b53e8e6abfefb8862 100644 (file)
@@ -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<Path>::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: ");
     }
   }
 
index c2bfb01b386c2269d5a0497cc0013baa0a819308..0c93b228c3cf98373a16cb6749e0e1b2dbb96778 100644 (file)
@@ -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<sys::Path>;
@@ -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<sys::Path>;
   DirectoriesToRemove->push_back(path);
 
   LeaveCriticalSection(&CriticalSection);
+  return false;
 }
 
 /// PrintStackTraceOnErrorSignal - When an error signal (such as SIBABRT or
index 2238faa8485b63dfdf3be3216cd1a5933a27e4de..0180bfabcf072330742a8a239611e305e8dc31ad 100644 (file)
 #include <cassert>
 #include <string>
 
-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));
 }