summaryrefslogtreecommitdiffstats
path: root/lldb/source/Core/ConnectionFileDescriptor.cpp
diff options
context:
space:
mode:
authorGreg Clayton <gclayton@apple.com>2012-01-04 22:56:43 +0000
committerGreg Clayton <gclayton@apple.com>2012-01-04 22:56:43 +0000
commit96c09687bce5e2dfb6f81eca705515a106d1c1a3 (patch)
treeeef2f707fe4a5284c16a7ea6d1c66dcaa413cd84 /lldb/source/Core/ConnectionFileDescriptor.cpp
parent3ad904245686d7aeef7d2770e938146d2d97255a (diff)
downloadbcm5719-llvm-96c09687bce5e2dfb6f81eca705515a106d1c1a3.tar.gz
bcm5719-llvm-96c09687bce5e2dfb6f81eca705515a106d1c1a3.zip
<rdar://problem/10507811>
Be better at detecting when DWARF changes and handle this more gracefully than asserting and exiting. Also fixed up a bunch of system calls that weren't properly checking for EINTR. llvm-svn: 147559
Diffstat (limited to 'lldb/source/Core/ConnectionFileDescriptor.cpp')
-rw-r--r--lldb/source/Core/ConnectionFileDescriptor.cpp47
1 files changed, 35 insertions, 12 deletions
diff --git a/lldb/source/Core/ConnectionFileDescriptor.cpp b/lldb/source/Core/ConnectionFileDescriptor.cpp
index 5c0e97d71e2..f83d9994c35 100644
--- a/lldb/source/Core/ConnectionFileDescriptor.cpp
+++ b/lldb/source/Core/ConnectionFileDescriptor.cpp
@@ -188,7 +188,10 @@ ConnectionFileDescriptor::Connect (const char *s, Error *error_ptr)
{
// file:///PATH
const char *path = s + strlen("file://");
- m_fd_send = m_fd_recv = ::open (path, O_RDWR);
+ do
+ {
+ m_fd_send = m_fd_recv = ::open (path, O_RDWR);
+ } while (m_fd_send == -1 && errno == EINTR);
if (m_fd_send == -1)
{
if (error_ptr)
@@ -269,14 +272,22 @@ ConnectionFileDescriptor::Read (void *dst,
case eFDTypeFile: // Other FD requireing read/write
status = BytesAvailable (timeout_usec, error_ptr);
if (status == eConnectionStatusSuccess)
- bytes_read = ::read (m_fd_recv, dst, dst_len);
+ {
+ do
+ {
+ bytes_read = ::read (m_fd_recv, dst, dst_len);
+ } while (bytes_read < 0 && errno == EINTR);
+ }
break;
case eFDTypeSocket: // Socket requiring send/recv
if (SetSocketReceiveTimeout (timeout_usec))
{
status = eConnectionStatusSuccess;
- bytes_read = ::recv (m_fd_recv, dst, dst_len, 0);
+ do
+ {
+ bytes_read = ::recv (m_fd_recv, dst, dst_len, 0);
+ } while (bytes_read < 0 && errno == EINTR);
}
break;
@@ -286,7 +297,10 @@ ConnectionFileDescriptor::Read (void *dst,
status = eConnectionStatusSuccess;
SocketAddress from (m_udp_send_sockaddr);
socklen_t from_len = m_udp_send_sockaddr.GetLength();
- bytes_read = ::recvfrom (m_fd_recv, dst, dst_len, 0, (struct sockaddr *)&from, &from_len);
+ do
+ {
+ bytes_read = ::recvfrom (m_fd_recv, dst, dst_len, 0, (struct sockaddr *)&from, &from_len);
+ } while (bytes_read < 0 && errno == EINTR);
}
break;
}
@@ -392,21 +406,30 @@ ConnectionFileDescriptor::Write (const void *src, size_t src_len, ConnectionStat
switch (m_fd_send_type)
{
case eFDTypeFile: // Other FD requireing read/write
- bytes_sent = ::write (m_fd_send, src, src_len);
+ do
+ {
+ bytes_sent = ::write (m_fd_send, src, src_len);
+ } while (bytes_sent < 0 && errno == EINTR);
break;
case eFDTypeSocket: // Socket requiring send/recv
- bytes_sent = ::send (m_fd_send, src, src_len, 0);
+ do
+ {
+ bytes_sent = ::send (m_fd_send, src, src_len, 0);
+ } while (bytes_sent < 0 && errno == EINTR);
break;
case eFDTypeSocketUDP: // Unconnected UDP socket requiring sendto/recvfrom
assert (m_udp_send_sockaddr.GetFamily() != 0);
- bytes_sent = ::sendto (m_fd_send,
- src,
- src_len,
- 0,
- m_udp_send_sockaddr,
- m_udp_send_sockaddr.GetLength());
+ do
+ {
+ bytes_sent = ::sendto (m_fd_send,
+ src,
+ src_len,
+ 0,
+ m_udp_send_sockaddr,
+ m_udp_send_sockaddr.GetLength());
+ } while (bytes_sent < 0 && errno == EINTR);
break;
}
OpenPOWER on IntegriCloud