Adding:
authorbdemsky <bdemsky>
Thu, 10 May 2007 23:26:20 +0000 (23:26 +0000)
committerbdemsky <bdemsky>
Thu, 10 May 2007 23:26:20 +0000 (23:26 +0000)
(1) Tag version of Chat Benchmark
(2) Bug fix to runtime

Robust/src/Benchmarks/ChatTag/ChatServer.java [new file with mode: 0644]
Robust/src/Benchmarks/ChatTag/ChatSocket.java [new file with mode: 0644]
Robust/src/Benchmarks/ChatTag/Message.java [new file with mode: 0644]
Robust/src/Benchmarks/ChatTag/Room.java [new file with mode: 0644]
Robust/src/Benchmarks/ChatTag/RoomObject.java [new file with mode: 0644]
Robust/src/Runtime/runtime.c

diff --git a/Robust/src/Benchmarks/ChatTag/ChatServer.java b/Robust/src/Benchmarks/ChatTag/ChatServer.java
new file mode 100644 (file)
index 0000000..90f21b5
--- /dev/null
@@ -0,0 +1,38 @@
+task Startup(StartupObject s{initialstate}) {
+    System.printString("Chat Server Benchmark");
+    RoomObject ro=new RoomObject() {Initialized};
+    ServerSocket ss=new ServerSocket(8000);
+    taskexit(s{!initialstate});
+}
+
+task AcceptConnection(ServerSocket ss{SocketPending}) {
+    tag t=new tag(link);
+    ChatSocket cs=new ChatSocket() {Initialized}{t};
+    Socket s=new Socket() {}{t};
+    cs.sock=s;
+    ss.accept(s);
+    s.write("Please choose a chatroom".getBytes());
+}
+
+task ReadRequest(ChatSocket cs{Initialized}{link l}, Socket s{IOPending}{link l}) {
+    if (cs.processRead(s)) {
+       taskexit(cs{!Initialized, ProcessRoom});
+    }
+}
+
+task ProcessRoom(ChatSocket cs{ProcessRoom}, RoomObject ro{Initialized}) {
+    cs.processRoom(ro);
+    taskexit(cs{!ProcessRoom, InRoom});
+}
+
+task Message(ChatSocket cs{InRoom}{link l}, Socket s{IOPending}{link l}) {
+    byte buffer[]=new byte[1024];
+    int length=s.read(buffer);
+    Message m=new Message(buffer, length, cs){};
+}
+
+task SendMessage(Message m{!Sent}) {
+    String st=(new String(m.buffer)).subString(0, m.length);
+    m.cs.room.sendToRoom(m.cs,st.getBytes());
+    taskexit(m {Sent});
+}
diff --git a/Robust/src/Benchmarks/ChatTag/ChatSocket.java b/Robust/src/Benchmarks/ChatTag/ChatSocket.java
new file mode 100644 (file)
index 0000000..9923f91
--- /dev/null
@@ -0,0 +1,31 @@
+public class ChatSocket {
+    flag Initialized;
+    flag ProcessRoom;
+    flag InRoom;
+    Room room;
+    String roomrequest;
+    Socket sock;
+
+    public ChatSocket() {
+    }
+
+    public boolean processRead(Socket s) {
+        byte buffer[]=new byte[1024];
+        int length=s.read(buffer);
+        String st=new String(buffer);
+        String curr=st.subString(0, length);
+        if (roomrequest!=null) {
+            StringBuffer sb=new StringBuffer(roomrequest);
+            sb.append(curr);
+            curr=sb.toString();
+        }
+        roomrequest=curr;
+        if (roomrequest.indexOf("\n")>=0) {
+           return true;
+        }
+        return false;
+    }
+    public void processRoom(RoomObject ro) {
+       ro.getChatRoom(roomrequest).addParticipant(this);
+    }
+}
diff --git a/Robust/src/Benchmarks/ChatTag/Message.java b/Robust/src/Benchmarks/ChatTag/Message.java
new file mode 100644 (file)
index 0000000..92db626
--- /dev/null
@@ -0,0 +1,12 @@
+public class Message {
+    flag Sent;
+    ChatSocket cs;
+    byte buffer[];
+    int length;
+
+    public Message(byte[]  b, int l, ChatSocket cs) {
+       this.cs=cs;
+       this.buffer=b;
+       this.length=l;
+    }
+}
diff --git a/Robust/src/Benchmarks/ChatTag/Room.java b/Robust/src/Benchmarks/ChatTag/Room.java
new file mode 100644 (file)
index 0000000..470680a
--- /dev/null
@@ -0,0 +1,22 @@
+public class Room {
+    String name;
+    HashSet participants;
+    public Room(String n) {
+       name=n;
+       participants=new HashSet();
+    }
+    
+    void addParticipant(ChatSocket cs) {
+       participants.add(cs);
+       cs.room=this;
+    }
+
+    void sendToRoom(ChatSocket caller, byte [] message) {
+       HashMapIterator hmi=participants.iterator();
+       while(hmi.hasNext()) {
+           ChatSocket cs=(ChatSocket) hmi.next();
+           if (cs!=caller)
+               cs.sock.write(message);
+       }
+    }
+}
diff --git a/Robust/src/Benchmarks/ChatTag/RoomObject.java b/Robust/src/Benchmarks/ChatTag/RoomObject.java
new file mode 100644 (file)
index 0000000..dd00281
--- /dev/null
@@ -0,0 +1,15 @@
+public class RoomObject {
+    flag Initialized;
+    HashMap rooms;
+    public RoomObject() {
+       rooms=new HashMap();
+    }
+
+    Room getChatRoom(String name) {
+       if (rooms.containsKey(name))
+           return (Room) rooms.get(name);
+       Room r=new Room(name);
+       rooms.put(name, r);
+       return r;
+    }
+}
index e9fff728dccc1b62359991fe8cabeddaa7076edb..731697b3ba65ca4eac4352b949cd16619a866b53 100644 (file)
@@ -291,12 +291,12 @@ void tagclear(struct ___Object___ * obj, struct ___TagDescriptor___ * tagd) {
 /* This function allocates a new tag. */
 #ifdef PRECISE_GC
 struct ___TagDescriptor___ * allocate_tag(void *ptr, int index) {
-  struct ___TagDescriptor___ * v=(struct ___TagDescriptor___ *) mygcmalloc((struct garbagelist *) ptr, classsize[STARTUPTYPE]);
+  struct ___TagDescriptor___ * v=(struct ___TagDescriptor___ *) mygcmalloc((struct garbagelist *) ptr, classsize[TAGTYPE]);
 #else
 struct ___TagDescriptor___ * allocate_tag(int index) {
-  struct ___TagDescriptor___ * v=FREEMALLOC(classsize[STARTUPTYPE]);
+  struct ___TagDescriptor___ * v=FREEMALLOC(classsize[TAGTYPE]);
 #endif
-  v->type=STARTUPTYPE;
+  v->type=TAGTYPE;
   v->flag=index;
   return v;
 }