annotate src/alice/datasegment/DataSegmentKey.java @ 7:352eb19d837d

implements reply of LocalDataSegment
author one
date Thu, 12 Jan 2012 13:48:34 +0900
parents c78a1cc2cd8f
children 5f7cce38b25c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2
f71eabb1df2a create outline of DataSegment model
one
parents:
diff changeset
1 package alice.datasegment;
f71eabb1df2a create outline of DataSegment model
one
parents:
diff changeset
2
3
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
3 import java.util.ArrayList;
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
4 import java.util.concurrent.LinkedBlockingQueue;
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
5 import java.util.concurrent.atomic.AtomicInteger;
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
6
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
7 import alice.datasegment.Command;
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
8
2
f71eabb1df2a create outline of DataSegment model
one
parents:
diff changeset
9 public class DataSegmentKey {
f71eabb1df2a create outline of DataSegment model
one
parents:
diff changeset
10
3
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
11 private LinkedBlockingQueue<Command> cmdQueue = new LinkedBlockingQueue<Command>();
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
12 private ArrayList<DataSegmentValue> dataList = new ArrayList<DataSegmentValue>();
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
13 private ArrayList<Command> waitList = new ArrayList<Command>();
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
14 private AtomicInteger tailIndex = new AtomicInteger(1);
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
15 private Runnable keyThread;
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
16
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
17 public DataSegmentKey() {
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
18
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
19 }
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
20
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
21 public void addCommand(Command cmd) {
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
22 cmdQueue.add(cmd);
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
23 }
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
24
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
25 public void runKeyThread() {
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
26 keyThread = new Runnable() {
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
27 @Override
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
28 public void run() {
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
29 while (true) {
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
30 try {
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
31 Command cmd = cmdQueue.take();
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
32 switch (cmd.cmdType) {
5
80375ae09a1f add update api
one
parents: 3
diff changeset
33 case UPDATE:
80375ae09a1f add update api
one
parents: 3
diff changeset
34 if (dataList.size() != 0) {
80375ae09a1f add update api
one
parents: 3
diff changeset
35 dataList.remove(0);
80375ae09a1f add update api
one
parents: 3
diff changeset
36 }
3
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
37 case PUT:
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
38 int index = tailIndex.getAndIncrement();
6
c78a1cc2cd8f implements Reply
one
parents: 5
diff changeset
39 DataSegmentValue dsv = new DataSegmentValue(index, cmd.val);
c78a1cc2cd8f implements Reply
one
parents: 5
diff changeset
40 dataList.add(dsv);
3
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
41 // run waiting peek and take
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
42 for (Command waitCmd : waitList) {
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
43 if (waitCmd.index < index) {
6
c78a1cc2cd8f implements Reply
one
parents: 5
diff changeset
44 waitCmd.manager.replyQueue.put(new Reply(waitCmd.seq, index, cmd.val));
c78a1cc2cd8f implements Reply
one
parents: 5
diff changeset
45 if (waitCmd.cmdType == CommandType.TAKE) { // delete data, if it run take cmd.
c78a1cc2cd8f implements Reply
one
parents: 5
diff changeset
46 dataList.remove(dsv);
c78a1cc2cd8f implements Reply
one
parents: 5
diff changeset
47 break;
c78a1cc2cd8f implements Reply
one
parents: 5
diff changeset
48 }
3
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
49 }
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
50 }
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
51 break;
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
52 case PEEK:
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
53 if (cmd.index >= tailIndex.get()) {
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
54 waitList.add(cmd);
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
55 break;
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
56 }
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
57 for (DataSegmentValue data : dataList) {
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
58 if (data.index > cmd.index) {
6
c78a1cc2cd8f implements Reply
one
parents: 5
diff changeset
59 cmd.manager.replyQueue.put(new Reply(cmd.seq, data.index, data.val));
3
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
60 break;
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
61 }
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
62 }
6
c78a1cc2cd8f implements Reply
one
parents: 5
diff changeset
63 waitList.add(cmd);
3
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
64 break;
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
65 case TAKE:
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
66 if (cmd.index >= tailIndex.get()) {
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
67 waitList.add(cmd);
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
68 break;
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
69 }
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
70 for (DataSegmentValue data : dataList) {
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
71 if (data.index > cmd.index) {
6
c78a1cc2cd8f implements Reply
one
parents: 5
diff changeset
72 cmd.manager.replyQueue.put(new Reply(cmd.seq, data.index, data.val));
3
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
73 dataList.remove(data);
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
74 break;
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
75 }
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
76 }
6
c78a1cc2cd8f implements Reply
one
parents: 5
diff changeset
77 waitList.add(cmd);
3
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
78 break;
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
79 case REMOVE:
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
80 // TODO: implements later
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
81 break;
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
82 default:
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
83 }
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
84 } catch (InterruptedException e) {
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
85 e.printStackTrace();
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
86 }
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
87 }
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
88 }
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
89 };
6
c78a1cc2cd8f implements Reply
one
parents: 5
diff changeset
90 new Thread(keyThread).start();
3
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
91 };
91057e15065f add DataSegment API and CodeSegment
one
parents: 2
diff changeset
92
2
f71eabb1df2a create outline of DataSegment model
one
parents:
diff changeset
93 }