edits
[iotcloud.git] / version2 / src / C / Slot.cc
index 4a6f268d016ac2d4418b0bb100274b7449c8a0ea..644854e56d6bdc145b5b7577ff7b647b18560f0a 100644 (file)
@@ -17,7 +17,8 @@ Slot::Slot(Table *_table, int64_t _seqnum, int64_t _machineid, Array<char> *_pre
        seqnumlive(true),
        freespace(SLOT_SIZE - getBaseSize()),
        table(_table),
-       localSequenceNumber(_localSequenceNumber) {
+       localSequenceNumber(_localSequenceNumber),
+       fakeLastMessage(NULL) {
 }
 
 Slot::Slot(Table *_table, int64_t _seqnum, int64_t _machineid, Array<char> *_prevhmac, int64_t _localSequenceNumber) :
@@ -30,7 +31,8 @@ Slot::Slot(Table *_table, int64_t _seqnum, int64_t _machineid, Array<char> *_pre
        seqnumlive(true),
        freespace(SLOT_SIZE - getBaseSize()),
        table(_table),
-       localSequenceNumber(_localSequenceNumber) {
+       localSequenceNumber(_localSequenceNumber),
+       fakeLastMessage(NULL) {
 }
 
 Slot::Slot(Table *_table, int64_t _seqnum, int64_t _machineid, int64_t _localSequenceNumber) :
@@ -43,7 +45,8 @@ Slot::Slot(Table *_table, int64_t _seqnum, int64_t _machineid, int64_t _localSeq
        seqnumlive(true),
        freespace(SLOT_SIZE - getBaseSize()),
        table(_table),
-       localSequenceNumber(_localSequenceNumber) {
+       localSequenceNumber(_localSequenceNumber),
+       fakeLastMessage(NULL) {
 }
 
 Slot::~Slot() {
@@ -53,6 +56,8 @@ Slot::~Slot() {
        for(uint i=0; i< entries->size(); i++)
                delete entries->get(i);
        delete entries;
+       if (fakeLastMessage)
+               delete fakeLastMessage;
 }
 
 Entry *Slot::addEntry(Entry *e) {
@@ -153,9 +158,11 @@ Vector<Entry *> *Slot::getLiveEntries(bool resize) {
                }
        }
 
-       if (seqnumlive && !resize)
-               liveEntries->add(new LastMessage(this, machineid, seqnum));
-
+       if (seqnumlive && !resize) {
+               if (! fakeLastMessage)
+                       fakeLastMessage = new LastMessage(this, machineid, seqnum);
+               liveEntries->add(fakeLastMessage);
+       }
        return liveEntries;
 }
 
@@ -186,5 +193,8 @@ Array<char> *Slot::getSlotCryptIV() {
        buffer->putLong(machineid);
        int64_t localSequenceNumberShift = localSequenceNumber << 16;
        buffer->putLong(localSequenceNumberShift);
-       return buffer->array();
+       Array<char> * array = buffer->array();
+       buffer->releaseArray();
+       delete buffer;
+       return array;
 }