annotate tests/goodbye.ur @ 2297:6d56080f495c

Fix a read-after-free bug using a timestamp check
author Adam Chlipala <adam@chlipala.net>
date Thu, 19 Nov 2015 13:18:58 -0500
parents c05e2e4bdde7
children
rev   line source
adam@1707 1 table boo : { Client : client, Channel : channel unit }
adam@1707 2
adam@1707 3 fun doIt () =
adam@1707 4 me <- self;
adam@1707 5 ch <- channel;
adam@1707 6 dml (INSERT INTO boo (Client, Channel) VALUES ({[me]}, {[ch]}));
adam@1707 7 return <xml><body onload={let
adam@1707 8 fun loop () =
adam@1707 9 v <- recv ch;
adam@1707 10 alert "Someone left";
adam@1707 11 loop ()
adam@1707 12 in
adam@1707 13 loop ()
adam@1707 14 end}/></xml>
adam@1707 15
adam@1707 16 task clientLeaves = fn cl =>
adam@1707 17 debug "Client left";
adam@1707 18 dml (DELETE FROM boo WHERE Client = {[cl]});
adam@1707 19 queryI (SELECT (boo.Channel)
adam@1707 20 FROM boo)
adam@1707 21 (fn r => send r.1 ());
adam@1707 22 debug "Done processing"
adam@1707 23
adam@1707 24 fun main () = return <xml><body>
adam@1707 25 <form> <submit action={doIt}/> </form>
adam@1707 26 </body></xml>