diff options
author | Chris Wilson <chris+github@qwirx.com> | 2014-08-15 22:47:44 +0000 |
---|---|---|
committer | Chris Wilson <chris+github@qwirx.com> | 2014-08-15 22:47:44 +0000 |
commit | 4458bf17916973aeb9e99e9166070f645fb3295e (patch) | |
tree | 26dee42145e176b7ec3c3f233c79afc7b3270557 /lib/common | |
parent | 06960c6241f6209b6dd19b4c204c27f1395cda7d (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.cpp | 2 | ||||
-rw-r--r-- | lib/common/BufferedStream.h | 3 | ||||
-rw-r--r-- | lib/common/BufferedWriteStream.cpp | 2 | ||||
-rw-r--r-- | lib/common/BufferedWriteStream.h | 3 | ||||
-rw-r--r-- | lib/common/CollectInBufferStream.cpp | 2 | ||||
-rw-r--r-- | lib/common/CollectInBufferStream.h | 3 | ||||
-rw-r--r-- | lib/common/FileStream.cpp | 2 | ||||
-rw-r--r-- | lib/common/FileStream.h | 3 | ||||
-rw-r--r-- | lib/common/IOStream.h | 3 | ||||
-rw-r--r-- | lib/common/MemBlockStream.cpp | 2 | ||||
-rw-r--r-- | lib/common/MemBlockStream.h | 3 | ||||
-rw-r--r-- | lib/common/PartialReadStream.cpp | 2 | ||||
-rw-r--r-- | lib/common/PartialReadStream.h | 3 | ||||
-rw-r--r-- | lib/common/RateLimitingStream.h | 5 | ||||
-rw-r--r-- | lib/common/ReadGatherStream.cpp | 2 | ||||
-rw-r--r-- | lib/common/ReadGatherStream.h | 3 | ||||
-rw-r--r-- | lib/common/ReadLoggingStream.cpp | 2 | ||||
-rw-r--r-- | lib/common/ReadLoggingStream.h | 3 | ||||
-rw-r--r-- | lib/common/SelfFlushingStream.h | 5 | ||||
-rw-r--r-- | lib/common/StreamableMemBlock.cpp | 8 | ||||
-rw-r--r-- | lib/common/ZeroStream.cpp | 2 | ||||
-rw-r--r-- | lib/common/ZeroStream.h | 3 |
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(); |