From 4ad5c8c705bdfe7cf4f7af46a6b5b04c6ac7ab5c Mon Sep 17 00:00:00 2001 From: bdemsky Date: Thu, 10 May 2007 23:26:20 +0000 Subject: [PATCH] Adding: (1) Tag version of Chat Benchmark (2) Bug fix to runtime --- Robust/src/Benchmarks/ChatTag/ChatServer.java | 38 +++++++++++++++++++ Robust/src/Benchmarks/ChatTag/ChatSocket.java | 31 +++++++++++++++ Robust/src/Benchmarks/ChatTag/Message.java | 12 ++++++ Robust/src/Benchmarks/ChatTag/Room.java | 22 +++++++++++ Robust/src/Benchmarks/ChatTag/RoomObject.java | 15 ++++++++ Robust/src/Runtime/runtime.c | 6 +-- 6 files changed, 121 insertions(+), 3 deletions(-) create mode 100644 Robust/src/Benchmarks/ChatTag/ChatServer.java create mode 100644 Robust/src/Benchmarks/ChatTag/ChatSocket.java create mode 100644 Robust/src/Benchmarks/ChatTag/Message.java create mode 100644 Robust/src/Benchmarks/ChatTag/Room.java create mode 100644 Robust/src/Benchmarks/ChatTag/RoomObject.java diff --git a/Robust/src/Benchmarks/ChatTag/ChatServer.java b/Robust/src/Benchmarks/ChatTag/ChatServer.java new file mode 100644 index 00000000..90f21b53 --- /dev/null +++ b/Robust/src/Benchmarks/ChatTag/ChatServer.java @@ -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 index 00000000..9923f91d --- /dev/null +++ b/Robust/src/Benchmarks/ChatTag/ChatSocket.java @@ -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 index 00000000..92db626d --- /dev/null +++ b/Robust/src/Benchmarks/ChatTag/Message.java @@ -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 index 00000000..470680a8 --- /dev/null +++ b/Robust/src/Benchmarks/ChatTag/Room.java @@ -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 index 00000000..dd002813 --- /dev/null +++ b/Robust/src/Benchmarks/ChatTag/RoomObject.java @@ -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; + } +} diff --git a/Robust/src/Runtime/runtime.c b/Robust/src/Runtime/runtime.c index e9fff728..731697b3 100644 --- a/Robust/src/Runtime/runtime.c +++ b/Robust/src/Runtime/runtime.c @@ -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; } -- 2.34.1