Mercurial > hg > Database > Alice
annotate src/main/java/alice/codesegment/InputDataSegment.java @ 471:be0b61986ff7 dispose
checking having DataSegmentManger before get DataSegmentManager
author | sugi |
---|---|
date | Mon, 24 Nov 2014 22:57:40 +0900 |
parents | bcf6f4a6fcd0 |
children | 549cc29aca59 |
rev | line source |
---|---|
345 | 1 package alice.codesegment; |
2 | |
3 import java.util.concurrent.atomic.AtomicInteger; | |
4 | |
5 import alice.datasegment.Command; | |
6 import alice.datasegment.CommandType; | |
7 import alice.datasegment.DataSegment; | |
8 import alice.datasegment.Receiver; | |
455
b004f62b83e5
refactor (remove quick method from DataSegmentManager and use flag)
sugi
parents:
452
diff
changeset
|
9 import alice.datasegment.SendOption; |
345 | 10 |
11 /** | |
12 * InputDataSegment Manager | |
13 * keep tracking unbound/bound count | |
14 * @author kazz | |
15 * | |
16 */ | |
17 public class InputDataSegment { | |
417 | 18 |
19 public CodeSegment cs; | |
20 private AtomicInteger count = new AtomicInteger(1); // 1 for no input data segments | |
21 private AtomicInteger keyCount = new AtomicInteger(0); // number of DataSegments | |
22 public InputDataSegment(CodeSegment cs) { | |
23 this.cs = cs; | |
24 } | |
25 | |
26 public void init(){ | |
27 count = new AtomicInteger(1); | |
28 keyCount = new AtomicInteger(0); | |
29 } | |
30 | |
31 public void quickPeek(Receiver receiver) { | |
32 cs.list.add(receiver); | |
33 if (receiver.managerKey==null){ | |
455
b004f62b83e5
refactor (remove quick method from DataSegmentManager and use flag)
sugi
parents:
452
diff
changeset
|
34 DataSegment.getLocal().peek(receiver, cs, null); |
417 | 35 } else { |
471
be0b61986ff7
checking having DataSegmentManger before get DataSegmentManager
sugi
parents:
458
diff
changeset
|
36 if (DataSegment.contains(receiver.managerKey)) { |
be0b61986ff7
checking having DataSegmentManger before get DataSegmentManager
sugi
parents:
458
diff
changeset
|
37 SendOption option = new SendOption(true, false); |
be0b61986ff7
checking having DataSegmentManger before get DataSegmentManager
sugi
parents:
458
diff
changeset
|
38 DataSegment.get(receiver.managerKey).peek(receiver, cs, option); |
be0b61986ff7
checking having DataSegmentManger before get DataSegmentManager
sugi
parents:
458
diff
changeset
|
39 } |
455
b004f62b83e5
refactor (remove quick method from DataSegmentManager and use flag)
sugi
parents:
452
diff
changeset
|
40 } |
b004f62b83e5
refactor (remove quick method from DataSegmentManager and use flag)
sugi
parents:
452
diff
changeset
|
41 } |
b004f62b83e5
refactor (remove quick method from DataSegmentManager and use flag)
sugi
parents:
452
diff
changeset
|
42 |
b004f62b83e5
refactor (remove quick method from DataSegmentManager and use flag)
sugi
parents:
452
diff
changeset
|
43 |
b004f62b83e5
refactor (remove quick method from DataSegmentManager and use flag)
sugi
parents:
452
diff
changeset
|
44 public void peek(Receiver receiver) { |
b004f62b83e5
refactor (remove quick method from DataSegmentManager and use flag)
sugi
parents:
452
diff
changeset
|
45 cs.list.add(receiver); |
b004f62b83e5
refactor (remove quick method from DataSegmentManager and use flag)
sugi
parents:
452
diff
changeset
|
46 if (receiver.managerKey==null){ |
b004f62b83e5
refactor (remove quick method from DataSegmentManager and use flag)
sugi
parents:
452
diff
changeset
|
47 DataSegment.getLocal().peek(receiver, cs, null); |
b004f62b83e5
refactor (remove quick method from DataSegmentManager and use flag)
sugi
parents:
452
diff
changeset
|
48 } else { |
471
be0b61986ff7
checking having DataSegmentManger before get DataSegmentManager
sugi
parents:
458
diff
changeset
|
49 if (DataSegment.contains(receiver.managerKey)) { |
be0b61986ff7
checking having DataSegmentManger before get DataSegmentManager
sugi
parents:
458
diff
changeset
|
50 SendOption option = new SendOption(false, false); |
be0b61986ff7
checking having DataSegmentManger before get DataSegmentManager
sugi
parents:
458
diff
changeset
|
51 DataSegment.get(receiver.managerKey).peek(receiver, cs, option); |
be0b61986ff7
checking having DataSegmentManger before get DataSegmentManager
sugi
parents:
458
diff
changeset
|
52 } |
417 | 53 } |
54 } | |
55 | |
56 public void quickTake(Receiver receiver) { | |
57 cs.list.add(receiver); | |
58 if (receiver.managerKey==null){ | |
455
b004f62b83e5
refactor (remove quick method from DataSegmentManager and use flag)
sugi
parents:
452
diff
changeset
|
59 DataSegment.getLocal().take(receiver, cs, null); |
417 | 60 } else { |
471
be0b61986ff7
checking having DataSegmentManger before get DataSegmentManager
sugi
parents:
458
diff
changeset
|
61 if (DataSegment.contains(receiver.managerKey)) { |
be0b61986ff7
checking having DataSegmentManger before get DataSegmentManager
sugi
parents:
458
diff
changeset
|
62 SendOption option = new SendOption(true, false); |
be0b61986ff7
checking having DataSegmentManger before get DataSegmentManager
sugi
parents:
458
diff
changeset
|
63 DataSegment.get(receiver.managerKey).take(receiver, cs, option); |
be0b61986ff7
checking having DataSegmentManger before get DataSegmentManager
sugi
parents:
458
diff
changeset
|
64 } |
417 | 65 } |
66 } | |
67 | |
68 public void take(Receiver receiver) { | |
69 cs.list.add(receiver); | |
70 if (receiver.managerKey==null){ | |
455
b004f62b83e5
refactor (remove quick method from DataSegmentManager and use flag)
sugi
parents:
452
diff
changeset
|
71 DataSegment.getLocal().take(receiver, cs, null); |
417 | 72 } else { |
471
be0b61986ff7
checking having DataSegmentManger before get DataSegmentManager
sugi
parents:
458
diff
changeset
|
73 if (DataSegment.contains(receiver.managerKey)) { |
be0b61986ff7
checking having DataSegmentManger before get DataSegmentManager
sugi
parents:
458
diff
changeset
|
74 SendOption option = new SendOption(false, false); |
be0b61986ff7
checking having DataSegmentManger before get DataSegmentManager
sugi
parents:
458
diff
changeset
|
75 DataSegment.get(receiver.managerKey).take(receiver, cs, option); |
be0b61986ff7
checking having DataSegmentManger before get DataSegmentManager
sugi
parents:
458
diff
changeset
|
76 } |
417 | 77 } |
78 } | |
345 | 79 |
417 | 80 public void reply(Receiver receiver, Command reply) { |
81 receiver.index = reply.index; | |
471
be0b61986ff7
checking having DataSegmentManger before get DataSegmentManager
sugi
parents:
458
diff
changeset
|
82 receiver.from = reply.reverseKey; |
458 | 83 receiver.setData(reply.rData); |
417 | 84 receive(); |
85 } | |
86 | |
87 public void register() { | |
88 count.getAndIncrement(); | |
89 keyCount.getAndIncrement(); | |
90 } | |
345 | 91 |
417 | 92 public void setKey() { |
93 if (keyCount.decrementAndGet() == 0) { | |
94 receive(); | |
95 } | |
96 } | |
97 | |
98 public void receive() { | |
99 if (count.decrementAndGet() == 0) { | |
100 CodeSegmentManager.submit(cs); | |
101 } | |
102 } | |
345 | 103 |
417 | 104 /** |
105 * InputDataSegment factory | |
106 * @param type PEEK or TAKE | |
471
be0b61986ff7
checking having DataSegmentManger before get DataSegmentManager
sugi
parents:
458
diff
changeset
|
107 * @return Receiver of DataSegment reply |
417 | 108 */ |
109 public Receiver create(CommandType type) { | |
110 return new Receiver(this, type); | |
111 } | |
112 | |
113 public void recommand(Receiver receiver) { | |
114 // TODO why only local? | |
115 DataSegment.getLocal().recommand(receiver, cs); | |
116 } | |
117 | |
118 public void setCounter(int cnt){ | |
119 count.set(cnt); | |
120 } | |
345 | 121 } |