summaryrefslogtreecommitdiff
path: root/lib/common
diff options
context:
space:
mode:
authorChris Wilson <chris+github@qwirx.com>2014-08-15 22:47:44 +0000
committerChris Wilson <chris+github@qwirx.com>2014-08-15 22:47:44 +0000
commit4458bf17916973aeb9e99e9166070f645fb3295e (patch)
tree26dee42145e176b7ec3c3f233c79afc7b3270557 /lib/common
parent06960c6241f6209b6dd19b4c204c27f1395cda7d (diff)
Fix deadlock waiting for read or write on closed connection.
If the system is suspended then it may not realise that a TCP connection has been closed, while waiting for data to arrive on it. We didn't used to apply a timeout to this read operation. Now we use the connection's default timeout on all read and write operations. Network operations that don't pass a timeout will be logged with a backtrace, so that they can be fixed.
Diffstat (limited to 'lib/common')
-rw-r--r--lib/common/BufferedStream.cpp2
-rw-r--r--lib/common/BufferedStream.h3
-rw-r--r--lib/common/BufferedWriteStream.cpp2
-rw-r--r--lib/common/BufferedWriteStream.h3
-rw-r--r--lib/common/CollectInBufferStream.cpp2
-rw-r--r--lib/common/CollectInBufferStream.h3
-rw-r--r--lib/common/FileStream.cpp2
-rw-r--r--lib/common/FileStream.h3
-rw-r--r--lib/common/IOStream.h3
-rw-r--r--lib/common/MemBlockStream.cpp2
-rw-r--r--lib/common/MemBlockStream.h3
-rw-r--r--lib/common/PartialReadStream.cpp2
-rw-r--r--lib/common/PartialReadStream.h3
-rw-r--r--lib/common/RateLimitingStream.h5
-rw-r--r--lib/common/ReadGatherStream.cpp2
-rw-r--r--lib/common/ReadGatherStream.h3
-rw-r--r--lib/common/ReadLoggingStream.cpp2
-rw-r--r--lib/common/ReadLoggingStream.h3
-rw-r--r--lib/common/SelfFlushingStream.h5
-rw-r--r--lib/common/StreamableMemBlock.cpp8
-rw-r--r--lib/common/ZeroStream.cpp2
-rw-r--r--lib/common/ZeroStream.h3
22 files changed, 41 insertions, 25 deletions
diff --git a/lib/common/BufferedStream.cpp b/lib/common/BufferedStream.cpp
index b58253f3..cef0a73f 100644
--- a/lib/common/BufferedStream.cpp
+++ b/lib/common/BufferedStream.cpp
@@ -96,7 +96,7 @@ IOStream::pos_type BufferedStream::BytesLeftToRead()
// Created: 2003/07/31
//
// --------------------------------------------------------------------------
-void BufferedStream::Write(const void *pBuffer, int NBytes)
+void BufferedStream::Write(const void *pBuffer, int NBytes, int Timeout)
{
THROW_EXCEPTION(CommonException, NotSupported);
}
diff --git a/lib/common/BufferedStream.h b/lib/common/BufferedStream.h
index 4987e37b..3984aceb 100644
--- a/lib/common/BufferedStream.h
+++ b/lib/common/BufferedStream.h
@@ -25,7 +25,8 @@ public:
virtual int Read(void *pBuffer, int NBytes, int Timeout = IOStream::TimeOutInfinite);
virtual pos_type BytesLeftToRead();
- virtual void Write(const void *pBuffer, int NBytes);
+ virtual void Write(const void *pBuffer, int NBytes,
+ int Timeout = IOStream::TimeOutInfinite);
virtual pos_type GetPosition() const;
virtual void Seek(IOStream::pos_type Offset, int SeekType);
virtual void Close();
diff --git a/lib/common/BufferedWriteStream.cpp b/lib/common/BufferedWriteStream.cpp
index 797be00d..8fbabe9b 100644
--- a/lib/common/BufferedWriteStream.cpp
+++ b/lib/common/BufferedWriteStream.cpp
@@ -64,7 +64,7 @@ IOStream::pos_type BufferedWriteStream::BytesLeftToRead()
// Created: 2003/07/31
//
// --------------------------------------------------------------------------
-void BufferedWriteStream::Write(const void *pBuffer, int NBytes)
+void BufferedWriteStream::Write(const void *pBuffer, int NBytes, int Timeout)
{
int numBytesRemain = NBytes;
diff --git a/lib/common/BufferedWriteStream.h b/lib/common/BufferedWriteStream.h
index 7a1c8c17..5f6d5f19 100644
--- a/lib/common/BufferedWriteStream.h
+++ b/lib/common/BufferedWriteStream.h
@@ -25,7 +25,8 @@ public:
virtual int Read(void *pBuffer, int NBytes, int Timeout = IOStream::TimeOutInfinite);
virtual pos_type BytesLeftToRead();
- virtual void Write(const void *pBuffer, int NBytes);
+ virtual void Write(const void *pBuffer, int NBytes,
+ int Timeout = IOStream::TimeOutInfinite);
virtual pos_type GetPosition() const;
virtual void Seek(IOStream::pos_type Offset, int SeekType);
virtual void Flush(int Timeout = IOStream::TimeOutInfinite);
diff --git a/lib/common/CollectInBufferStream.cpp b/lib/common/CollectInBufferStream.cpp
index 90e2e7bc..47b271f0 100644
--- a/lib/common/CollectInBufferStream.cpp
+++ b/lib/common/CollectInBufferStream.cpp
@@ -98,7 +98,7 @@ IOStream::pos_type CollectInBufferStream::BytesLeftToRead()
// Created: 2003/08/26
//
// --------------------------------------------------------------------------
-void CollectInBufferStream::Write(const void *pBuffer, int NBytes)
+void CollectInBufferStream::Write(const void *pBuffer, int NBytes, int Timeout)
{
if(mInWritePhase != true) { THROW_EXCEPTION(CommonException, CollectInBufferStreamNotInCorrectPhase) }
diff --git a/lib/common/CollectInBufferStream.h b/lib/common/CollectInBufferStream.h
index d73af8db..03cb5da8 100644
--- a/lib/common/CollectInBufferStream.h
+++ b/lib/common/CollectInBufferStream.h
@@ -34,7 +34,8 @@ public:
virtual int Read(void *pBuffer, int NBytes, int Timeout = IOStream::TimeOutInfinite);
virtual pos_type BytesLeftToRead();
- virtual void Write(const void *pBuffer, int NBytes);
+ virtual void Write(const void *pBuffer, int NBytes,
+ int Timeout = IOStream::TimeOutInfinite);
virtual pos_type GetPosition() const;
virtual void Seek(pos_type Offset, int SeekType);
virtual bool StreamDataLeft();
diff --git a/lib/common/FileStream.cpp b/lib/common/FileStream.cpp
index 62fa05f4..6d5810dc 100644
--- a/lib/common/FileStream.cpp
+++ b/lib/common/FileStream.cpp
@@ -246,7 +246,7 @@ IOStream::pos_type FileStream::BytesLeftToRead()
// Created: 2003/07/31
//
// --------------------------------------------------------------------------
-void FileStream::Write(const void *pBuffer, int NBytes)
+void FileStream::Write(const void *pBuffer, int NBytes, int Timeout)
{
if(mOSFileHandle == INVALID_FILE)
{
diff --git a/lib/common/FileStream.h b/lib/common/FileStream.h
index 8489188c..f528b8bc 100644
--- a/lib/common/FileStream.h
+++ b/lib/common/FileStream.h
@@ -40,7 +40,8 @@ public:
virtual int Read(void *pBuffer, int NBytes, int Timeout = IOStream::TimeOutInfinite);
virtual pos_type BytesLeftToRead();
- virtual void Write(const void *pBuffer, int NBytes);
+ virtual void Write(const void *pBuffer, int NBytes,
+ int Timeout = IOStream::TimeOutInfinite);
virtual pos_type GetPosition() const;
virtual void Seek(IOStream::pos_type Offset, int SeekType);
virtual void Close();
diff --git a/lib/common/IOStream.h b/lib/common/IOStream.h
index 81f1cfa6..a4eb3db1 100644
--- a/lib/common/IOStream.h
+++ b/lib/common/IOStream.h
@@ -47,7 +47,8 @@ public:
typedef int64_t pos_type;
virtual int Read(void *pBuffer, int NBytes, int Timeout = IOStream::TimeOutInfinite) = 0;
virtual pos_type BytesLeftToRead(); // may return IOStream::SizeOfStreamUnknown (and will for most stream types)
- virtual void Write(const void *pBuffer, int NBytes) = 0;
+ virtual void Write(const void *pBuffer, int NBytes,
+ int Timeout = IOStream::TimeOutInfinite) = 0;
virtual void Write(const char *pBuffer);
virtual void WriteAllBuffered();
virtual pos_type GetPosition() const;
diff --git a/lib/common/MemBlockStream.cpp b/lib/common/MemBlockStream.cpp
index 90c0eaf6..f49ac96f 100644
--- a/lib/common/MemBlockStream.cpp
+++ b/lib/common/MemBlockStream.cpp
@@ -179,7 +179,7 @@ IOStream::pos_type MemBlockStream::BytesLeftToRead()
// Created: 2003/09/05
//
// --------------------------------------------------------------------------
-void MemBlockStream::Write(const void *pBuffer, int NBytes)
+void MemBlockStream::Write(const void *pBuffer, int NBytes, int Timeout)
{
THROW_EXCEPTION(CommonException, MemBlockStreamNotSupported)
}
diff --git a/lib/common/MemBlockStream.h b/lib/common/MemBlockStream.h
index 98398121..1ba4b0a6 100644
--- a/lib/common/MemBlockStream.h
+++ b/lib/common/MemBlockStream.h
@@ -38,7 +38,8 @@ public:
virtual int Read(void *pBuffer, int NBytes, int Timeout = IOStream::TimeOutInfinite);
virtual pos_type BytesLeftToRead();
- virtual void Write(const void *pBuffer, int NBytes);
+ virtual void Write(const void *pBuffer, int NBytes,
+ int Timeout = IOStream::TimeOutInfinite);
virtual pos_type GetPosition() const;
virtual void Seek(pos_type Offset, int SeekType);
virtual bool StreamDataLeft();
diff --git a/lib/common/PartialReadStream.cpp b/lib/common/PartialReadStream.cpp
index f2f79715..b5f99bb5 100644
--- a/lib/common/PartialReadStream.cpp
+++ b/lib/common/PartialReadStream.cpp
@@ -104,7 +104,7 @@ IOStream::pos_type PartialReadStream::BytesLeftToRead()
// Created: 2003/08/26
//
// --------------------------------------------------------------------------
-void PartialReadStream::Write(const void *pBuffer, int NBytes)
+void PartialReadStream::Write(const void *pBuffer, int NBytes, int Timeout)
{
THROW_EXCEPTION(CommonException, CantWriteToPartialReadStream)
}
diff --git a/lib/common/PartialReadStream.h b/lib/common/PartialReadStream.h
index 1b46b0bd..61bdd7d1 100644
--- a/lib/common/PartialReadStream.h
+++ b/lib/common/PartialReadStream.h
@@ -33,7 +33,8 @@ private:
public:
virtual int Read(void *pBuffer, int NBytes, int Timeout = IOStream::TimeOutInfinite);
virtual pos_type BytesLeftToRead();
- virtual void Write(const void *pBuffer, int NBytes);
+ virtual void Write(const void *pBuffer, int NBytes,
+ int Timeout = IOStream::TimeOutInfinite);
virtual bool StreamDataLeft();
virtual bool StreamClosed();
diff --git a/lib/common/RateLimitingStream.h b/lib/common/RateLimitingStream.h
index a322b99b..cd9d8271 100644
--- a/lib/common/RateLimitingStream.h
+++ b/lib/common/RateLimitingStream.h
@@ -30,9 +30,10 @@ public:
int Timeout = IOStream::TimeOutInfinite);
// Everything else is delegated to the sink
- virtual void Write(const void *pBuffer, int NBytes)
+ virtual void Write(const void *pBuffer, int NBytes,
+ int Timeout = IOStream::TimeOutInfinite)
{
- Write(pBuffer, NBytes);
+ Write(pBuffer, NBytes, Timeout);
}
virtual pos_type BytesLeftToRead()
{
diff --git a/lib/common/ReadGatherStream.cpp b/lib/common/ReadGatherStream.cpp
index f50e6664..ae252832 100644
--- a/lib/common/ReadGatherStream.cpp
+++ b/lib/common/ReadGatherStream.cpp
@@ -213,7 +213,7 @@ IOStream::pos_type ReadGatherStream::BytesLeftToRead()
// Created: 10/12/03
//
// --------------------------------------------------------------------------
-void ReadGatherStream::Write(const void *pBuffer, int NBytes)
+void ReadGatherStream::Write(const void *pBuffer, int NBytes, int Timeout)
{
THROW_EXCEPTION(CommonException, CannotWriteToReadGatherStream);
}
diff --git a/lib/common/ReadGatherStream.h b/lib/common/ReadGatherStream.h
index 613ede3e..9a44480b 100644
--- a/lib/common/ReadGatherStream.h
+++ b/lib/common/ReadGatherStream.h
@@ -37,7 +37,8 @@ public:
virtual int Read(void *pBuffer, int NBytes, int Timeout = IOStream::TimeOutInfinite);
virtual pos_type BytesLeftToRead();
- virtual void Write(const void *pBuffer, int NBytes);
+ virtual void Write(const void *pBuffer, int NBytes,
+ int Timeout = IOStream::TimeOutInfinite);
virtual bool StreamDataLeft();
virtual bool StreamClosed();
virtual pos_type GetPosition() const;
diff --git a/lib/common/ReadLoggingStream.cpp b/lib/common/ReadLoggingStream.cpp
index 54c99c95..df493344 100644
--- a/lib/common/ReadLoggingStream.cpp
+++ b/lib/common/ReadLoggingStream.cpp
@@ -96,7 +96,7 @@ IOStream::pos_type ReadLoggingStream::BytesLeftToRead()
// Created: 2003/07/31
//
// --------------------------------------------------------------------------
-void ReadLoggingStream::Write(const void *pBuffer, int NBytes)
+void ReadLoggingStream::Write(const void *pBuffer, int NBytes, int Timeout)
{
THROW_EXCEPTION(CommonException, NotSupported);
}
diff --git a/lib/common/ReadLoggingStream.h b/lib/common/ReadLoggingStream.h
index b23b542c..4a01a45c 100644
--- a/lib/common/ReadLoggingStream.h
+++ b/lib/common/ReadLoggingStream.h
@@ -39,7 +39,8 @@ public:
virtual int Read(void *pBuffer, int NBytes, int Timeout = IOStream::TimeOutInfinite);
virtual pos_type BytesLeftToRead();
- virtual void Write(const void *pBuffer, int NBytes);
+ virtual void Write(const void *pBuffer, int NBytes,
+ int Timeout = IOStream::TimeOutInfinite);
virtual pos_type GetPosition() const;
virtual void Seek(IOStream::pos_type Offset, int SeekType);
virtual void Close();
diff --git a/lib/common/SelfFlushingStream.h b/lib/common/SelfFlushingStream.h
index 6865ab96..b4efa294 100644
--- a/lib/common/SelfFlushingStream.h
+++ b/lib/common/SelfFlushingStream.h
@@ -56,9 +56,10 @@ public:
{
return mrSource.BytesLeftToRead();
}
- virtual void Write(const void *pBuffer, int NBytes)
+ virtual void Write(const void *pBuffer, int NBytes,
+ int Timeout = IOStream::TimeOutInfinite)
{
- mrSource.Write(pBuffer, NBytes);
+ mrSource.Write(pBuffer, NBytes, Timeout);
}
virtual bool StreamDataLeft()
{
diff --git a/lib/common/StreamableMemBlock.cpp b/lib/common/StreamableMemBlock.cpp
index b376f037..be3d0031 100644
--- a/lib/common/StreamableMemBlock.cpp
+++ b/lib/common/StreamableMemBlock.cpp
@@ -252,7 +252,9 @@ void StreamableMemBlock::ReadFromStream(IOStream &rStream, int Timeout)
{
// Get the size of the block
int32_t size_s;
- if(!rStream.ReadFullBuffer(&size_s, sizeof(size_s), 0 /* not interested in bytes read if this fails */))
+ if(!rStream.ReadFullBuffer(&size_s, sizeof(size_s),
+ 0, /* not interested in bytes read if this fails */
+ Timeout))
{
THROW_EXCEPTION(CommonException, StreamableMemBlockIncompleteRead)
}
@@ -270,7 +272,9 @@ void StreamableMemBlock::ReadFromStream(IOStream &rStream, int Timeout)
try
{
// Read in
- if(!rStream.ReadFullBuffer(pblock, size, 0 /* not interested in bytes read if this fails */))
+ if(!rStream.ReadFullBuffer(pblock, size,
+ 0, /* not interested in bytes read if this fails */
+ Timeout))
{
THROW_EXCEPTION(CommonException, StreamableMemBlockIncompleteRead)
}
diff --git a/lib/common/ZeroStream.cpp b/lib/common/ZeroStream.cpp
index d11ed80c..e1342e6f 100644
--- a/lib/common/ZeroStream.cpp
+++ b/lib/common/ZeroStream.cpp
@@ -76,7 +76,7 @@ IOStream::pos_type ZeroStream::BytesLeftToRead()
// Created: 2003/07/31
//
// --------------------------------------------------------------------------
-void ZeroStream::Write(const void *pBuffer, int NBytes)
+void ZeroStream::Write(const void *pBuffer, int NBytes, int Timeout)
{
THROW_EXCEPTION(CommonException, NotSupported);
}
diff --git a/lib/common/ZeroStream.h b/lib/common/ZeroStream.h
index 0119045b..f91221b0 100644
--- a/lib/common/ZeroStream.h
+++ b/lib/common/ZeroStream.h
@@ -22,7 +22,8 @@ public:
virtual int Read(void *pBuffer, int NBytes, int Timeout = IOStream::TimeOutInfinite);
virtual pos_type BytesLeftToRead();
- virtual void Write(const void *pBuffer, int NBytes);
+ virtual void Write(const void *pBuffer, int NBytes,
+ int Timeout = IOStream::TimeOutInfinite);
virtual pos_type GetPosition() const;
virtual void Seek(IOStream::pos_type Offset, int SeekType);
virtual void Close();