<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>

<META NAME="Generator" CONTENT="MS Exchange Server version 6.0.6249.1">
<TITLE>Re: [plt-scheme] RE: Shared resources for servlets</TITLE>
</HEAD>
<BODY dir=ltr>
<DIV>Well it's not perfect because it's just an abstraction. It doesn't deal 
with exceptions, for one.</DIV>
<DIV>I have&nbsp;one questions though:</DIV>
<DIV>Do the threads not wait to their turn and only change at (sleep)s and 
blocks?</DIV>
<DIV>If so, all the race conditions would not happen</DIV>
<BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px">
  <DIV><FONT size=2>-----Original Message----- <BR><B>From:</B> Joe Marshall 
  [mailto:jrm@ccs.neu.edu] <BR><B>Sent:</B> ד 10/09/2003 20:21 <BR><B>To:</B> 
  Dor Kleiman; Keith Frost <BR><B>Cc:</B> plt-scheme@list.cs.brown.edu 
  <BR><B>Subject:</B> Re: [plt-scheme] RE: Shared resources for 
  servlets<BR><BR></FONT></DIV>
  <P><FONT size=2>Re: Shared resources for servletsFrom:&nbsp; Dor Kleiman 
  &lt;dor@ntr.co.il&gt;;<BR>To:&nbsp; Keith Frost 
  &lt;keithf@amnis.com&gt;<BR><BR><BR>&gt; (module lock 
  mzscheme<BR>&gt;&nbsp;&nbsp; (define 
  read/write-object<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; 
  (class<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (define (read) 
  'todo)<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (define (write to-write) 
  'todo)))<BR>&gt;<BR>&gt;&nbsp;&nbsp; (define 
  lockable-object<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; 
  (class<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (define reading 
  0)<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (define writing? 
  #f)<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (init-field 
  obj)<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (define 
  (open-read)<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if 
  writing?<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  (begin (sleep) 
  (open-read))<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  (set! reading (+ reading 1))))<BR><BR>Race condition here, writing? could be 
  #F when<BR>conditional is tested, but changed to #T before<BR>reading is 
  incremented.<BR><BR>Additionally, reading is not atomically incremented,<BR>so 
  an increment could be lost.<BR><BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  (define (close-read)<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  (set! reading (- reading 1)))<BR><BR>Could lose the decrement on a race 
  condition.<BR><BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (define 
  (open-write)<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if (or 
  writing? (&gt; reading 
  0))<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  (begin (sleep) 
  (open-write))<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  (set! writing? #t)))<BR><BR>Again, race condition in the conditional, two 
  processes<BR>could both detect no writing? condition and each think<BR>that it 
  can write.<BR><BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (define 
  (close-write)<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (set! 
  writing? #f))<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (define 
  (read)<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; returns 
  current value.<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; 
  Copies it first so it doesn't change when writing later 
  on<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  (open-read)<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (let ([r 
  (send obj 
  read)])<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  (close-read)<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  r)))<BR><BR>Need a dynamic-wind here to ensure that the lock is freed<BR>even 
  if the reader aborts.<BR><BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (define 
  (write to-write)<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  (open-write)<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (send obj 
  write to-write)<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  (close-write)))))<BR><BR>Need a dynamic-wind here to ensure that the lock is 
  freed<BR>even if the writer 
aborts.<BR><BR></FONT></P></BLOCKQUOTE>

</BODY>
</HTML>