[PATCH 08/12] Orderbook delta msg cleanup


Ian Bell <IBell@...>
 

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

 




Please consider the environment before printing this e-mail.

This e-mail may contain confidential and/or privileged information. If you are not the intended recipient or have received this e-mail in error, please advise the sender immediately by reply e-mail and delete this message and any attachments without retaining a copy.

Any unauthorised copying, disclosure or distribution of the material in this e-mail is strictly forbidden.

Join Openmama-dev@lists.openmama.org to automatically receive all group messages.