File : a-synbar.adb


   1 ------------------------------------------------------------------------------
   2 --                                                                          --
   3 --                         GNAT RUN-TIME COMPONENTS                         --
   4 --                                                                          --
   5 --             A D A . S Y N C H R O N O U S _ B A R R I E R S              --
   6 --                                                                          --
   7 --                                  B o d y                                 --
   8 --                                                                          --
   9 --          Copyright (C) 1992-2011, Free Software Foundation, Inc.         --
  10 --                                                                          --
  11 -- This specification is derived from the Ada Reference Manual for use with --
  12 -- GNAT. The copyright notice above, and the license provisions that follow --
  13 -- apply solely to the  contents of the part following the private keyword. --
  14 --                                                                          --
  15 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
  16 -- terms of the  GNU General Public License as published  by the Free Soft- --
  17 -- ware  Foundation;  either version 3,  or (at your option) any later ver- --
  18 -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
  19 -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
  20 -- or FITNESS FOR A PARTICULAR PURPOSE.                                     --
  21 --                                                                          --
  22 --                                                                          --
  23 --                                                                          --
  24 --                                                                          --
  25 --                                                                          --
  26 -- You should have received a copy of the GNU General Public License and    --
  27 -- a copy of the GCC Runtime Library Exception along with this program;     --
  28 -- see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see    --
  29 -- <http://www.gnu.org/licenses/>.                                          --
  30 --                                                                          --
  31 -- GNAT was originally developed  by the GNAT team at  New York University. --
  32 -- Extensive contributions were provided by Ada Core Technologies Inc.      --
  33 --                                                                          --
  34 ------------------------------------------------------------------------------
  35 
  36 package body Ada.Synchronous_Barriers is
  37 
  38    protected body Synchronous_Barrier is
  39 
  40       --  The condition "Wait'Count = Release_Threshold" opens the barrier when
  41       --  the required number of tasks is reached. The condition "Keep_Open"
  42       --  leaves the barrier open while there are queued tasks. While there are
  43       --  tasks in the queue no new task will be queued (no new protected
  44       --  action can be started on a protected object while another protected
  45       --  action on the same protected object is underway, RM 9.5.1 (4)),
  46       --  guaranteeing that the barrier will remain open only for those tasks
  47       --  already inside the queue when the barrier was open.
  48 
  49       entry Wait (Notified : out Boolean)
  50         when Keep_Open or else Wait'Count = Release_Threshold
  51       is
  52       begin
  53          --  If we are executing the entry it means that the required number of
  54          --  tasks have been queued in the entry. Keep_Open barrier will remain
  55          --  true until all queued tasks are out.
  56 
  57          Keep_Open := Wait'Count > 0;
  58 
  59          --  The last released task will close the barrier and get the Notified
  60          --  token.
  61 
  62          Notified := Wait'Count = 0;
  63       end Wait;
  64    end Synchronous_Barrier;
  65 
  66    ----------------------
  67    -- Wait_For_Release --
  68    ----------------------
  69 
  70    procedure Wait_For_Release
  71      (The_Barrier : in out Synchronous_Barrier;
  72       Notified    : out Boolean)
  73    is
  74    begin
  75       The_Barrier.Wait (Notified);
  76    end Wait_For_Release;
  77 
  78 end Ada.Synchronous_Barriers;