tlds
Transactional Operations for Linked Data Structures
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
translist.h
Go to the documentation of this file.
1 #ifndef TRANSLIST_H
2 #define TRANSLIST_H
3 
4 #include <cstdint>
5 #include <vector>
6 #include "common/assert.h"
7 #include "common/allocator.h"
8 
9 class TransList
10 {
11 public:
12  enum OpStatus
13  {
14  ACTIVE = 0,
17  };
18 
20  {
21  OK = 0,
24  };
25 
26  enum OpType
27  {
28  FIND = 0,
31  };
32 
33  struct Operator
34  {
35  uint8_t type;
36  uint32_t key;
37  };
38 
39  struct Desc
40  {
41  static size_t SizeOf(uint8_t size)
42  {
43  return sizeof(uint8_t) + sizeof(uint8_t) + sizeof(Operator) * size;
44  }
45 
46  // Status of the transaction: values in [0, size] means live txn, values -1 means aborted, value -2 means committed.
47  volatile uint8_t status;
48  uint8_t size;
50  };
51 
52  struct NodeDesc
53  {
54  NodeDesc(Desc* _desc, uint8_t _opid)
55  : desc(_desc), opid(_opid){}
56 
58  uint8_t opid;
59  };
60 
61  struct Node
62  {
63  Node(): key(0), next(NULL), nodeDesc(NULL){}
64  Node(uint32_t _key, Node* _next, NodeDesc* _nodeDesc)
65  : key(_key), next(_next), nodeDesc(_nodeDesc){}
66 
67  uint32_t key;
69 
71  };
72 
73  struct HelpStack
74  {
75  void Init()
76  {
77  index = 0;
78  }
79 
80  void Push(Desc* desc)
81  {
82  ASSERT(index < 255, "index out of range");
83 
84  helps[index++] = desc;
85  }
86 
87  void Pop()
88  {
89  ASSERT(index > 0, "nothing to pop");
90 
91  index--;
92  }
93 
94  bool Contain(Desc* desc)
95  {
96  for(uint8_t i = 0; i < index; i++)
97  {
98  if(helps[i] == desc)
99  {
100  return true;
101  }
102  }
103 
104  return false;
105  }
106 
107  Desc* helps[256];
108  uint8_t index;
109  };
110 
111  TransList(Allocator<Node>* nodeAllocator, Allocator<Desc>* descAllocator, Allocator<NodeDesc>* nodeDescAllocator);
112  ~TransList();
113 
114  bool ExecuteOps(Desc* desc);
115 
116  Desc* AllocateDesc(uint8_t size);
117 
118 private:
119  ReturnCode Insert(uint32_t key, Desc* desc, uint8_t opid, Node*& inserted, Node*& pred);
120  ReturnCode Delete(uint32_t key, Desc* desc, uint8_t opid, Node*& deleted, Node*& pred);
121  ReturnCode Find(uint32_t key, Desc* desc, uint8_t opid);
122 
123  void HelpOps(Desc* desc, uint8_t opid);
124  bool IsSameOperation(NodeDesc* nodeDesc1, NodeDesc* nodeDesc2);
125  void FinishPendingTxn(NodeDesc* nodeDesc, Desc* desc);
126  bool IsNodeExist(Node* node, uint32_t key);
127  bool IsNodeActive(NodeDesc* nodeDesc);
128  bool IsKeyExist(NodeDesc* nodeDesc);
129  void LocatePred(Node*& pred, Node*& curr, uint32_t key);
130  void MarkForDeletion(const std::vector<Node*>& nodes, const std::vector<Node*>& preds, Desc* desc);
131 
132  void Print();
133 
134 private:
137 
141 
143  (
144  uint32_t g_count = 0;
145  uint32_t g_count_ins = 0;
146  uint32_t g_count_ins_new = 0;
147  uint32_t g_count_del = 0;
148  uint32_t g_count_del_new = 0;
149  uint32_t g_count_fnd = 0;
150  )
151 
152  uint32_t g_count_commit = 0;
153  uint32_t g_count_abort = 0;
154  uint32_t g_count_fake_abort = 0;
155 };
156 
157 #endif /* end of include guard: TRANSLIST_H */
Desc * AllocateDesc(uint8_t size)
Definition: translist.cc:48
Node(uint32_t _key, Node *_next, NodeDesc *_nodeDesc)
Definition: translist.h:64
ASSERT_CODE(uint32_t g_count=0;uint32_t g_count_ins=0;uint32_t g_count_ins_new=0;uint32_t g_count_del=0;uint32_t g_count_del_new=0;uint32_t g_count_fnd=0;) uint32_t g_count_commit=0
Definition: rbtree.c:92
Definition: translist.h:61
uint8_t index
Definition: translist.h:108
void Init()
Definition: translist.h:75
Definition: translist.h:22
volatile uint8_t status
Definition: translist.h:47
uint32_t key
Definition: translist.h:67
Definition: translist.h:16
Definition: allocator.h:10
uint8_t opid
Definition: translist.h:58
#define ASSERT(condition,...)
Definition: assert.h:27
NodeDesc(Desc *_desc, uint8_t _opid)
Definition: translist.h:54
Definition: translist.h:23
~TransList()
Definition: translist.cc:29
void Push(Desc *desc)
Definition: translist.h:80
Node * m_head
Definition: translist.h:136
void FinishPendingTxn(NodeDesc *nodeDesc, Desc *desc)
Definition: translist.cc:439
uint32_t key
Definition: translist.h:36
ReturnCode Insert(uint32_t key, Desc *desc, uint8_t opid, Node *&inserted, Node *&pred)
Definition: translist.cc:190
static size_t SizeOf(uint8_t size)
Definition: translist.h:41
uint8_t size
Definition: translist.h:48
void Pop()
Definition: translist.h:87
Operator ops[]
Definition: translist.h:49
Definition: translist.h:15
Definition: translist.h:73
ReturnCode Delete(uint32_t key, Desc *desc, uint8_t opid, Node *&deleted, Node *&pred)
Definition: translist.cc:291
bool IsSameOperation(NodeDesc *nodeDesc1, NodeDesc *nodeDesc2)
Definition: translist.cc:363
Node * next
Definition: translist.h:68
bool IsNodeExist(Node *node, uint32_t key)
Definition: translist.cc:434
static uint32_t g_count_commit
Definition: stmskip.cc:38
void LocatePred(Node *&pred, Node *&curr, uint32_t key)
Definition: translist.cc:463
Definition: translist.h:21
uint32_t g_count_abort
Definition: translist.h:153
Definition: translist.h:39
ReturnCode Find(uint32_t key, Desc *desc, uint8_t opid)
Definition: translist.cc:369
uint32_t g_count_fake_abort
Definition: translist.h:154
TransList(Allocator< Node > *nodeAllocator, Allocator< Desc > *descAllocator, Allocator< NodeDesc > *nodeDescAllocator)
Definition: translist.cc:21
bool ExecuteOps(Desc *desc)
Definition: translist.cc:57
Allocator< Node > * m_nodeAllocator
Definition: translist.h:138
Desc * helps[256]
Definition: translist.h:107
NodeDesc * nodeDesc
Definition: translist.h:70
Definition: translist.h:52
Definition: translist.h:29
Definition: translist.h:14
Allocator< Desc > * m_descAllocator
Definition: translist.h:139
void HelpOps(Desc *desc, uint8_t opid)
Definition: translist.cc:113
OpType
Definition: translist.h:26
Allocator< NodeDesc > * m_nodeDescAllocator
Definition: translist.h:140
Definition: translist.h:9
bool IsNodeActive(NodeDesc *nodeDesc)
Definition: translist.cc:450
Desc * desc
Definition: translist.h:57
Definition: translist.h:28
bool IsKeyExist(NodeDesc *nodeDesc)
Definition: translist.cc:455
Node()
Definition: translist.h:63
ReturnCode
Definition: translist.h:19
bool Contain(Desc *desc)
Definition: translist.h:94
OpStatus
Definition: translist.h:12
Definition: translist.h:30
void MarkForDeletion(const std::vector< Node * > &nodes, const std::vector< Node * > &preds, Desc *desc)
Definition: translist.cc:90
Definition: translist.h:33
uint8_t type
Definition: translist.h:35
void Print()
Definition: translist.cc:493
Node * m_tail
Definition: translist.h:135