File : g-boubuf.ads


   1 ------------------------------------------------------------------------------
   2 --                                                                          --
   3 --                         GNAT LIBRARY COMPONENTS                          --
   4 --                                                                          --
   5 --                  G N A T . B O U N D E D _ B U F F E R S                 --
   6 --                                                                          --
   7 --                                 S p e c                                  --
   8 --                                                                          --
   9 --                     Copyright (C) 2003-2010, AdaCore                     --
  10 --                                                                          --
  11 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
  12 -- terms of the  GNU General Public License as published  by the Free Soft- --
  13 -- ware  Foundation;  either version 3,  or (at your option) any later ver- --
  14 -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
  15 -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
  16 -- or FITNESS FOR A PARTICULAR PURPOSE.                                     --
  17 --                                                                          --
  18 --                                                                          --
  19 --                                                                          --
  20 --                                                                          --
  21 --                                                                          --
  22 -- You should have received a copy of the GNU General Public License and    --
  23 -- a copy of the GCC Runtime Library Exception along with this program;     --
  24 -- see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see    --
  25 -- <http://www.gnu.org/licenses/>.                                          --
  26 --                                                                          --
  27 -- GNAT was originally developed  by the GNAT team at  New York University. --
  28 -- It is now maintained by Ada Core Technologies Inc (http://www.gnat.com). --
  29 --                                                                          --
  30 ------------------------------------------------------------------------------
  31 
  32 --  This package provides a thread-safe generic bounded buffer abstraction.
  33 --  Instances are useful directly or as parts of the implementations of other
  34 --  abstractions, such as mailboxes.
  35 
  36 --  Bounded_Buffer is declared explicitly as a protected type, rather than as
  37 --  a simple limited private type completed as a protected type, so that
  38 --  clients may make calls accordingly (i.e., conditional/timed entry calls).
  39 
  40 with System;
  41 
  42 generic
  43    type Element is private;
  44    --  The type of the values contained within buffer objects
  45 
  46 package GNAT.Bounded_Buffers is
  47    pragma Pure;
  48 
  49    type Content is array (Positive range <>) of Element;
  50    --  Content is an internal artefact that cannot be hidden because protected
  51    --  types cannot contain type declarations.
  52 
  53    Default_Ceiling : constant System.Priority := System.Default_Priority;
  54    --  A convenience value for the Ceiling discriminant
  55 
  56    protected type Bounded_Buffer
  57       (Capacity : Positive;
  58       --  Objects of type Bounded_Buffer specify the maximum number of Element
  59       --  values they can hold via the discriminant Capacity.
  60 
  61       Ceiling : System.Priority)
  62       --  Users must specify the ceiling priority for the object. If the
  63       --  Real-Time Systems Annex is not in use this value is not important.
  64    is
  65       pragma Priority (Ceiling);
  66 
  67       entry Insert (Item : Element);
  68       --  Insert Item into the buffer, blocks caller until space is available
  69 
  70       entry Remove (Item : out Element);
  71       --  Remove next available Element from buffer. Blocks caller until an
  72       --  Element is available.
  73 
  74       function Empty return Boolean;
  75       --  Returns whether the instance contains any Elements.
  76       --  Note: State may change immediately after call returns.
  77 
  78       function Full return Boolean;
  79       --  Returns whether any space remains within the instance.
  80       --  Note: State may change immediately after call returns.
  81 
  82       function Extent return Natural;
  83       --  Returns the number of Element values currently held
  84       --  within the instance.
  85       --  Note: State may change immediately after call returns.
  86 
  87    private
  88       Values   : Content (1 .. Capacity);
  89       --  The container for the values held by the buffer instance
  90 
  91       Next_In  : Positive := 1;
  92       --  The index of the next Element inserted. Wraps around
  93 
  94       Next_Out : Positive := 1;
  95       --  The index of the next Element removed. Wraps around
  96 
  97       Count    : Natural  := 0;
  98       --  The number of Elements currently held
  99    end Bounded_Buffer;
 100 
 101 end GNAT.Bounded_Buffers;