-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathLockFreeSetRemove.java
More file actions
100 lines (92 loc) · 2.18 KB
/
LockFreeSetRemove.java
File metadata and controls
100 lines (92 loc) · 2.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
public class LockFreeSetRemove extends Method {
private int pc = 0;
private LockFreeSetNode pred = null, curr = null, succ = null;
LockFreeSetFind f;
LockFreeSetWindow window;
boolean returnValue = false;
private LockFreeSetNode head;
private char item;
LockFreeSetRemove(LockFreeSetNode h, char i, int t) {
super(t);
head = h;
item = i;
}
public String getName() {
return "Remove";
}
public String getArgStr() {
return String.valueOf(item);
}
public void step() {
switch(pc) {
case 0:
log("Invoking Find(head, " + item + ")");
f = new LockFreeSetFind(head, item, threadId);
pc++;
break;
case 1:
if(!f.isCompleted()) {
f.step(getLine());
} else {
window = f.getReturnStatus();
pc++;
}
break;
case 2:
log("pred = window.pred");
pred = window.pred;
pc++;
break;
case 3:
log("curr = window.curr");
curr = window.curr;
pc++;
break;
case 4:
if (curr.getContents() != item) {
log("curr.getContents() != item " + item + " is true");
log("returning false");
returnValue = false;
completed = true;
} else {
log("curr.getContents() != item " + item + " is false");
}
pc++;
break;
case 5:
log("succ = curr.getNext()");
succ = curr.getNext();
pc++;
break;
case 6:
if(curr.getNext() == succ && curr.getMarked() == false) {
log("curr.getNext() == succ && curr.getMarked() == false is true");
curr.setMarked(true);
log("curr.setMarked(true)");
pc++;
} else {
log("curr.getNext() == succ && curr.getMarked() == false is false");
pc = 0;
}
break;
case 7:
if(pred.getNext() == curr && pred.getMarked() == false) {
log("pred.getNext() == curr && pred.getMarked() == false is true");
log("pred.setNext(succ)");
pred.setNext(succ);
} else {
log("pred.getNext() == curr && pred.getMarked() == false is false");
}
pc++;
break;
case 8:
log("returning true");
returnValue = true;
completed = true;
break;
}
}
public boolean getReturnStatus() {
return returnValue;
}
};