1Messages: module 2{ 3 PATH: con "/dis/collab/lib/messages.dis"; 4 5 Msg: adt { 6 from: cyclic ref User; 7 data: array of byte; 8 next: cyclic ref Msg; 9 }; 10 11 Msglist: adt { 12 tail: ref Msg; 13 readers: list of (ref User, ref Readreq); 14 15 new: fn(): ref Msglist; 16 flushfid: fn(nil: self ref Msglist, fid: int); 17 flushtag: fn(nil: self ref Msglist, tag: int); 18 wait: fn(nil: self ref Msglist, u: ref User, r: ref Readreq); 19 write: fn(nil: self ref Msglist, m: ref Msg): list of (ref User, ref Readreq); 20 queue: fn(nil: self ref Msglist): ref Msg; 21 }; 22 23 Readreq: adt { 24 tag: int; 25 fid: int; 26 count: int; 27 offset: big; 28 }; 29 30 User: adt { 31 id: int; 32 fid: int; 33 name: string; 34 queue: cyclic ref Msg; 35 36 new: fn(fid: int, name: string): ref User; 37 initqueue: fn(nil: self ref User, msgs: ref Msglist); 38 read: fn(nil: self ref User): ref Msg; 39 }; 40 41 init: fn(); 42}; 43