From 92cb8a42666a182b1300e64ce4479954b68d9a02 Mon Sep 17 00:00:00 2001
Message-Id: <92cb8a42666a182b1300e64ce4479954b68d9a02.1351009358.git.ibell@...>
In-Reply-To: <180145dfd9a175bb1b824b63df34a41b7e97d425.1351009358.git.ibell@...>
References: <180145dfd9a175bb1b824b63df34a41b7e97d425.1351009358.git.ibell@...>
From: Ian Bell <ibell@...>
Date: Tue, 23 Oct 2012 16:25:13 +0100
Subject: [PATCH 08/12] Orderbook delta msg cleanup
Fixed some memory leaks in connected with the orderbook writer and also
added some defensive code for edge conditions.
Signed-off-by: Ian Bell <ibell@...>
---
.../orderbooks/MamdaOrderBookBasicDeltaList.cpp | 11 ++
.../cpp/orderbooks/MamdaOrderBookPriceLevel.cpp | 10 +-
.../src/cpp/orderbooks/MamdaOrderBookWriter.cpp | 202 ++++++++++----------
3 files changed, 122 insertions(+), 101 deletions(-)
diff --git a/mamda/c_cpp/src/cpp/orderbooks/MamdaOrderBookBasicDeltaList.cpp b/mamda/c_cpp/src/cpp/orderbooks/MamdaOrderBookBasicDeltaList.cpp
index 908be47..581881a 100644
--- a/mamda/c_cpp/src/cpp/orderbooks/MamdaOrderBookBasicDeltaList.cpp
+++ b/mamda/c_cpp/src/cpp/orderbooks/MamdaOrderBookBasicDeltaList.cpp
@@ -91,6 +91,17 @@ namespace Wombat
{
clear();
delete mImpl.mDeltas; // can safely be NULL
+
+ if (mImpl.mBidLevelDeltas)
+ delete mImpl.mBidLevelDeltas;
+ if (mImpl.mAskLevelDeltas)
+ delete mImpl.mAskLevelDeltas;
+
+ if (mImpl.mBidEntryDeltas)
+ delete mImpl.mBidEntryDeltas;
+ if (mImpl.mAskEntryDeltas)
+ delete mImpl.mAskEntryDeltas;
+
delete &mImpl;
}
diff --git a/mamda/c_cpp/src/cpp/orderbooks/MamdaOrderBookPriceLevel.cpp b/mamda/c_cpp/src/cpp/orderbooks/MamdaOrderBookPriceLevel.cpp
index ef4a7ec..17f7e3b 100644
--- a/mamda/c_cpp/src/cpp/orderbooks/MamdaOrderBookPriceLevel.cpp
+++ b/mamda/c_cpp/src/cpp/orderbooks/MamdaOrderBookPriceLevel.cpp
@@ -646,7 +646,7 @@ namespace Wombat
// found it
existingEntry->setDetails (entry);
- if ((mBook) && (mBook->getGenerateDeltaMsgs()))
+ if (mBook && mBook->getGenerateDeltaMsgs())
{
mBook->addDelta(const_cast<MamdaOrderBookEntry*>(&entry), entry.getPriceLevel(),
entry.getPriceLevel()->getSizeChange(),
@@ -726,7 +726,7 @@ namespace Wombat
{
bool checkState = mBook ? mBook->getCheckSourceState() : false;
mEntries->erase(erasableIter);
- mBook->detach (entry);
+ if (mBook) mBook->detach (entry);
if (!checkState || entry->isVisible())
{
mSize -= entry->getSize();
@@ -734,6 +734,10 @@ namespace Wombat
mNumEntries--;
}
mNumEntriesTotal--;
+
+ // If we don't have any book the entry has not been detached to be reused
+ if (!mBook)
+ delete entry;
}
void MamdaOrderBookPriceLevel::MamdaOrderBookPriceLevelImpl::checkNotExist (
@@ -1017,7 +1021,7 @@ namespace Wombat
mNumEntriesTotal++;
newEntry = true;
- if (mBook->getGenerateDeltaMsgs())
+ if (mBook && mBook->getGenerateDeltaMsgs())
{
//Need to set correct action based on numEntries in level
MamdaOrderBookPriceLevel::Action plAction;
diff --git a/mamda/c_cpp/src/cpp/orderbooks/MamdaOrderBookWriter.cpp b/mamda/c_cpp/src/cpp/orderbooks/MamdaOrderBookWriter.cpp
index aa4bd78..d605ef0 100644
--- a/mamda/c_cpp/src/cpp/orderbooks/MamdaOrderBookWriter.cpp
+++ b/mamda/c_cpp/src/cpp/orderbooks/MamdaOrderBookWriter.cpp
@@ -290,114 +290,117 @@ namespace Wombat
size_t plCount = 0;
size_t entryCount = 0;
- for (; iter !=end; ++iter)
+ if (delta.getSize() > 0)
{
- basicDelta = *iter;
- pl = basicDelta->getPriceLevel();
-
- if (lastPl != pl)
+ for (; iter !=end; ++iter)
{
- if (lastPl != NULL)
+ basicDelta = *iter;
+ pl = basicDelta->getPriceLevel();
+
+ if (lastPl != pl)
{
- MamaMsg& plMsg = *mPricelevels->mMsgVector[plCount];
-
- addBookLevel (plMsg,
- lastPl,
- savedBasicDelta->getPlDeltaSize(),
- savedBasicDelta->getPlDeltaAction(),
- &(delta.getEventTime()));
-
- if (1 == entryCount)
- {
- addBookEntry (plMsg,
- flatEntryDelta->getEntry(),
- flatEntryDelta->getEntryDeltaAction(),
- &(flatEntryPl->getTime()));
-
- }
- if (entryCount > 1)
+ if (lastPl != NULL)
{
- plMsg.addVectorMsg (NULL,
- MamdaOrderBookFields::PL_ENTRIES->getFid(),
- mEntries->mMsgVector,
- entryCount);
+ MamaMsg& plMsg = *mPricelevels->mMsgVector[plCount];
+
+ addBookLevel (plMsg,
+ lastPl,
+ savedBasicDelta->getPlDeltaSize(),
+ savedBasicDelta->getPlDeltaAction(),
+ &(delta.getEventTime()));
+
+ if (1 == entryCount)
+ {
+ addBookEntry (plMsg,
+ flatEntryDelta->getEntry(),
+ flatEntryDelta->getEntryDeltaAction(),
+ &(flatEntryPl->getTime()));
+
+ }
+ if (entryCount > 1)
+ {
+ plMsg.addVectorMsg (NULL,
+ MamdaOrderBookFields::PL_ENTRIES->getFid(),
+ mEntries->mMsgVector,
+ entryCount);
+ }
+ if (defaultNumAttachedEntries != entryCount)
+ plMsg.addI16 (NULL,
+ MamdaOrderBookFields::PL_NUM_ATTACH->getFid(),
+ (mama_i16_t) entryCount);
+ ++plCount;
+ entryCount = 0;
}
- if (defaultNumAttachedEntries != entryCount)
- plMsg.addI16 (NULL,
- MamdaOrderBookFields::PL_NUM_ATTACH->getFid(),
- (mama_i16_t) entryCount);
- ++plCount;
- entryCount = 0;
+ lastPl = pl;
+ savedBasicDelta = basicDelta;
}
- lastPl = pl;
- savedBasicDelta = basicDelta;
- }
- if (basicDelta->getEntry() != NULL)
- {
- MamaMsg& entMsg = *mEntries->mMsgVector[entryCount];
-
- addBookEntry (entMsg,
- basicDelta->getEntry(),
- basicDelta->getEntryDeltaAction(),
- &(pl->getTime()));
- ++entryCount;
- //save this delta and pl
- //used to flatten entry info into pl when no. of entries = 1
- flatEntryDelta = basicDelta;
- flatEntryPl = pl;
- }
- }
-
- // Add the last entry vector and other price level fields to the
- // last price level message.
- MamaMsg& plMsg = *mPricelevels->mMsgVector[plCount];
-
- addBookLevel (plMsg, pl,
- savedBasicDelta->getPlDeltaSize(),
- savedBasicDelta->getPlDeltaAction(),
- &(delta.getEventTime()));
-
- if (1 == entryCount)
- {
- addBookEntry (plMsg, basicDelta->getEntry(),
- basicDelta->getEntryDeltaAction(),
- &(pl->getTime()));
+ if (basicDelta->getEntry() != NULL)
+ {
+ MamaMsg& entMsg = *mEntries->mMsgVector[entryCount];
+
+ addBookEntry (entMsg,
+ basicDelta->getEntry(),
+ basicDelta->getEntryDeltaAction(),
+ &(pl->getTime()));
+ ++entryCount;
+ //save this delta and pl
+ //used to flatten entry info into pl when no. of entries = 1
+ flatEntryDelta = basicDelta;
+ flatEntryPl = pl;
+ }
+ }
- }
- if (entryCount > 1)
- {
- plMsg.addVectorMsg (NULL,
- MamdaOrderBookFields::PL_ENTRIES->getFid(),
- mEntries->mMsgVector,
- entryCount);
+ // Add the last entry vector and other price level fields to the
+ // last price level message.
+ MamaMsg& plMsg = *mPricelevels->mMsgVector[plCount];
- }
-
- if (defaultNumAttachedEntries != entryCount)
- plMsg.addI16 (NULL,
- MamdaOrderBookFields::PL_NUM_ATTACH->getFid(),
- (mama_i16_t) entryCount);
- ++plCount;
-
- if (1 == plCount)
- {
- addBookLevel (msg, pl,
- basicDelta->getPlDeltaSize(),
- basicDelta->getPlDeltaAction(),
+ addBookLevel (plMsg, pl,
+ savedBasicDelta->getPlDeltaSize(),
+ savedBasicDelta->getPlDeltaAction(),
&(delta.getEventTime()));
+
if (1 == entryCount)
{
- addBookEntry (msg, basicDelta->getEntry(),
- basicDelta->getEntryDeltaAction(),
- &(pl->getTime()));
- }
+ addBookEntry (plMsg, basicDelta->getEntry(),
+ basicDelta->getEntryDeltaAction(),
+ &(pl->getTime()));
+
+ }
if (entryCount > 1)
{
- msg.addVectorMsg (NULL,
- MamdaOrderBookFields::PL_ENTRIES->getFid(),
- mEntries->mMsgVector,
- entryCount);
+ plMsg.addVectorMsg (NULL,
+ MamdaOrderBookFields::PL_ENTRIES->getFid(),
+ mEntries->mMsgVector,
+ entryCount);
+
+ }
+
+ if (defaultNumAttachedEntries != entryCount)
+ plMsg.addI16 (NULL,
+ MamdaOrderBookFields::PL_NUM_ATTACH->getFid(),
+ (mama_i16_t) entryCount);
+ ++plCount;
+
+ if (1 == plCount)
+ {
+ addBookLevel (msg, pl,
+ basicDelta->getPlDeltaSize(),
+ basicDelta->getPlDeltaAction(),
+ &(delta.getEventTime()));
+ if (1 == entryCount)
+ {
+ addBookEntry (msg, basicDelta->getEntry(),
+ basicDelta->getEntryDeltaAction(),
+ &(pl->getTime()));
+ }
+ if (entryCount > 1)
+ {
+ msg.addVectorMsg (NULL,
+ MamdaOrderBookFields::PL_ENTRIES->getFid(),
+ mEntries->mMsgVector,
+ entryCount);
+ }
}
}
@@ -540,10 +543,13 @@ namespace Wombat
addBookLevelEntries (plMsg, *pl);
}
- // Add the vector of plMsgs to the main msg
- msg.addVectorMsg (NULL, MamdaOrderBookFields::PRICE_LEVELS->getFid(),
- mPricelevels->mMsgVector,
- plCount);
+ if (plCount > 0)
+ {
+ // Add the vector of plMsgs to the main msg
+ msg.addVectorMsg (NULL, MamdaOrderBookFields::PRICE_LEVELS->getFid(),
+ mPricelevels->mMsgVector,
+ plCount);
+ }
msg.addI16 (NULL, MamdaOrderBookFields::NUM_LEVELS->getFid(),
(mama_i16_t)plCount);
--
1.7.9.5