12 #include "transaction.h"
14 #include "xthread.cpp"
37 Payload() : Transactional::Node<
LongNode>::Payload(), m_x(0) {}
38 Payload(
const Payload &x) : Transactional::Node<
LongNode>::Payload(x), m_x(x.m_x) {
44 operator long()
const {
return m_x;}
45 Payload &operator=(
const long &x) {
50 Payload &operator+=(
const long &x) {
60 #define trans(node) for(Transaction \
61 implicit_tr(node, false); !implicit_tr.isModified() || !implicit_tr.commitOrNext(); ) implicit_tr[node]
64 typename std::enable_if<std::is_base_of<LongNode, T>::value,
70 #include "transaction_impl.h"
74 shared_ptr<LongNode> gn1, gn2, gn3, gn4;
79 for(
int i = 0; i < 2500; i++) {
83 tr1[gn1] = ctr1[gn1] + 1;
84 tr1[gn3] = ctr1[gn3] + 1;
86 tr1[gn1] = str1[gn1] - 1;
87 tr1[gn2] = str1[gn2] + 1;
91 assert(shot[*gn2] <= shot[*gn3]);
95 tr1[gn4] = tr1[gn4] + 1;
96 tr1[gn4] = tr1[gn4] - 1;
100 assert(shot[*gn2] <= shot[*gn3]);
104 tr1[gn2] = tr1[gn2] - 1;
105 tr1[gn3] = str1[gn3] - 1;
113 #define NUM_THREADS 4
116 main(
int argc,
char **argv) {
117 for(
int k = 0; k < 10; k++) {
118 gn1.reset(LongNode::create<LongNode>());
119 gn2.reset(LongNode::create<LongNode>());
120 gn3.reset(LongNode::create<LongNode>());
121 gn4.reset(LongNode::create<LongNode>());
123 gn1->iterate_commit_if([=](
Transaction &tr1)->
bool{
124 if( !gn1->insert(tr1, gn2,
true))
126 tr1[ *gn2] = tr1[ *gn2] + 1;
127 if( !gn2->insert(tr1, gn3,
true))
130 if( !gn3->insert(tr1, gn4,
true))
133 if( !gn3->release(tr1, gn4))
144 tr1[ *gn2] = tr1[ *gn2] - 1;
150 long x = shot1[*gn3];
151 printf(
"Gn3:%ld\n", x);
155 printf(
"Gn3:%ld\n", x);
158 shared_ptr<LongNode> p1(LongNode::create<LongNode>());
166 shared_ptr<LongNode> p2(LongNode::create<LongNode>());
167 shared_ptr<LongNode> p22(LongNode::create<LongNode>());
168 shared_ptr<LongNode> p211(LongNode::create<LongNode>());
169 shared_ptr<LongNode> p2111(LongNode::create<LongNode>());
170 shared_ptr<LongNode> p2112(LongNode::create<LongNode>());
171 shared_ptr<LongNode> p2113(LongNode::create<LongNode>());
172 shared_ptr<LongNode> p2114(LongNode::create<LongNode>());
173 p2111->insert(p2112);
174 p2112->insert(p2113);
175 p2111->insert(p2114);
176 shared_ptr<LongNode> p21(LongNode::create<LongNode>());
183 gn3->iterate_commit_if([=](
Transaction &tr1)->
bool{
184 if( !p1->insert(tr1, p22,
true))
186 if( !gn3->insert(tr1, p2,
true))
188 if( !gn3->insert(tr1, p2111,
true))
190 if( !p21->insert(tr1, p2111,
false))
214 gn3->iterate_commit_if([=](
Transaction &tr1)->
bool{
217 if( !p1->release(tr1, p22))
219 if( !gn3->release(tr1, p2))
221 if( !gn3->release(tr1, p2111))
232 tr1[gn1] = ctr1[gn1] + 1;
233 tr1[gn3] = ctr1[gn3] + 1;
234 tr1[gn1] = ctr1[gn1] - 1;
235 tr1[gn3] = ctr1[gn3] - 1;
242 std::thread threads[NUM_THREADS];
244 for(
int i = 0; i < NUM_THREADS; i++) {
245 std::thread th( &start_routine);
248 for(
int i = 0; i < NUM_THREADS; i++) {
253 if(***gn1 || ***gn2 || ***gn3 || ***gn4) {
255 printf(
"Gn1:%ld\n", (
long)***gn1);
256 printf(
"Gn2:%ld\n", (
long)***gn2);
257 printf(
"Gn3:%ld\n", (
long)***gn3);
258 printf(
"Gn4:%ld\n", (
long)***gn4);
273 printf(
"failed total=%ld\n", (
long)total);
277 printf(
"succeeded\n");