Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
P
PolyORB-HI-Ada
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
Operations
Operations
Incidents
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
TASTE
PolyORB-HI-Ada
Commits
22b47903
Commit
22b47903
authored
Jun 08, 2014
by
yoogx
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
* Move Unprotected_Queue to a dedicated package
parent
1f87dae2
Changes
4
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
1375 additions
and
1167 deletions
+1375
-1167
src/Makefile.am
src/Makefile.am
+16
-14
src/polyorb_hi-thread_interrogators.adb
src/polyorb_hi-thread_interrogators.adb
+37
-1153
src/polyorb_hi-unprotected_queue.adb
src/polyorb_hi-unprotected_queue.adb
+1003
-0
src/polyorb_hi-unprotected_queue.ads
src/polyorb_hi-unprotected_queue.ads
+319
-0
No files found.
src/Makefile.am
View file @
22b47903
...
...
@@ -2,20 +2,22 @@ SUBDIRS = drivers
# BEGIN: DO NOT DELETE THIS LINE
ADA_SPECS_WITH_BODY
=
$(srcdir)
/polyorb_hi-aperiodic_task.ads
\
$(srcdir)
/polyorb_hi-background_task.ads
\
$(srcdir)
/polyorb_hi-hybrid_task.ads
\
$(srcdir)
/polyorb_hi-hybrid_task_driver.ads
\
$(srcdir)
/polyorb_hi-marshallers_g.ads
\
$(srcdir)
/polyorb_hi-messages.ads
\
$(srcdir)
/polyorb_hi-output.ads
\
$(srcdir)
/polyorb_hi-periodic_task.ads
\
$(srcdir)
/polyorb_hi-port_kinds.ads
\
$(srcdir)
/polyorb_hi-protocols.ads
\
$(srcdir)
/polyorb_hi-sporadic_task.ads
\
$(srcdir)
/polyorb_hi-suspenders.ads
\
$(srcdir)
/polyorb_hi-thread_interrogators.ads
\
$(srcdir)
/polyorb_hi-scheduler.ads
\
$(srcdir)
/polyorb_hi-utils.ads
$(srcdir)
/polyorb_hi-background_task.ads
\
$(srcdir)
/polyorb_hi-hybrid_task.ads
\
$(srcdir)
/polyorb_hi-hybrid_task_driver.ads
\
$(srcdir)
/polyorb_hi-marshallers_g.ads
\
$(srcdir)
/polyorb_hi-messages.ads
\
$(srcdir)
/polyorb_hi-null_task.ads
\
$(srcdir)
/polyorb_hi-output.ads
\
$(srcdir)
/polyorb_hi-periodic_task.ads
\
$(srcdir)
/polyorb_hi-port_kinds.ads
\
$(srcdir)
/polyorb_hi-protocols.ads
\
$(srcdir)
/polyorb_hi-sporadic_task.ads
\
$(srcdir)
/polyorb_hi-suspenders.ads
\
$(srcdir)
/polyorb_hi-thread_interrogators.ads
\
$(srcdir)
/polyorb_hi-scheduler.ads
\
$(srcdir)
/polyorb_hi-unprotected_queue.ads
\
$(srcdir)
/polyorb_hi-utils.ads
ADA_SPECS
=
$(ADA_SPECS_WITH_BODY)
$(srcdir)
/polyorb_hi.ads
\
$(srcdir)
/polyorb_hi-errors.ads
\
...
...
src/polyorb_hi-thread_interrogators.adb
View file @
22b47903
This diff is collapsed.
Click to expand it.
src/polyorb_hi-unprotected_queue.adb
0 → 100644
View file @
22b47903
This diff is collapsed.
Click to expand it.
src/polyorb_hi-unprotected_queue.ads
0 → 100644
View file @
22b47903
------------------------------------------------------------------------------
-- --
-- PolyORB HI COMPONENTS --
-- --
-- P O L Y O R B _ H I . U N P R O T E C T E D _ Q U E U E --
-- --
-- S p e c --
-- --
-- Copyright (C) 2014 ESA & ISAE. --
-- --
-- PolyORB HI is free software; you can redistribute it and/or modify it --
-- under terms of the GNU General Public License as published by the Free --
-- Software Foundation; either version 2, or (at your option) any later. --
-- PolyORB HI is distributed in the hope that it will be useful, but --
-- WITHOUT 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 PolyORB HI; see file --
-- COPYING. If not, write to the Free Software Foundation, 51 Franklin --
-- Street, Fifth Floor, Boston, MA 02111-1301, USA. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
-- --
-- PolyORB-HI/Ada is maintained by the TASTE project --
-- (taste-users@lists.tuxfamily.org) --
-- --
------------------------------------------------------------------------------
with
Ada
.
Unchecked_Conversion
;
With
Ada
.
Real_Time
;
With
System
;
with
PolyORB_HI_Generated
.
Deployment
;
with
PolyORB_HI
.
Errors
;
with
PolyORB_HI
.
Messages
;
with
PolyORB_HI
.
Port_Kinds
;
with
PolyORB_HI
.
Streams
;
generic
type
Port_Type
is
(
<>
);
-- This should be an enumeration type that represent the port list
-- of a given thread.
type
Integer_Array
is
array
(
Port_Type
)
of
Integer
;
-- An array type to specify the port FIFO sizes and urgencies.
type
Port_Kind_Array
is
array
(
Port_Type
)
of
Port_Kinds
.
Port_Kind
;
-- An array type to specify the kind of each port.
type
Port_Image_Array
is
array
(
Port_Type
)
of
PolyORB_HI_Generated
.
Deployment
.
Port_Sized_String
;
-- An array type to specify the image of each port.
type
Address_Array
is
array
(
Port_Type
)
of
System
.
Address
;
-- An array to specify a list of arrays of various sizes.
type
Overflow_Protocol_Array
is
array
(
Port_Type
)
of
Port_Kinds
.
Overflow_Handling_Protocol
;
-- An array to specify the overflow_handling_protocol of each port
type
Thread_Interface_Type
(
Port
:
Port_Type
)
is
private
;
-- This is a discriminated record type that represents a thread
-- port. The discriminant of this type must have a default value
-- so that the type size can be computed at compile time.
Current_Entity
:
in
PolyORB_HI_Generated
.
Deployment
.
Entity_Type
;
-- Indicate the thread for which this package has been
-- instantiated.
Thread_Port_Kinds
:
in
Port_Kind_Array
;
-- For each port, a value indicates the kind and the orientation
-- of the port.
Has_Event_Ports
:
in
Boolean
;
-- True if Thread_Port_Kinds contains Event or Event Data ports
Thread_Port_Images
:
in
Port_Image_Array
;
-- For each port, a string indicates the image of the port.
Thread_Fifo_Sizes
:
in
Integer_Array
;
-- This array gives for each port the FIFO size (depending on the
-- port nature or on an AADL property associated to the port. FIFO
-- size for IN DATA ports is either 1 (immediate connection) or 2
-- (delayed connection). In this case (data ports), the value must
-- not be interpreted as a FIFO size but rather a way to support
-- delayed connections. By convention, FIFO size for all OUT ports
-- must be set to -1 by the code generator.
Thread_Fifo_Offsets
:
in
Integer_Array
;
-- This array holds an incremental value of the queue size for
-- each IN [event] [data] port. For each IN [event] [data] port, the
-- corresponding offset value is 1 + the sum of all queue sized of
-- the ports declared before it. For other port kinds, the value
-- must be 0. We give this array as a generic formal instead of
-- computing it in this package to guarantee an O(1) access time
-- for queue elements.
Thread_Overflow_Protocols
:
in
Overflow_Protocol_array
;
-- This array gives for each port the Overflow_Handling_Protocol
-- depending on the AADL property associated to the port.
Urgencies
:
in
Integer_Array
;
-- This array gives for each port the Urgency depending on the
-- AADL property associated to the port.
Global_Data_Queue_Size
:
in
Integer
;
-- The sum of all IN [event] [data] port queue sizes. Giving this
-- value as a generic formal in spite of the possibility of
-- deducing it from Thread_Fifo_Sizes is done to guarantee static
-- allocation of the global message queue of the thread.
N_Destinations
:
in
Integer_Array
;
-- For each OUT port, we give the number of destinations. This
-- will be used to know the length of each element of the array
-- below.
Destinations
:
in
Address_Array
;
-- For each OUT port, we give the address of an constant
-- Entity_Type array containing the list of all the destination of
-- the port. For IN ports, we give Null_Address.
with
procedure
Marshall
(
R
:
Thread_Interface_Type
;
M
:
in
out
PolyORB_Hi
.
Messages
.
Message_Type
);
-- A procedure that marshalls a Thread port content into a message.
with
function
Next_Deadline
return
Ada
.
Real_Time
.
Time
;
-- To indicate when does the next deadline of the thread occur (in
-- absolute time).
package
PolyORB_HI
.
Unprotected_Queue
is
use
Ada
.
Real_Time
;
use
PolyORB_HI_Generated
.
Deployment
;
use
PolyORB_HI
.
Streams
;
-- The types and the routines below give a flexible way to handle
-- Thread_Interface_Type variables and to store them in arrays.
type
Port_Stream
is
new
PolyORB_HI
.
Streams
.
Stream_Element_Array
(
1
..
Thread_Interface_Type
'
Size
/
8
);
type
Port_Stream_Entry
is
record
From
:
Entity_Type
;
Payload
:
Port_Stream
;
end
record
;
-- A couple of a message and its sender
N_Ports
:
constant
Integer
:=
Port_Type
'
Pos
(
Port_Type
'
Last
)
-
Port_Type
'
Pos
(
Port_Type
'
First
)
+
1
;
-- Number of ports in the thread
function
Interface_To_Stream
is
new
Ada
.
Unchecked_Conversion
(
Thread_Interface_Type
,
Port_Stream
);
function
Stream_To_Interface
is
new
Ada
.
Unchecked_Conversion
(
Port_Stream
,
Thread_Interface_Type
);
function
CE
return
String
;
pragma
Inline
(
CE
);
-- Shortcut to Entity_Image (Current_Entity)
type
Port_Stream_Array
is
array
(
Port_Type
)
of
Port_Stream_Entry
;
subtype
Big_Port_Index_Type
is
Integer
range
0
..
Global_Data_Queue_Size
;
Default_Index_Value
:
constant
Big_Port_Index_Type
:=
(
if
Global_Data_Queue_Size
>
0
then
1
else
0
);
type
Big_Port_Stream_Array
is
array
(
Big_Port_Index_Type
)
of
Port_Stream_Entry
;
type
Big_Port_Type_Array
is
array
(
Big_Port_Index_Type
)
of
Port_Type
;
-- FIXME: We begin by 0 although the 0 position is unused. We do
-- this to avoid compile time warning. After this package is
-- deeply tested, begin by 1 and disable Index_Check and
-- Range_Check for the Big_Port_Stream_Array type.
type
Port_Index_Array
is
array
(
Port_Type
)
of
Big_Port_Index_Type
;
-- An array type to specify the port FIFO sizes and urgencies.
procedure
H_Increment_First
(
F
:
in
out
Big_Port_Index_Type
);
procedure
H_Increment_Last
(
L
:
in
out
Big_Port_Index_Type
);
pragma
Inline
(
H_Increment_First
);
pragma
Inline
(
H_Increment_Last
);
-- Cyclic incrementation and decrementation of F or L within the
-- 1..Global_Data_Queue_Size range.
type
Boolean_Array
is
array
(
Port_Type
)
of
Boolean
;
type
Time_Array
is
array
(
Port_Type
)
of
Time
;
procedure
Read_Event
(
P
:
out
Port_Type
;
Valid
:
out
Boolean
;
Not_Empty
:
Boolean
);
-- Same as 'Wait_Event' but without blocking. Valid is set to
-- False if there is nothing to receive.
procedure
Dequeue
(
T
:
Port_Type
;
P
:
out
Port_Stream_Entry
;
Not_Empty
:
out
Boolean
);
-- Dequeue a value from the partial FIFO of port T. If there is
-- no enqueued value, return the latest dequeued value.
function
Read_In
(
T
:
Port_Type
)
return
Port_Stream_Entry
;
-- Read the oldest queued value on the partial FIFO of IN port
-- T without dequeuing it. If there is no queued value, return
-- the latest dequeued value.
function
Read_Out
(
T
:
Port_Type
)
return
Port_Stream_Entry
;
-- Return the value put for OUT port T.
function
Is_Invalid
(
T
:
Port_Type
)
return
Boolean
;
-- Return True if no Put_Value has been called for this port
-- since the last Set_Invalid call.
procedure
Set_Invalid
(
T
:
Port_Type
);
-- Set the value stored for OUT port T as invalid to impede its
-- future sending without calling Put_Value. This procedure is
-- generally called just after Read_Out. However we cannot
-- combine them in one routine because we need Read_Out to be a
-- function and functions cannot modify protected object
-- states.
procedure
Store_In
(
P
:
Port_Stream_Entry
;
T
:
Time
;
Not_Empty
:
out
Boolean
);
-- Stores a new incoming message in its corresponding
-- position. If this is an event [data] incoming message, then
-- stores it in the queue, updates its most recent value and
-- unblock the barrier. Otherwise, it only overrides the most
-- recent value. T is the time stamp associated to the port
-- P. In case of data ports with delayed connections, it
-- indicates the instant from which the data of P becomes
-- deliverable.
procedure
Store_Out
(
P
:
Port_Stream_Entry
;
T
:
Time
);
-- Store a value of an OUT port to be sent at the next call to
-- Send_Output and mark the value as valid.
function
Count
(
T
:
Port_Type
)
return
Integer
;
-- Return the number of pending messages on IN port T.
function
Get_Time_Stamp
(
P
:
Port_Type
)
return
Time
;
-- Return the time stamp associated to port T
-- The following are accessors to some internal data of the event queue
function
Get_Most_Recent_Value
(
P
:
Port_Type
)
return
Port_Stream_Entry
;
procedure
Set_Most_Recent_Value
(
P
:
Port_Type
;
S
:
Port_Stream_Entry
;
T
:
Time
);
-- The protected object contains also an array to store the
-- values of received IN DATA ports as well as the most recent
-- value of IN EVENT DATA. For OUT port, the value is the
-- message to be send when Send_Output is called. In case of an
-- event data port, we do not use the 2 elements of the array
-- to store most recent values because there is no delayed
-- connections for event data ports.
private
Global_Data_Queue
:
Big_Port_Stream_Array
;
-- The structure of the buffer is as follows:
-- ----------------------------------------------------------------
-- | Q1 | Q2 | Q3 | ... | Qn |
-- ----------------------------------------------------------------
-- O1 O2 O3 O4 ... On
-- 'On' is the offset associated to IN [event] [data] port n,
-- given from the generic formal, Thread_FIFO_Offsets. This
-- guarantees an O(1) access and storage time of a given
-- element in the global queue. Intrinsically, the global table
-- is a concatenation of circular arrays each one corresponding
-- to a port queue.
Firsts
:
Port_Index_Array
:=
(
Port_Type
'
Range
=>
Default_Index_Value
);
Lasts
:
Port_Index_Array
:=
(
Port_Type
'
Range
=>
0
);
-- Used for IN [event] [data] ports to navigate in the global
-- queue. For IN DATA ports, in case of immediate connection
-- only the 'Lasts' value is relevant and it is 0 or 1, in case
-- of a delayed connection both values are relevant.
Empties
:
Boolean_Array
:=
(
Port_Type
'
Range
=>
True
);
-- Indicates whether each port-FIFO is empty or not
Global_Data_History
:
Big_Port_Type_Array
;
GH_First
:
Big_Port_Index_Type
:=
Default_Index_Value
;
GH_Last
:
Big_Port_Index_Type
:=
0
;
-- This contains, in an increasing chronological order the IN
-- EVENT ports that have a pending event. Example (P_1, P_3,
-- P_1, P_2, P_3) means that the oldest pending message is
-- received on P_1 then on P_3, then on P_1 again and so on...
-- FIXME: Add N_Ports to the array size to handle the case the
-- thread has an IN event [data] port with a FIFO size equal to
-- zero which is not supported yet.
Most_Recent_Values
:
Port_Stream_Array
;
Time_Stamps
:
Time_Array
;
Initialized
:
Boolean_Array
:=
(
Port_Type
'
Range
=>
False
);
-- To indicate whether the port ever received a data (or an
-- event).
Value_Put
:
Boolean_Array
:=
(
Port_Type
'
Range
=>
False
);
-- To indicate whether the OUT port values have been set in
-- order to be sent.
N_Empties
:
Integer
:=
N_Ports
;
-- Number of empty partial queues. At the beginning, all the
-- queues are empty.
end
PolyORB_HI
.
Unprotected_Queue
;
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment