XPSyncRW.pas
上传用户:yjb1804
上传日期:2021-01-30
资源大小:3105k
文件大小:6k
源码类别:

Email服务器

开发平台:

Delphi

  1. unit XPSyncRW;
  2. {
  3.  $Source: /cvsroot/dunit/dunit/Contrib/DUnitWizard/Source/Common/XPSyncRW.pas,v $
  4.  $Revision: 1.1 $
  5.  $Date: 2004/05/03 15:07:15 $
  6.  Last amended by $Author: pvspain $
  7.  $State: Exp $
  8.  XPSyncRW:
  9.  Process/thread synchronisation scenarios.
  10.  Solution for classic Readers Writers synchronisation problem as
  11.  synchronisation objects / interfaces.
  12.  Copyright (c) 2001 by The Excellent Programming Company Pty Ltd
  13.  (Australia) (ABN 27 005 394 918).
  14.  Contact Paul Spain via email: paul@xpro.com.au
  15.  This unit is free software; you can redistribute it and/or
  16.  modify it under the terms of the GNU Lesser General Public
  17.  License as published by the Free Software Foundation; either
  18.  version 2.1 of the License, or (at your option) any later version.
  19.  This unit is distributed in the hope that it will be useful,
  20.  but WITHOUT ANY WARRANTY; without even the implied warranty of
  21.  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  22.  Lesser General Public License for more details.
  23.  You should have received a copy of the GNU Lesser General Public
  24.  License along with this unit; if not, the license can be viewed at:
  25.  http://www.gnu.org/copyleft/lesser.html
  26.  or write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
  27.  Boston, MA  02111-1307  USA
  28. }
  29. interface
  30. uses
  31.   XPRestore;      // TXPRestore
  32.   ////////////////////////////////////////////////////////////////////////////
  33.   //
  34.   //  Readers and Writers
  35.   //
  36.   //  This problem involves the coordination of readers and writers of
  37.   //  a single common resource. A reader can have simultaneous
  38.   //  access with other readers, but a writer requires exclusive access to the
  39.   //  resource.
  40.   //  References:
  41.   //  For further description of the problem
  42.   //  Section 2.3.2, "Modern Operationg Systems" by Andrew Tannenbaum
  43.   //  (ISBN 0135957524)
  44.   //  This URL provides commentary on the implementations
  45.   //  http://www.cis.temple.edu/~ingargio/cis307/readings/readwriters.html
  46.   //
  47.   ////////////////////////////////////////////////////////////////////////////
  48.   // Declaring Readers/Writers as an interface makes it easier to swap between
  49.   // a readers or writers biased interface implementation without having to
  50.   // modify the source for clients of the interface.
  51. type IXPSyncRW = interface
  52.     ['{E0036BF1-89F5-11D4-8C7E-0080ADB62643}']
  53.     procedure ReadBegin;
  54.     procedure ReadEnd;
  55.     procedure WriteBegin;
  56.     procedure WriteEnd;
  57.     procedure ReadWriteBegin;
  58.     procedure ReadWriteEnd;
  59.     end;
  60.   // This enumeration indicates your starvation preference:
  61.   // Giving priority to readers, spReaders, will starve writers.
  62.   // Giving priority to writers, spWriters, will starve readers.
  63.   // An unfortunate side-effect of the readers-writers problem is that when
  64.   // there is a large imbalance in the ratio of readers:writers, either
  65.   // readers or writers can be starved (blocked indefinitley) depending on
  66.   // the solution implementation.
  67. type TXPSyncPriority = (spReaders, spWriters);
  68. type TSyncRWBase = class(TInterfacedObject, IXPSyncRW)
  69.     protected
  70.     // Use ReadBegin/ReadEnd with a try..finally context
  71.     procedure ReadBegin; virtual; abstract;
  72.     procedure ReadEnd; virtual; abstract;
  73.     // Use WriteBegin/WriteEnd with a try..finally context
  74.     procedure WriteBegin; virtual; abstract;
  75.     procedure WriteEnd; virtual; abstract;
  76.     // Use ReadWriteBegin/ReadWriteEnd with a try..finally context
  77.     procedure ReadWriteBegin; virtual;
  78.     procedure ReadWriteEnd; virtual;
  79.     end;
  80. type TXPSyncRead = class(TXPRestore)
  81.      private
  82.      FSync: IXPSyncRW;
  83.      public
  84.      constructor Create(ASync: IXPSyncRW);
  85.      destructor Destroy; override;
  86.      end;
  87. type TXPSyncWrite = class(TXPRestore)
  88.      private
  89.      FSync: IXPSyncRW;
  90.      public
  91.      constructor Create(ASync: IXPSyncRW);
  92.      destructor Destroy; override;
  93.      end;
  94. type TXPSyncReadWrite = class(TXPRestore)
  95.      private
  96.      FSync: IXPSyncRW;
  97.      public
  98.      constructor Create(ASync: IXPSyncRW);
  99.      destructor Destroy; override;
  100.      end;
  101. implementation
  102. const
  103.   CVSID: string = '$Header: /cvsroot/dunit/dunit/Contrib/DUnitWizard/Source/Common/XPSyncRW.pas,v 1.1 2004/05/03 15:07:15 pvspain Exp $';
  104. /////////////////////////////////////////////////////////////////////////////
  105. //    TSyncRWBase implementation
  106. /////////////////////////////////////////////////////////////////////////////
  107. procedure TSyncRWBase.ReadWriteBegin;
  108.   begin
  109.   WriteBegin;
  110.   end;
  111. procedure TSyncRWBase.ReadWriteEnd;
  112.   begin
  113.   WriteEnd;
  114.   end;
  115. /////////////////////////////////////////////////////////////////////////////
  116. //    TXPSyncRead implementation
  117. /////////////////////////////////////////////////////////////////////////////
  118. constructor TXPSyncRead.Create(ASync: IXPSyncRW);
  119.   begin
  120.   inherited Create;
  121.   FSync := ASync;
  122.   FSync.ReadBegin;
  123.   end;
  124. destructor TXPSyncRead.Destroy;
  125.   begin
  126.   FSync.ReadEnd;
  127.   inherited;
  128.   end;
  129. /////////////////////////////////////////////////////////////////////////////
  130. //    TXPSyncWrite implementation
  131. /////////////////////////////////////////////////////////////////////////////
  132. constructor TXPSyncWrite.Create(ASync: IXPSyncRW);
  133.   begin
  134.   inherited Create;
  135.   FSync := ASync;
  136.   FSync.WriteBegin;
  137.   end;
  138. destructor TXPSyncWrite.Destroy;
  139.   begin
  140.   FSync.WriteEnd;
  141.   inherited;
  142.   end;
  143. /////////////////////////////////////////////////////////////////////////////
  144. //    TXPSyncReadWrite implementation
  145. /////////////////////////////////////////////////////////////////////////////
  146. constructor TXPSyncReadWrite.Create(ASync: IXPSyncRW);
  147.   begin
  148.   inherited Create;
  149.   FSync := ASync;
  150.   FSync.ReadWriteBegin;
  151.   end;
  152. destructor TXPSyncReadWrite.Destroy;
  153.   begin
  154.   FSync.ReadWriteEnd;
  155.   inherited;
  156.   end;
  157. end.