1--
2--  Copyright (c) 2009,
3--  Reto Buerki, Adrian-Ken Rueegsegger
4--
5--  This file is part of Alog.
6--
7--  Alog is free software; you can redistribute it and/or modify
8--  it under the terms of the GNU Lesser General Public License as published
9--  by the Free Software Foundation; either version 2.1 of the License, or
10--  (at your option) any later version.
11--
12--  Alog is distributed in the hope that it will be useful,
13--  but WITHOUT ANY WARRANTY; without even the implied warranty of
14--  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15--  GNU Lesser General Public License for more details.
16--
17--  You should have received a copy of the GNU Lesser General Public License
18--  along with Alog; if not, write to the Free Software
19--  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
20--  MA  02110-1301  USA
21--
22
23with Ada.Containers.Doubly_Linked_Lists;
24
25with Alog.Log_Request;
26
27--  Alog Protected Containers. This package provides protected containers which
28--  are safe for concurrent access.
29package Alog.Protected_Containers is
30
31   ----------------------
32   -- Log_Request_List --
33   ----------------------
34
35   type Log_Request_Storage is private;
36
37   protected type Log_Request_List is
38
39      procedure Put (Element : Log_Request.Instance);
40      --  Put an element at the end of the request list.
41
42      entry Get (Element : out Log_Request.Instance);
43      --  Get the first element from the list (and delete it).
44
45      procedure Done;
46      --  Signal successfull processing of request previously gotten from list.
47
48      entry All_Done;
49      --  This procedure blocks until the list is empty and there are no
50      --  pending requests. A requests is pending when it is taken off the list
51      --  via Get but it's successfull processing has not been signaled back
52      --  via the procedure Done.
53
54      procedure Clear;
55      --  Clear the request list by deleting all log requests.
56
57      function Length return Natural;
58      --  Return the number of elements in the list.
59
60      function Pending return Natural;
61      --  Return the number of pending requests.
62
63   private
64
65      Requests           : Log_Request_Storage;
66      Requests_Available : Boolean := False;
67      Pending_Counter    : Natural := 0;
68
69   end Log_Request_List;
70   --  Protected variant of a log request list. This list holds log request
71   --  objects and is safe for concurrent access. It operates in FIFO-Mode.
72
73private
74
75   package List_Of_Log_Requests_Package is
76     new Ada.Containers.Doubly_Linked_Lists
77       (Element_Type => Log_Request.Instance,
78        "="          => Log_Request."=");
79
80   package LOLRP renames List_Of_Log_Requests_Package;
81
82   type Log_Request_Storage is new LOLRP.List with null record;
83
84end Alog.Protected_Containers;
85