/usr/share/ada/adainclude/gnatcoll/gnatcoll-ravenscar-sporadic_server.adb is in libgnatcoll16.1.0-dev 17.0.2017-3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 | ------------------------------------------------------------------------------
-- --
-- G N A T C O L L --
-- --
-- Copyright (C) 2008-2017, AdaCore --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
-- ware Foundation; either version 2, or (at your option) any later ver- --
-- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
-- for more details. You should have received a copy of the GNU General --
-- Public License distributed with GNAT; see file COPYING. If not, write --
-- to the Free Software Foundation, 51 Franklin Street, Fifth Floor, --
-- Boston, MA 02110-1301, USA. --
-- --
-- --
-- --
-- --
-- --
-- --
-- --
-- --
-- GNAT was originally developed by the GNAT team at New York University. --
-- Extensive contributions were provided by Ada Core Technologies Inc. --
-- --
------------------------------------------------------------------------------
with GNATCOLL.Ravenscar.Utils;
package body GNATCOLL.Ravenscar.Sporadic_Server is
use GNATCOLL.Ravenscar.Utils;
procedure Put_Request (Par : Param) is
begin
-- just a delegation
Protocol.Put_Request (Par);
end Put_Request;
protected body Protocol is
procedure Update_Barrier is
begin
Barrier := Pending > 0;
end Update_Barrier;
pragma Inline (Update_Barrier);
procedure Put_Request (Par : Param) is
begin
Buffer (Insert_Index) := Par;
Increase_Counter (Insert_Index, QS);
-- Check if with the posting of this message, the Insert_Index is
-- greater of the extract index: if so, increase also the extract
-- index to avoid fetching a newer request when older ones are
-- pending
if Buffer_Overflow then
Increase_Counter (Extract_Index, QS);
end if;
-- increase the number of pending request but do not overcome the
-- maximum
if Pending < QS then
Pending := Pending + 1;
end if;
-- If Insert_Index = Extract_Index, then at the next posting an
-- overflow may occour
if Insert_Index = Extract_Index then
Buffer_Overflow := True;
end if;
Update_Barrier;
end Put_Request;
entry Get_Request
(Release_Time : out Ada.Real_Time.Time;
Par : out Param) when Barrier
is
begin
-- get the real release time
Release_Time := Ada.Real_Time.Clock;
-- cancel the overflow if fetching request
if Extract_Index = Insert_Index then
Buffer_Overflow := False;
end if;
Par := Buffer (Extract_Index);
Increase_Counter (Extract_Index, QS);
Pending := Pending - 1;
Update_Barrier;
end Get_Request;
end Protocol;
task body Sporadic_Task is
use Ada.Real_Time;
Next_Time : Time := System_Start_Time;
Release_Time : Time;
Par : Param;
begin
loop
delay until Next_Time;
Protocol.Get_Request (Release_Time, Par);
Sporadic_Operation (Par);
Next_Time := Release_Time + Milliseconds (Minimum_Interelease_Time);
end loop;
end Sporadic_Task;
end GNATCOLL.Ravenscar.Sporadic_Server;
|