Ref counting
[iotcloud.git] / version2 / src / C / CommitPart.h
index 6edba907ece0a87be4d94ecb47776f5a234c225e..7b8be2e8450c76c67a8aa096be23680b73e57706 100644 (file)
-
-
-
-
-class CommitPart extends Entry{
-
-    // Max size of the part excluding the fixed size header
-    public static final int MAX_NON_HEADER_SIZE = 512;
-
-
-    // Sequence number of the transaction this commit is for, -1 if not a cloud transaction
-    private int64_t machineId = -1; // Machine Id of the device that made the commit
-    private int64_t sequenceNumber = -1; // commit sequence number for this arbitrator
-    private int64_t transactionSequenceNumber = -1;
-    private int partNumber = -1; // Parts position in the
-    private Boolean isLastPart = false;
-    private char[] data = NULL;
-
-    private Pair<Long, Integer> partId = NULL;
-    private Pair<Long, Long> commitId = NULL;
-
-
-    public CommitPart(Slot s, int64_t _machineId, int64_t _sequenceNumber, int64_t _transactionSequenceNumber, int _partNumber, char[] _data, Boolean _isLastPart) {
-        super(s);
-        machineId = _machineId;
-        sequenceNumber = _sequenceNumber;
-        transactionSequenceNumber = _transactionSequenceNumber;
-        partNumber = _partNumber;
-        isLastPart = _isLastPart;
-        data = _data;
-
-        partId = new Pair<Long, Integer>(sequenceNumber, partNumber);
-        commitId = new Pair<Long, Long>(machineId, sequenceNumber);
-    }
-
-    public int getSize() {
-        if (data == NULL) {
-            return (3 * sizeof(int64_t)) + (2 * sizeof(int32_t)) + (2 * sizeof(char));
-        }
-        return (3 * sizeof(int64_t)) + (2 * sizeof(int32_t)) + (2 * sizeof(char)) + data.length;
-    }
-
-    public void setSlot(Slot s) {
-        parentslot = s;
-    }
-
-    public int getPartNumber() {
-        return partNumber;
-    }
-
-    public int getDataSize() {
-        return data.length;
-    }
-
-    public char[] getData() {
-        return data;
-    }
-
-    public Pair<Long, Integer> getPartId() {
-        return partId;
-    }
-
-    public Pair<Long, Long> getCommitId() {
-        return commitId;
-    }
-
-    public Boolean isLastPart() {
-        return isLastPart;
-    }
-
-    public int64_t getMachineId() {
-        return machineId;
-    }
-
-    public int64_t getTransactionSequenceNumber() {
-        return transactionSequenceNumber;
-    }
-
-    public int64_t getSequenceNumber() {
-        return sequenceNumber;
-    }
-
-    static Entry decode(Slot s, ByteBuffer bb) {
-        int64_t machineId = bb.getLong();
-        int64_t sequenceNumber = bb.getLong();
-        int64_t transactionSequenceNumber = bb.getLong();
-        int partNumber = bb.getInt();
-        int dataSize = bb.getInt();
-        Boolean isLastPart = bb.get() == 1;
-
-        // Get the data
-        char[] data = new char[dataSize];
-        bb.get(data);
-
-        return new CommitPart(s, machineId, sequenceNumber, transactionSequenceNumber, partNumber, data, isLastPart);
-    }
-
-    public void encode(ByteBuffer bb) {
-        bb.put(Entry.TypeCommitPart);
-        bb.putLong(machineId);
-        bb.putLong(sequenceNumber);
-        bb.putLong(transactionSequenceNumber);
-        bb.putInt(partNumber);
-        bb.putInt(data.length);
-
-        if (isLastPart) {
-            bb.put((char)1);
-        } else {
-            bb.put((char)0);
-        }
-
-        bb.put(data);
-    }
-
-    public char getType() {
-        return Entry.TypeCommitPart;
-    }
-
-    public Entry getCopy(Slot s) {
-        return new CommitPart(s, machineId, sequenceNumber, transactionSequenceNumber, partNumber, data, isLastPart);
-    }
-}
+#ifndef COMMITPART_H
+#define COMMITPART_H
+#include "common.h"
+#include "Entry.h"
+#include "Pair.h"
+
+// Max size of the part excluding the fixed size header
+#define CommitPart_MAX_NON_HEADER_SIZE 512
+
+class CommitPart : public Entry {
+private:
+       // Sequence number of the transaction this commit is for, -1 if not a cloud transaction
+       int64_t machineId;              // Machine Id of the device that made the commit
+       int64_t sequenceNumber; // commit sequence number for this arbitrator
+       int64_t transactionSequenceNumber;
+       int32_t partNumber;     // Parts position in the
+       bool fldisLastPart;
+       int32_t refCount;
+       Array<char> *data;
+
+       Pair<int64_t, int32_t> partId;
+       Pair<int64_t, int64_t> commitId;
+
+public:
+       CommitPart(Slot *s, int64_t _machineId, int64_t _sequenceNumber, int64_t _transactionSequenceNumber, int _partNumber, Array<char> *_data, bool _isLastPart);
+       ~CommitPart();
+       int getSize();
+       int getPartNumber();
+       int getDataSize();
+       Array<char> *getData();
+       Pair<int64_t, int32_t> * getPartId();
+       Pair<int64_t, int64_t> getCommitId();
+       bool isLastPart();
+       int64_t getMachineId();
+       int64_t getTransactionSequenceNumber();
+       int64_t getSequenceNumber();
+       void encode(ByteBuffer *bb);
+       char getType();
+       Entry *getCopy(Slot *s);
+       void releaseRef() {if ((--refCount)==0) delete this;}   
+       void acquireRef() {refCount++;}
+};
+
+Entry *CommitPart_decode(Slot *s, ByteBuffer *bb);
+#endif