-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathLockFreeSetAdd.java
More file actions
80 lines (75 loc) · 2.23 KB
/
LockFreeSetAdd.java
File metadata and controls
80 lines (75 loc) · 2.23 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
public class LockFreeSetAdd extends Method {
private int pc = 0;
private LockFreeSetNode pred = null, curr = null;
LockFreeSetFind f;
LockFreeSetWindow window;
boolean returnValue = false;
private LockFreeSetNode head;
private char item;
LockFreeSetAdd(LockFreeSetNode h, char i, int t) {
super(t);
head = h;
item = i;
}
public String getName() {
return "Add";
}
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(" + curr.getContentsString() + ") == item " + item + " is true");
log("returning false");
returnValue = false;
completed = true;
} else {
log("curr.getContents(" + curr.getContentsString() + ") == item " + item + " is false");
}
pc++;
break;
case 5:
LockFreeSetNode node = new LockFreeSetNode(item, curr);
if(pred.getNext() == curr && pred.getMarked() == false) {
log("pred.getNext(" + pred.getNext().getContentsString() + ") == curr && pred.getMarked() == false is true");
returnValue = true;
log("pred.setNext(node)");
pred.setNext(node);
log("returning true");
completed = true;
} else {
log("pred.getNext(" + pred.getNext().getContentsString() + ") == curr " + curr.getContentsString() + " && pred.getMarked(" + pred.getMarkedString() + ") == false is false");
}
pc = 0;
break;
}
}
public boolean getReturnStatus() {
return returnValue;
}
};