diff options
| author | Andrew Stitcher <astitcher@apache.org> | 2012-08-10 17:27:28 +0000 |
|---|---|---|
| committer | Andrew Stitcher <astitcher@apache.org> | 2012-08-10 17:27:28 +0000 |
| commit | a1947442559323f1eb5e8eb4c67983d69ac2c65a (patch) | |
| tree | 02bcec3bff8863990410f1ecf5f86ff7cef83bf4 /cpp/src/qpid/sys/AsynchIOHandler.cpp | |
| parent | 83cd0d00a444d1e1b5f8e15135bf377eba03388d (diff) | |
| download | qpid-python-a1947442559323f1eb5e8eb4c67983d69ac2c65a.tar.gz | |
Rearrange buffer memory ownership to avoid leaking buffer memory
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@1371774 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/sys/AsynchIOHandler.cpp')
| -rw-r--r-- | cpp/src/qpid/sys/AsynchIOHandler.cpp | 44 |
1 files changed, 16 insertions, 28 deletions
diff --git a/cpp/src/qpid/sys/AsynchIOHandler.cpp b/cpp/src/qpid/sys/AsynchIOHandler.cpp index 8a485db72d..2e117a3fb7 100644 --- a/cpp/src/qpid/sys/AsynchIOHandler.cpp +++ b/cpp/src/qpid/sys/AsynchIOHandler.cpp @@ -33,15 +33,6 @@ namespace qpid { namespace sys { -// Buffer definition -struct Buff : public AsynchIO::BufferBase { - Buff() : - AsynchIO::BufferBase(new char[65536], 65536) - {} - ~Buff() - { delete [] bytes;} -}; - struct ProtocolTimeoutTask : public sys::TimerTask { AsynchIOHandler& handler; std::string id; @@ -79,7 +70,7 @@ AsynchIOHandler::~AsynchIOHandler() { delete codec; } -void AsynchIOHandler::init(qpid::sys::AsynchIO* a, qpid::sys::Timer& timer, uint32_t maxTime, int numBuffs) { +void AsynchIOHandler::init(qpid::sys::AsynchIO* a, qpid::sys::Timer& timer, uint32_t maxTime) { aio = a; // Start timer for this connection @@ -87,17 +78,14 @@ void AsynchIOHandler::init(qpid::sys::AsynchIO* a, qpid::sys::Timer& timer, uint timer.add(timeoutTimerTask); // Give connection some buffers to use - for (int i = 0; i < numBuffs; i++) { - aio->queueReadBuffer(new Buff); - } + aio->createBuffers(); } void AsynchIOHandler::write(const framing::ProtocolInitiation& data) { QPID_LOG(debug, "SENT [" << identifier << "]: INIT(" << data << ")"); AsynchIO::BufferBase* buff = aio->getQueuedBuffer(); - if (!buff) - buff = new Buff; + assert(buff); framing::Buffer out(buff->bytes, buff->byteCount); data.encode(out); buff->dataCount = data.encodedSize(); @@ -244,24 +232,24 @@ void AsynchIOHandler::idle(AsynchIO&){ return; } if (codec == 0) return; - try { - if (codec->canEncode()) { - // Try and get a queued buffer if not then construct new one - AsynchIO::BufferBase* buff = aio->getQueuedBuffer(); - if (!buff) buff = new Buff; + if (!codec->canEncode()) { + return; + } + AsynchIO::BufferBase* buff = aio->getQueuedBuffer(); + if (buff) { + try { size_t encoded=codec->encode(buff->bytes, buff->byteCount); buff->dataCount = encoded; aio->queueWrite(buff); + if (!codec->isClosed()) { + return; + } + } catch (const std::exception& e) { + QPID_LOG(error, e.what()); } - if (codec->isClosed()) { - readError = true; - aio->queueWriteClose(); - } - } catch (const std::exception& e) { - QPID_LOG(error, e.what()); - readError = true; - aio->queueWriteClose(); } + readError = true; + aio->queueWriteClose(); } }} // namespace qpid::sys |
