3
|
1 package alice.codesegment;
|
|
2
|
|
3 import java.util.concurrent.atomic.AtomicInteger;
|
|
4
|
|
5 import alice.datasegment.DataSegment;
|
18
|
6 import alice.datasegment.DataSegmentReceiver;
|
3
|
7 import alice.datasegment.DataSegmentValue;
|
|
8
|
|
9 public class InputDataSegment {
|
|
10
|
|
11 private CodeSegment cs;
|
19
|
12 private AtomicInteger count = new AtomicInteger(1); // for no input data segments
|
|
13 private AtomicInteger keyCount = new AtomicInteger(0);
|
3
|
14
|
|
15 public InputDataSegment(CodeSegment cs) {
|
|
16 this.cs = cs;
|
|
17 }
|
|
18
|
18
|
19 public void peek(DataSegmentReceiver receiver, String managerKey, String key) {
|
|
20 peek(receiver, managerKey, key, 0);
|
3
|
21 }
|
|
22
|
18
|
23 public void peek(DataSegmentReceiver receiver, String managerKey, String key, int index) {
|
|
24 DataSegment.get(managerKey).peek(receiver, key, index, cs);
|
3
|
25 }
|
|
26
|
18
|
27 public void take(DataSegmentReceiver receiver, String managerKey, String key) {
|
|
28 take(receiver, managerKey, key, 0);
|
3
|
29 }
|
|
30
|
18
|
31 public void take(DataSegmentReceiver receiver, String managerKey, String key, int index) {
|
|
32 DataSegment.get(managerKey).take(receiver, key, index, cs);
|
3
|
33 }
|
7
|
34
|
18
|
35 public void reply(DataSegmentReceiver receiver, DataSegmentValue val) {
|
|
36 receiver.index = val.index;
|
|
37 receiver.val = val.val;
|
19
|
38 receive();
|
|
39 }
|
|
40
|
|
41 public void regist() {
|
|
42 count.getAndIncrement();
|
|
43 keyCount.getAndIncrement();
|
9
|
44 }
|
|
45
|
19
|
46 public void setKey() {
|
|
47 if (keyCount.decrementAndGet() == 0) {
|
|
48 receive();
|
|
49 }
|
|
50 }
|
|
51
|
|
52 public void receive() {
|
8
|
53 if (count.decrementAndGet() == 0) {
|
|
54 try {
|
|
55 CodeSegmentManager.get().readyQueue.put(cs);
|
|
56 } catch (InterruptedException e) {
|
|
57 e.printStackTrace();
|
|
58 }
|
|
59 }
|
|
60 }
|
18
|
61
|
3
|
62 }
|