summaryrefslogtreecommitdiff
path: root/cpp/src/Ice/BasicStream.cpp
diff options
context:
space:
mode:
authorMarc Laukien <marc@zeroc.com>2005-02-02 15:00:29 +0000
committerMarc Laukien <marc@zeroc.com>2005-02-02 15:00:29 +0000
commit1adab5451bb6db756529cf48a9cb8dffa0f65d28 (patch)
tree2a4994d17b6ea27c8c0e68a98fb8ac059d0e4599 /cpp/src/Ice/BasicStream.cpp
parentfix (diff)
downloadice-1adab5451bb6db756529cf48a9cb8dffa0f65d28.tar.bz2
ice-1adab5451bb6db756529cf48a9cb8dffa0f65d28.tar.xz
ice-1adab5451bb6db756529cf48a9cb8dffa0f65d28.zip
todo items
Diffstat (limited to 'cpp/src/Ice/BasicStream.cpp')
-rw-r--r--cpp/src/Ice/BasicStream.cpp123
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.
{