<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: Shared resources for servlets</TITLE>
</HEAD>
<BODY dir=ltr>
<DIV>Here's a quck draft (probably would need a bit of debugging, I have no 
DrScheme on this machine):<BR></DIV>
<DIV><FONT face="Courier New">(module lock mzscheme</FONT></DIV>
<DIV><FONT face="Courier New">&nbsp; (define read/write-object</FONT></DIV>
<DIV><FONT face="Courier New">&nbsp;&nbsp;&nbsp; (class</FONT></DIV>
<DIV><FONT face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (define (read) 
'todo)</FONT></DIV>
<DIV><FONT face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (define (write 
to-write) 'todo)))</FONT></DIV>
<DIV><FONT face="Courier New"></FONT>&nbsp;</DIV>
<DIV><FONT face="Courier New">&nbsp; (define lockable-object</FONT></DIV>
<DIV><FONT face="Courier New">&nbsp;&nbsp;&nbsp; (class</FONT></DIV>
<DIV><FONT face="Courier New">&nbsp; &nbsp;&nbsp;&nbsp; (define reading 
0)</FONT></DIV>
<DIV><FONT face="Courier New">&nbsp;&nbsp;&nbsp; &nbsp; (define wrin</FONT><FONT 
face="Courier New">ing? #f)</FONT></DIV>
<DIV><FONT face="Courier New"></FONT>&nbsp;</DIV>
<DIV><FONT face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
(init-field&nbsp;obj)</FONT></DIV>
<DIV><FONT face="Courier New"></FONT>&nbsp;</DIV>
<DIV><FONT face="Courier New">&nbsp; &nbsp;&nbsp;&nbsp; (define 
(open-read)</FONT></DIV>
<DIV><FONT face="Courier New">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; (if 
writing?</FONT></DIV>
<DIV><FONT face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp; (begin (sleep) (open-read))</FONT></DIV>
<DIV><FONT face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; 
&nbsp;&nbsp;&nbsp; (set! reading (+ reading 1))))</FONT></DIV>
<DIV><FONT face="Courier New"></FONT>&nbsp;</DIV>
<DIV><FONT face="Courier New">&nbsp; &nbsp;&nbsp;&nbsp; (define 
(close-read)</FONT></DIV>
<DIV><FONT face="Courier New">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; (set! 
reading (- reading 1)))</FONT></DIV>
<DIV><FONT face="Courier New"></FONT>&nbsp;</DIV>
<DIV><FONT face="Courier New">&nbsp; &nbsp;&nbsp;&nbsp; (define 
(open-write)</FONT></DIV>
<DIV><FONT face="Courier New">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; (if (or 
writing? (&gt; reading 0))</FONT></DIV>
<DIV><FONT face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (begin (sleep) (open-write))</FONT></DIV>
<DIV><FONT face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; (set! writing? #t)))<BR></FONT></DIV>
<DIV><FONT face="Courier New">&nbsp; &nbsp;&nbsp;&nbsp; (define 
(close-write)</FONT></DIV>
<DIV><FONT face="Courier New">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; (set! 
writing? #f))</FONT></DIV>
<DIV><FONT face="Courier New">&nbsp;</DIV></FONT>
<DIV><FONT face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (define 
(read)</FONT></DIV>
<DIV><FONT face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; ; returns 
current value.</FONT></DIV>
<DIV><FONT face="Courier New">&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
;&nbsp;Copies it first so it doesn't change when writing later on</FONT></DIV>
<DIV><FONT face="Courier New">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 
(open-read)</FONT></DIV>
<DIV><FONT face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; (let ([r 
(send&nbsp;obj read)])</FONT></DIV>
<DIV><FONT face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; 
(close-read)</FONT></DIV>
<DIV><FONT 
face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
r)))</FONT></DIV>
<DIV><FONT face="Courier New"></FONT>&nbsp;</DIV>
<DIV><FONT face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (define (write 
to-write)</FONT></DIV>
<DIV><FONT face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
(open-write)</FONT></DIV>
<DIV><FONT face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (send 
obj write to-write)</FONT></DIV>
<DIV><FONT face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
(close-write)))))</FONT></DIV>
<DIV><FONT face="Courier New"></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial>Now all you have to do is fill in (read) and (write 
to-write)&nbsp;in read/write-object.</FONT></DIV>
<DIV><FONT face=Arial>(define lo (instantiate lockable-object () [obj 
'insert-read/write-object-here]))</FONT></DIV>
<DIV><FONT face=Arial>(send lo read)</FONT></DIV>
<DIV><FONT face=Arial>(send lo write 'value)</FONT></DIV>
<DIV><FONT face=Arial></FONT>&nbsp;</DIV>
<DIV><FONT size=2></FONT>&nbsp;</DIV>
<DIV><FONT size=2>-----Original Message----- <BR><B>From:</B> Keith Frost 
[mailto:keithf@amnis.com] <BR><B>Sent:</B> ג 09/09/2003 22:40 <BR><B>To:</B> Dor 
Kleiman <BR><B>Cc:</B> plt-scheme@list.cs.brown.edu <BR><B>Subject:</B> Re: 
Shared resources for servlets<BR><BR></DIV></FONT>
<BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px">
  <P><FONT size=2>Dor Kleiman wrote:<BR><BR>&gt; I'm not sure that would 
  work.<BR>&gt; Consider this:<BR>&gt; 3 readers are reading. A writer comes and 
  blocks. Then a reader comes<BR>&gt; and joins in, blocking the writer even 
  longer. This could block<BR>&gt; indefinitely, which won't be very good, would 
  it?<BR><BR>Well, this is a simple model.&nbsp; You point out that it has the 
  problem<BR>that writers can be denied service indefinitely, if there is a 
  sufficient<BR>volume of readers.&nbsp; This is true.&nbsp; One can devise a 
  more complex<BR>model, such as one where (for example) a writer sends a 
  request,<BR>and new readers are blocked until that request is satisfied.&nbsp; 
  But first,<BR>I just want to know how to implement the simple 
  model!<BR><BR>Keith<BR><BR><BR></FONT></P></BLOCKQUOTE>

</BODY>
</HTML>