diff options
author | Todd Fiala <tfiala@google.com> | 2014-01-24 22:59:22 +0000 |
---|---|---|
committer | Todd Fiala <tfiala@google.com> | 2014-01-24 22:59:22 +0000 |
commit | 8ce3dee45f35df56a31cf30bb8e4b865215338e2 (patch) | |
tree | 70ea8da04759f7f5ddcde494a4f871effbf6e6f1 /lldb/source/Plugins/Process/Linux | |
parent | a8e1e9b143313a04a22124ef1c6edfe930a1ff3c (diff) | |
download | bcm5719-llvm-8ce3dee45f35df56a31cf30bb8e4b865215338e2.tar.gz bcm5719-llvm-8ce3dee45f35df56a31cf30bb8e4b865215338e2.zip |
Fix crash on Linux if sem_wait() is interrupted.
Patch by Andrew MacPherson.
llvm-svn: 200049
Diffstat (limited to 'lldb/source/Plugins/Process/Linux')
-rw-r--r-- | lldb/source/Plugins/Process/Linux/ProcessMonitor.cpp | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/lldb/source/Plugins/Process/Linux/ProcessMonitor.cpp b/lldb/source/Plugins/Process/Linux/ProcessMonitor.cpp index 0f79034bb7c..98dd9df5914 100644 --- a/lldb/source/Plugins/Process/Linux/ProcessMonitor.cpp +++ b/lldb/source/Plugins/Process/Linux/ProcessMonitor.cpp @@ -2062,7 +2062,12 @@ ProcessMonitor::ServeOperation(OperationArgs *args) for(;;) { // wait for next pending operation - sem_wait(&monitor->m_operation_pending); + if (sem_wait(&monitor->m_operation_pending)) + { + if (errno == EINTR) + continue; + assert(false && "Unexpected errno from sem_wait"); + } monitor->m_operation->Execute(monitor); @@ -2082,7 +2087,12 @@ ProcessMonitor::DoOperation(Operation *op) sem_post(&m_operation_pending); // wait for operation to complete - sem_wait(&m_operation_done); + while (sem_wait(&m_operation_done)) + { + if (errno == EINTR) + continue; + assert(false && "Unexpected errno from sem_wait"); + } } size_t |