diff options
Diffstat (limited to 'cpp/src/Ice/BasicStream.cpp')
-rw-r--r-- | cpp/src/Ice/BasicStream.cpp | 123 |
1 files changed, 106 insertions, 17 deletions
diff --git a/cpp/src/Ice/BasicStream.cpp b/cpp/src/Ice/BasicStream.cpp index 4fac52e40a5..3a99f7ab4a6 100644 --- a/cpp/src/Ice/BasicStream.cpp +++ b/cpp/src/Ice/BasicStream.cpp @@ -58,14 +58,14 @@ IceInternal::BasicStream::BasicStream(Instance* instance) : IceInternal::BasicStream::~BasicStream() { - while(_currentReadEncaps) + while(_currentReadEncaps && _currentReadEncaps != &_preAllocatedReadEncaps) { ReadEncaps* oldEncaps = _currentReadEncaps; _currentReadEncaps = _currentReadEncaps->previous; delete oldEncaps; } - while(_currentWriteEncaps) + while(_currentWriteEncaps && _currentWriteEncaps != &_preAllocatedWriteEncaps) { WriteEncaps* oldEncaps = _currentWriteEncaps; _currentWriteEncaps = _currentWriteEncaps->previous; @@ -95,8 +95,16 @@ IceInternal::BasicStream::swap(BasicStream& other) b.swap(other.b); std::swap(i, other.i); + + // + // Swap is never called for BasicStreams that still have a current + // read or write encapsulation. + // std::swap(_currentReadEncaps, other._currentReadEncaps); std::swap(_currentWriteEncaps, other._currentWriteEncaps); + _preAllocatedReadEncaps.swap(other._preAllocatedReadEncaps); + _preAllocatedWriteEncaps.swap(other._preAllocatedWriteEncaps); + std::swap(_seqDataStack, other._seqDataStack); std::swap(_objectList, other._objectList); } @@ -238,7 +246,7 @@ IceInternal::BasicStream::endSeq(int sz) } IceInternal::BasicStream::WriteEncaps::WriteEncaps() - : writeIndex(0), toBeMarshaledMap(0), marshaledMap(0), typeIdMap(0), typeIdIndex(0), previous(0) + : writeIndex(0), toBeMarshaledMap(0), marshaledMap(0), typeIdMap(0), typeIdIndex(0)//, previous(0) { } @@ -250,10 +258,46 @@ IceInternal::BasicStream::WriteEncaps::~WriteEncaps() } void +IceInternal::BasicStream::WriteEncaps::reset() +{ + delete toBeMarshaledMap; + delete marshaledMap; + delete typeIdMap; + + writeIndex = 0; + toBeMarshaledMap = 0; + marshaledMap = 0; + typeIdMap = 0; + typeIdIndex = 0; +// previous = 0; +} + +void +IceInternal::BasicStream::WriteEncaps::swap(WriteEncaps& other) +{ + std::swap(start, other.start); + + std::swap(writeIndex, other.writeIndex); + std::swap(toBeMarshaledMap, other.toBeMarshaledMap); + std::swap(marshaledMap, other.marshaledMap); + std::swap(typeIdMap, other.typeIdMap); + std::swap(typeIdIndex, other.typeIdIndex); + + std::swap(previous, other.previous); +} + +void IceInternal::BasicStream::startWriteEncaps() { WriteEncaps* oldEncaps = _currentWriteEncaps; - _currentWriteEncaps = new WriteEncaps(); + if(!oldEncaps) // First allocated encaps? + { + _currentWriteEncaps = &_preAllocatedWriteEncaps; + } + else + { + _currentWriteEncaps = new WriteEncaps(); + } _currentWriteEncaps->previous = oldEncaps; _currentWriteEncaps->start = b.size(); @@ -286,11 +330,18 @@ IceInternal::BasicStream::endWriteEncaps() WriteEncaps* oldEncaps = _currentWriteEncaps; _currentWriteEncaps = _currentWriteEncaps->previous; - delete oldEncaps; + if(oldEncaps == &_preAllocatedWriteEncaps) + { + oldEncaps->reset(); + } + else + { + delete oldEncaps; + } } IceInternal::BasicStream::ReadEncaps::ReadEncaps() - : patchMap(0), unmarshaledMap(0), typeIdMap(0), typeIdIndex(0), previous(0) + : patchMap(0), unmarshaledMap(0), typeIdMap(0), typeIdIndex(0)//, previous(0) { } @@ -302,10 +353,48 @@ IceInternal::BasicStream::ReadEncaps::~ReadEncaps() } void +IceInternal::BasicStream::ReadEncaps::reset() +{ + delete patchMap; + delete unmarshaledMap; + delete typeIdMap; + + patchMap = 0; + unmarshaledMap = 0; + typeIdMap = 0; + typeIdIndex = 0; +// previous = 0; +} + +void +IceInternal::BasicStream::ReadEncaps::swap(ReadEncaps& other) +{ + std::swap(start, other.start); + std::swap(sz, other.sz); + + std::swap(encodingMajor, other.encodingMajor); + std::swap(encodingMinor, other.encodingMinor); + + std::swap(patchMap, other.patchMap); + std::swap(unmarshaledMap, other.unmarshaledMap); + std::swap(typeIdMap, other.typeIdMap); + std::swap(typeIdIndex, other.typeIdIndex); + + std::swap(previous, other.previous); +} + +void IceInternal::BasicStream::startReadEncaps() { ReadEncaps* oldEncaps = _currentReadEncaps; - _currentReadEncaps = new ReadEncaps(); + if(!oldEncaps) // First allocated encaps? + { + _currentReadEncaps = &_preAllocatedReadEncaps; + } + else + { + _currentReadEncaps = new ReadEncaps(); + } _currentReadEncaps->previous = oldEncaps; _currentReadEncaps->start = i - b.begin(); @@ -356,7 +445,14 @@ IceInternal::BasicStream::endReadEncaps() ReadEncaps* oldEncaps = _currentReadEncaps; _currentReadEncaps = _currentReadEncaps->previous; - delete oldEncaps; + if(oldEncaps == &_preAllocatedReadEncaps) + { + oldEncaps->reset(); + } + else + { + delete oldEncaps; + } } void @@ -1258,11 +1354,7 @@ IceInternal::BasicStream::read(ObjectPrx& v) void IceInternal::BasicStream::write(const ObjectPtr& v) { - if(!_currentWriteEncaps) // Lazy initialization. - { - _currentWriteEncaps = new WriteEncaps(); - _currentWriteEncaps->start = b.size(); - } + assert(_currentWriteEncaps); if(!_currentWriteEncaps->toBeMarshaledMap) // Lazy initialization. { @@ -1310,10 +1402,7 @@ IceInternal::BasicStream::write(const ObjectPtr& v) void IceInternal::BasicStream::read(PatchFunc patchFunc, void* patchAddr) { - if(!_currentReadEncaps) // Lazy initialization. - { - _currentReadEncaps = new ReadEncaps(); - } + assert(_currentReadEncaps); if(!_currentReadEncaps->patchMap) // Lazy initialization. { |