diff options
author | Dan Gohman <gohman@apple.com> | 2010-09-01 14:17:34 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2010-09-01 14:17:34 +0000 |
commit | 41154114f64c1531764236e9268d2a5ac52e3e91 (patch) | |
tree | 319ab11fef0bef74dea022b59eb2ad0731112888 | |
parent | 2ad12a0e2afa3cdffa35a4223bea775ad06ad468 (diff) | |
download | llvm-41154114f64c1531764236e9268d2a5ac52e3e91.tar.gz llvm-41154114f64c1531764236e9268d2a5ac52e3e91.tar.bz2 llvm-41154114f64c1531764236e9268d2a5ac52e3e91.tar.xz |
Add an interface for unregistering a file from the FilesToRemove list.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@112705 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/System/Signals.h | 4 | ||||
-rw-r--r-- | lib/System/Unix/Signals.inc | 10 | ||||
-rw-r--r-- | lib/System/Win32/Signals.inc | 14 |
3 files changed, 28 insertions, 0 deletions
diff --git a/include/llvm/System/Signals.h b/include/llvm/System/Signals.h index 504420cd40..7f1c87c3d5 100644 --- a/include/llvm/System/Signals.h +++ b/include/llvm/System/Signals.h @@ -29,6 +29,10 @@ namespace sys { /// @brief Remove a file if a fatal signal occurs. bool RemoveFileOnSignal(const Path &Filename, std::string* ErrMsg = 0); + /// This function removes a file from the list of files to be removed on + /// signal delivery. + void DontRemoveFileOnSignal(const Path &Filename); + /// When an error signal (such as SIBABRT or SIGSEGV) is delivered to the /// process, print a stack trace and then exit. /// @brief Print a stack trace if a fatal signal occurs. diff --git a/lib/System/Unix/Signals.inc b/lib/System/Unix/Signals.inc index 3e0de66b5d..7b7c43efc7 100644 --- a/lib/System/Unix/Signals.inc +++ b/lib/System/Unix/Signals.inc @@ -182,6 +182,16 @@ bool llvm::sys::RemoveFileOnSignal(const sys::Path &Filename, return false; } +// DontRemoveFileOnSignal - The public API +void llvm::sys::DontRemoveFileOnSignal(const sys::Path &Filename) { + SignalsMutex.acquire(); + std::vector<sys::Path>::reverse_iterator I = + std::find(FilesToRemove.rbegin(), FilesToRemove.rend(), Filename); + if (I != FilesToRemove.rend()) + FilesToRemove.erase(I.base()-1); + SignalsMutex.release(); +} + /// AddSignalHandler - Add a function to be called when a signal is delivered /// to the process. The handler can have a cookie passed to it to identify /// what instance of the handler it is. diff --git a/lib/System/Win32/Signals.inc b/lib/System/Win32/Signals.inc index d6db71ba4f..2498a26ea9 100644 --- a/lib/System/Win32/Signals.inc +++ b/lib/System/Win32/Signals.inc @@ -140,6 +140,20 @@ bool sys::RemoveFileOnSignal(const sys::Path &Filename, std::string* ErrMsg) { return false; } +// DontRemoveFileOnSignal - The public API +void sys::DontRemoveFileOnSignal(const sys::Path &Filename) { + if (FilesToRemove == NULL) + return; + + FilesToRemove->push_back(Filename); + std::vector<sys::Path>::reverse_iterator I = + std::find(FilesToRemove->rbegin(), FilesToRemove->rend(), Filename); + if (I != FilesToRemove->rend()) + FilesToRemove->erase(I.base()-1); + + LeaveCriticalSection(&CriticalSection); +} + /// PrintStackTraceOnErrorSignal - When an error signal (such as SIBABRT or /// SIGSEGV) is delivered to the process, print a stack trace and then exit. void sys::PrintStackTraceOnErrorSignal() { |