-
Notifications
You must be signed in to change notification settings - Fork 0
/
LamportClock.java
99 lines (96 loc) · 4.11 KB
/
LamportClock.java
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
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
public class LamportClock {
static HashMap<String,ArrayList<Integer>> hmap = new LinkedHashMap<>();
static HashMap<String,ArrayList<Integer>> flag_map = new LinkedHashMap<>();
static int np = 4; //number of processes
// static String ts[][] = {{""},
// {"","E","S2","S3","S4","E"},
// {"","R1","E","S3","E"},
// {"","S4","E","R1","R2","E","S4","R4","E"},
// {"","E","R3","E","R1","R3","E","S3","E"}};
// static String ts[][] = {{""},
// {"","E","S2","S3","R4","E"},
// {"","R1","E","S3","E"},
// {"","S4","E","R1","R2","E","S4","R4","E"},
// {"","E","R3","E","S1","R3","E","S3","E"}};
static String ts[][] = {{""},
{"","E","S2","E","R4","E"},
{"","R1","E","S3","S3","E"},
{"","S4","E","R2","R2","E","S4","R4","E"},
{"","E","R3","E","S1","R3","E","S3","E"}};
static int events[][]= new int[np+1][];
public static void main(String[] args) {
for(int i=1;i<np+1;i++){
events[i] = new int[ts[i].length];
}
func(1,1);
for(int i=1;i<np+1;i++){
for(int j=1;j<ts[i].length;j++){
System.out.print(events[i][j]+" ");
}
System.out.println("");
}
}
private static void func(int k,int z){ //initially, k=1 and z=1
for(int i=k;i<np+1;i++){
for(int j=z;j<ts[i].length;j++){
System.out.println(i+" "+j);
if(ts[i][j].equals("E") && events[i][j]==0){
events[i][j] = events[i][j-1]+1;
System.out.println(events[i][j]);
}
else if(ts[i][j].contains("S") && events[i][j]==0){
events[i][j] = events[i][j-1]+1;
String skey = i+ts[i][j];
if(hmap.containsKey(skey)){
ArrayList<Integer> list =hmap.get(skey);
list.add(events[i][j]);
hmap.replace(skey, list);
ArrayList<Integer> flaglist = flag_map.get(skey);
flaglist.add(0);
flag_map.replace(skey, flaglist);
}
else{
hmap.put(skey,new ArrayList<>());
hmap.get(skey).add(events[i][j]);
flag_map.put(skey,new ArrayList<>());
flag_map.get(skey).add(0);
}
System.out.println(events[i][j]);
}
else if(ts[i][j].contains("R") && events[i][j]==0){
char num = ts[i][j].charAt(1);
String key = num+"S"+i;
int idx=0;
if(hmap.containsKey(key)){
for(int p=0;p<flag_map.get(key).size();p++){
if(flag_map.get(key).get(p)==0){
idx = p;
break;
}
}
events[i][j] = Math.max(events[i][j-1],hmap.get(key).get(idx))+1;
flag_map.get(key).set(idx,1);
System.out.println("r if: "+events[i][j]);
}
else{
func(Character.getNumericValue(num),1);
if(hmap.containsKey(key)){
for(int p=0;p<flag_map.get(key).size();p++){
if(flag_map.get(key).get(p)==0){
idx = p;
break;
}
}
events[i][j] = Math.max(events[i][j-1],hmap.get(key).get(idx))+1;
flag_map.get(key).set(idx,1);
System.out.println("r else: "+i+" "+j+" "+events[i][j]);
}
}
}
}
}
}
}