--- /dev/null
+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});
+}
--- /dev/null
+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);
+ }
+}
--- /dev/null
+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;
+ }
+}
--- /dev/null
+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);
+ }
+ }
+}
--- /dev/null
+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;
+ }
+}
/* 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;
}