Ref counting
[iotcloud.git] / version2 / src / C / Commit.cc
index e01a778c419643cfa93495c87cd042694b941891..766584175f86a82c00442dd0bb3adf119e1a7420 100644 (file)
@@ -14,6 +14,7 @@ Commit::Commit() :
        sequenceNumber(-1),
        machineId(-1),
        transactionSequenceNumber(-1),
+       dataBytes(NULL),
        liveKeys(new Hashset<IoTString *>()) {
 }
 
@@ -28,11 +29,17 @@ Commit::Commit(int64_t _sequenceNumber, int64_t _machineId, int64_t _transaction
        sequenceNumber(_sequenceNumber),
        machineId(_machineId),
        transactionSequenceNumber(_transactionSequenceNumber),
+       dataBytes(NULL),
        liveKeys(new Hashset<IoTString *>()) {
 }
 
 Commit::~Commit() {
-       delete parts;
+       {
+               uint Size = parts->size();
+               for(uint i=0;i<Size; i++)
+                       parts->get(i)->releaseRef();
+               delete parts;
+       }
        {
                SetIterator<KeyValue *, KeyValue *, uintptr_t, 0> * keyit = keyValueUpdateSet->iterator();
                while(keyit->hasNext()) {
@@ -44,6 +51,8 @@ Commit::~Commit() {
        delete liveKeys;
        if (missingParts != NULL)
                delete missingParts;
+       if (dataBytes != NULL)
+               delete dataBytes;
 }
 
 void Commit::addPartDecode(CommitPart *newPart) {
@@ -53,6 +62,7 @@ void Commit::addPartDecode(CommitPart *newPart) {
                return;
        }
 
+       newPart->acquireRef();
        CommitPart *previouslySeenPart = parts->setExpand(newPart->getPartNumber(), newPart);
        if (previouslySeenPart == NULL)
                partCount++;
@@ -60,6 +70,7 @@ void Commit::addPartDecode(CommitPart *newPart) {
        if (previouslySeenPart != NULL) {
                // Set dead the old one since the new one is a rescued version of this part
                previouslySeenPart->setDead();
+               previouslySeenPart->releaseRef();
        } else if (newPart->isLastPart()) {
                missingParts = new Hashset<int32_t>();
                hasLastPart = true;
@@ -133,17 +144,17 @@ void Commit::setDead() {
                // Make all the parts of this transaction dead
                for (uint32_t partNumber = 0; partNumber < parts->size(); partNumber++) {
                        CommitPart *part = parts->get(partNumber);
-                       if (parts != NULL)
-                               part->setDead();
+                       part->setDead();
                }
        }
 }
 
-CommitPart *Commit::getPart(int index) {
-       return parts->get(index);
-}
-
 void Commit::createCommitParts() {
+       uint Size = parts->size();
+       for(uint i=0;i < Size; i++) {
+               Entry * e=parts->get(i);
+               e->releaseRef();
+       }
        parts->clear();
        partCount = 0;
        // Convert to chars