}
};
+template<typename A, typename B>
+inline unsigned int pairHashFunction(Pair<A, B> p) {
+ return (p.getFirst() << 1) ^ p.getSecond();
+}
+
+template<typename A, typename B>
+inline bool pairEquals(Pair<A, B> a, Pair<A, B> b) {
+ return ( a.getFirst() == b.getFirst() ) && (a.getSecond() == b.getSecond());
+}
+
+inline unsigned int pairHashFunction(Pair<int64_t, int64_t> p) {
+ return (p.getFirst() << 1) ^ p.getSecond();
+}
+
+inline bool pairEquals(Pair<int64_t, int64_t> a, Pair<int64_t, int64_t> b) {
+ return ( a.getFirst() == b.getFirst() ) && (a.getSecond() == b.getSecond());
+}
#endif
Hashtable<int64_t, Pair<int64_t, Liveness *> > *lastMessageTable; // Last message sent by a client machine id -> (Seq Num, Slot or LastMessage);
Hashtable<int64_t, Hashset<RejectedMessage *> *> *rejectedMessageWatchVectorTable; // Table of machine Ids and the set of rejected messages they have not seen yet
Hashtable<IoTString *, int64_t> *arbitratorTable;// Table of keys and their arbitrators
- Hashtable<Pair<int64_t, int64_t>, Abort *> *liveAbortTable;// Table live abort messages
- Hashtable<int64_t, Hashtable<Pair<int64_t, int32_t>, TransactionPart *> *> *newTransactionParts; // transaction parts that are seen in this latest round of slots from the server
- Hashtable<int64_t, Hashtable<Pair<int64_t, int32_t>, CommitPart *> *> *newCommitParts; // commit parts that are seen in this latest round of slots from the server
+ Hashtable<Pair<int64_t, int64_t>, Abort *, uintptr_t, 0, pairHashFunction, pairEquals> *liveAbortTable;// Table live abort messages
+ Hashtable<int64_t, Hashtable<Pair<int64_t, int32_t>, TransactionPart *, uintptr_t, 0, pairHashFunction, pairEquals> *> *newTransactionParts; // transaction parts that are seen in this latest round of slots from the server
+ Hashtable<int64_t, Hashtable<Pair<int64_t, int32_t>, CommitPart *, uintptr_t, 0, pairHashFunction, pairEquals> *> *newCommitParts; // commit parts that are seen in this latest round of slots from the server
Hashtable<int64_t, int64_t> *lastArbitratedTransactionNumberByArbitratorTable; // Last transaction sequence number that an arbitrator arbitrated on
Hashtable<int64_t, Transaction *> *liveTransactionBySequenceNumberTable; // live transaction grouped by the sequence number
- Hashtable<Pair<int64_t, int64_t>, Transaction *> *liveTransactionByTransactionIdTable; // live transaction grouped by the transaction ID
+ Hashtable<Pair<int64_t, int64_t>, Transaction *, uintptr_t, 0, pairHashFunction, pairEquals> *liveTransactionByTransactionIdTable; // live transaction grouped by the transaction ID
Hashtable<int64_t, Hashtable<int64_t, Commit *> > *liveCommitsTable;
Hashtable<IoTString *, Commit *> *liveCommitsByKeyTable;
Hashtable<int64_t, int64_t> *lastCommitSeenSequenceNumberByArbitratorTable;
Hashtable<Transaction *, Vector<int32_t> *> *transactionPartsSent;
Hashtable<int64_t, TransactionStatus *> *outstandingTransactionStatus;
Hashtable<int64_t, Abort *> *liveAbortsGeneratedByLocal;
- Hashset<Pair<int64_t, int64_t> > *offlineTransactionsCommittedAndAtServer;
+ Hashset<Pair<int64_t, int64_t>, uintptr_t, 0, pairHashFunction, pairEquals> *offlineTransactionsCommittedAndAtServer;
Hashtable<int64_t, Pair<IoTString *, int32_t> > *localCommunicationTable;
Hashtable<int64_t, int64_t> *lastTransactionSeenFromMachineFromServer;
Hashtable<int64_t, int64_t> *lastArbitrationDataLocalSequenceNumberSeenFromArbitrator;