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;
|
9
|
12 private AtomicInteger count = new AtomicInteger(1); // for execute()
|
3
|
13
|
|
14 public InputDataSegment(CodeSegment cs) {
|
|
15 this.cs = cs;
|
|
16 }
|
|
17
|
18
|
18 public void peek(DataSegmentReceiver receiver, String managerKey, String key) {
|
|
19 peek(receiver, managerKey, key, 0);
|
3
|
20 }
|
|
21
|
18
|
22 public void peek(DataSegmentReceiver receiver, String managerKey, String key, int index) {
|
|
23 DataSegment.get(managerKey).peek(receiver, key, index, cs);
|
3
|
24 count.getAndIncrement();
|
|
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 count.getAndIncrement();
|
|
34 }
|
7
|
35
|
18
|
36 public void reply(DataSegmentReceiver receiver, DataSegmentValue val) {
|
|
37 receiver.index = val.index;
|
|
38 receiver.val = val.val;
|
9
|
39 execute();
|
|
40 }
|
|
41
|
|
42 public void execute() {
|
8
|
43 if (count.decrementAndGet() == 0) {
|
|
44 try {
|
|
45 CodeSegmentManager.get().readyQueue.put(cs);
|
|
46 } catch (InterruptedException e) {
|
|
47 e.printStackTrace();
|
|
48 }
|
|
49 }
|
|
50 }
|
18
|
51
|
3
|
52 }
|