Main Page   Packages   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members  

WriterPreferenceReadWriteLock.java

00001 class WriterPreferenceReadWriteLock 
00002 {
00003      protected int activeReaders_;
00004      protected int activeWriter_;
00005      protected final WriterLock writerLock_;
00006      protected int waitingWriters_;
00007      protected final ReaderLock readerLock_;
00008      protected int waitingReaders_;
00009      
00010      public WriterPreferenceReadWriteLock()
00011      {
00012           this.activeReaders_ = 0;
00013           this.activeWriter_ = 0;
00014           this.waitingReaders_ = 0;
00015           this.waitingWriters_ = 0;
00016           if (MainReadWriteLock.quantification$rl  == null)
00017           if (Bandera.choose())
00018           MainReadWriteLock.quantification$rl = new ReaderLock(this);
00019           this.readerLock_ = new ReaderLock(this);
00020           if (MainReadWriteLock.quantification$wl  == null)
00021           if (Bandera.choose())
00022           MainReadWriteLock.quantification$wl = new WriterLock(this);
00023           this.writerLock_ = new WriterLock(this);
00024      }
00025      
00026      protected synchronized boolean startReadFromNewReader ()
00027      {
00028           boolean pass = (this.startRead());
00029           if (!pass)
00030           {
00031                this.waitingReaders_ = (this.waitingReaders_ + 1);
00032           }
00033           return pass;
00034      }
00035      
00036      protected synchronized boolean startReadFromWaitingReader ()
00037      {
00038           boolean pass = (this.startRead());
00039           if (pass)
00040           {
00041                this.waitingReaders_ = (this.waitingReaders_ - 1);
00042           }
00043           return pass;
00044      }
00045      
00046      protected synchronized void cancelledWaitingReader ()
00047      {
00048           this.waitingReaders_ = (this.waitingReaders_ - 1);
00049      }
00050      
00051      protected synchronized boolean startRead ()
00052      {
00053           boolean allowRead = (this.allowReader());
00054           if (allowRead)
00055           {
00056                this.activeReaders_ = (this.activeReaders_ + 1);
00057           }
00058           return allowRead;
00059      }
00060      
00061      protected synchronized Signaller endRead ()
00062      {
00063           if (((this.activeReaders_ - 1) == 0) && (this.waitingWriters_ > 0))
00064           {
00065                return this.writerLock_;
00066           } else
00067           {
00068                return null;
00069           }
00070      }
00071      
00072      protected synchronized boolean startWriteFromNewWriter ()
00073      {
00074           boolean pass = (this.startWrite());
00075           if (!pass)
00076           {
00077                this.waitingWriters_ = (this.waitingWriters_ + 1);
00078           }
00079           return pass;
00080      }
00081      
00082      protected synchronized boolean startWriteFromWaitingWriter ()
00083      {
00084           boolean pass = (this.startWrite());
00085           if (pass)
00086           {
00087                this.waitingWriters_ = (this.waitingWriters_ - 1);
00088           }
00089           return pass;
00090      }
00091      
00092      protected synchronized void cancelledWaitingWriter ()
00093      {
00094           this.waitingWriters_ = (this.waitingWriters_ - 1);
00095      }
00096      
00097      protected synchronized boolean startWrite ()
00098      {
00099           boolean allowWrite = (this.activeReaders_ == 0);
00100           if (allowWrite)
00101           {
00102                this.activeWriter_ = 1;
00103           }
00104           return allowWrite;
00105      }
00106      
00107      protected synchronized Signaller endWrite ()
00108      {
00109           this.activeWriter_ = 0;
00110           if ((this.waitingReaders_ > 0) && (this.allowReader()))
00111           {
00112                return this.readerLock_;
00113           } else
00114           {
00115                if (this.waitingWriters_ > 0)
00116                {
00117                     return this.writerLock_;
00118                } else
00119                {
00120                     return null;
00121                }
00122           }
00123      }
00124      
00125      protected boolean allowReader ()
00126      {
00127           return (this.waitingWriters_ == 0);
00128      }
00129      
00130      public Sync readLock ()
00131      {
00132           return this.readerLock_;
00133      }
00134      
00135      public Sync writeLock ()
00136      {
00137           return this.writerLock_;
00138      }
00139 }

Generated at Thu Feb 7 06:59:21 2002 for Bandera by doxygen1.2.10 written by Dimitri van Heesch, © 1997-2001