Ref counting
[iotcloud.git] / version2 / src / C / Table.cc
index 1a33f76f1f1bc98f7e8c267e90e4ddc515655bc0..255ba3cf35bb3da7a02df7e59a9366fe88b472a0 100644 (file)
@@ -199,6 +199,13 @@ Table::~Table() {
                while (partsit->hasNext()) {
                        int64_t machineId = partsit->next();
                        Hashtable<Pair<int64_t, int32_t> *, TransactionPart *, uintptr_t, 0, pairHashFunction, pairEquals> *parts = partsit->currVal();
+                       SetIterator<Pair<int64_t, int32_t> *, TransactionPart *, uintptr_t, 0, pairHashFunction, pairEquals> *pit = getKeyIterator(parts);
+                       while(pit->hasNext()) {
+                               Pair<int64_t, int32_t> * pair=pit->next();
+                               pit->currVal()->releaseRef();
+                       }
+                       delete pit;
+                       
                        delete parts;
                }
                delete partsit;
@@ -209,6 +216,12 @@ Table::~Table() {
                while (partsit->hasNext()) {
                        int64_t machineId = partsit->next();
                        Hashtable<Pair<int64_t, int32_t> *, CommitPart *, uintptr_t, 0, pairHashFunction, pairEquals> *parts = partsit->currVal();
+                       SetIterator<Pair<int64_t, int32_t> *, CommitPart *, uintptr_t, 0, pairHashFunction, pairEquals> *pit = getKeyIterator(parts);
+                       while(pit->hasNext()) {
+                               Pair<int64_t, int32_t> * pair=pit->next();
+                               pit->currVal()->releaseRef();
+                       }
+                       delete pit;
                        delete parts;
                }
                delete partsit;
@@ -1628,7 +1641,7 @@ void Table::processNewTransactionParts() {
        SetIterator<int64_t, Hashtable<Pair<int64_t, int32_t> *, TransactionPart *, uintptr_t, 0, pairHashFunction, pairEquals> *> *tpit = getKeyIterator(newTransactionParts);
        while (tpit->hasNext()) {
                int64_t machineId = tpit->next();
-               Hashtable<Pair<int64_t, int32_t> *, TransactionPart *, uintptr_t, 0, pairHashFunction, pairEquals> *parts = newTransactionParts->get(machineId);
+               Hashtable<Pair<int64_t, int32_t> *, TransactionPart *, uintptr_t, 0, pairHashFunction, pairEquals> *parts = tpit->currVal();
 
                SetIterator<Pair<int64_t, int32_t> *, TransactionPart *, uintptr_t, 0, pairHashFunction, pairEquals> *ptit = getKeyIterator(parts);
                // Iterate through all the parts for that machine Id
@@ -1641,6 +1654,7 @@ void Table::processNewTransactionParts() {
                                if (lastTransactionNumber >= part->getSequenceNumber()) {
                                        // Set dead the transaction part
                                        part->setDead();
+                                       part->releaseRef();
                                        continue;
                                }
                        }
@@ -1659,6 +1673,7 @@ void Table::processNewTransactionParts() {
                                liveTransactionBySequenceNumberTable->put(part->getSequenceNumber(), transaction);
                                liveTransactionByTransactionIdTable->put(transaction->getId(), transaction);
                        }
+                       part->releaseRef();
                }
                delete ptit;
        }
@@ -1854,7 +1869,7 @@ Pair<bool, bool> Table::arbitrateOnLocalTransaction(Transaction *transaction) {
                SetIterator<KeyValue *, KeyValue *> *kvit = transaction->getKeyValueUpdateSet()->iterator();
                while (kvit->hasNext()) {
                        KeyValue *kv = kvit->next();
-                       newCommit->addKV(kv->getCopy());
+                       newCommit->addKV(kv);
                }
                delete kvit;
 
@@ -2052,7 +2067,7 @@ bool Table::updateCommittedTable() {
                SetIterator<Pair<int64_t, int32_t> *, CommitPart *, uintptr_t, 0, pairHashFunction, pairEquals> *pairit = getKeyIterator(parts);
                while (pairit->hasNext()) {
                        Pair<int64_t, int32_t> *partId = pairit->next();
-                       CommitPart *part = parts->get(partId);
+                       CommitPart *part = pairit->currVal();
 
                        // Get the transaction object for that sequence number
                        Hashtable<int64_t, Commit *> *commitForClientTable = liveCommitsTable->get(part->getMachineId());
@@ -2075,6 +2090,7 @@ bool Table::updateCommittedTable() {
 
                        // Add that part to the commit
                        commit->addPartDecode(part);
+                       part->releaseRef();
                }
                delete pairit;
                delete parts;
@@ -2680,8 +2696,10 @@ void Table::processEntry(TransactionPart *entry) {
 
        // Update the part and set dead ones we have already seen (got a
        // rescued version)
+       entry->acquireRef();
        TransactionPart *previouslySeenPart = transactionPart->put(entry->getPartId(), entry);
        if (previouslySeenPart != NULL) {
+               previouslySeenPart->releaseRef();
                previouslySeenPart->setDead();
        }
 }
@@ -2706,9 +2724,11 @@ void Table::processEntry(CommitPart *entry) {
        }
        // Update the part and set dead ones we have already seen (got a
        // rescued version)
+       entry->acquireRef();
        CommitPart *previouslySeenPart = commitPart->put(entry->getPartId(), entry);
        if (previouslySeenPart != NULL) {
                previouslySeenPart->setDead();
+               previouslySeenPart->releaseRef();
        }
 }