File: posix-asynchronous_io.ads

package info (click to toggle)
libflorist 2014-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 1,996 kB
  • ctags: 304
  • sloc: ada: 11,705; ansic: 7,195; makefile: 154; sh: 19
file content (157 lines) | stat: -rw-r--r-- 7,427 bytes parent folder | download | duplicates (3)
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
------------------------------------------------------------------------------
--                                                                          --
--            FLORIST (FSU Implementation of POSIX.5) COMPONENTS            --
--                                                                          --
--                 P O S I X . A S Y N C H R O N O U S _ I O                --
--                                                                          --
--                                  S p e c                                 --
--                                                                          --
--                                                                          --
--  This  file is a component  of FLORIST,  an implementation of the POSIX  --
--  Ada  bindings  for  use with the GNAT Ada compiler and the FSU Gnu Ada  --
--  Runtime Library (GNARL).                                                --
--                                                                          --
--  This package specification contains some text extracted from  IEEE STD  --
--  1003.5: 1990, Information Technology -- POSIX Ada Language  Interfaces  --
--  Part 1: Binding  for  System Application Program Interface, as amended  --
--  by IEEE STD 1003.5b: 1996, Amendment 1: Realtime Extensions, copyright  --
--  1996 by the Institute of Electrical and Electronics Engineers, Inc.     --
--                                                                          --
--  The package specifications in the IEEE standards cited above represent  --
--  only a  portion  of  the  documents  and  are  not to be interpreteted  --
--  outside the context  of  the documents.  The standards must be used in  --
--  conjunction  with  the  package   specifications  in  order  to  claim  --
--  conformance.   The IEEE takes no responsibility for and will assume no  --
--  liability for damages resulting from the reader's misinterpretation of  --
--  said  information resulting from its out-of-context nature.   To order  --
--  copies of the IEEE standards,  please contact the  IEEE Service Center  --
--  at 445 Hoes Lane, PO Box 1331, Piscataway, NJ 08855-1331; via phone at  --
--  1-800-678-IEEE, 908-981-1393; or via fax at 908-981-9667.               --
--                                                                          --
--  These  package  specifications are  distributed in  the hope that they  --
--  will  be useful, but  WITHOUT  ANY  WARRANTY; without even the implied  --
--  warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.        --
--                                                                          --
------------------------------------------------------------------------------
--  [$Revision: 111066 $]

with POSIX.C,
     POSIX.IO,
     POSIX.Signals;
package POSIX.Asynchronous_IO is

   type AIO_Descriptor is private;
   function Create_AIO_Control_Block return AIO_Descriptor;
   procedure Destroy_AIO_Control_Block (AD : in out AIO_Descriptor);

   type List_IO_Operations is
     (No_Op,
      Read,
      Write);
   type IO_Array_Pointer is access Ada_Streams.Stream_Element_Array;
      for IO_Array_Pointer'Size use Standard'Address_Size;
      --  force this to be a "thin" pointer, like C pointers

   function Get_File (AD : AIO_Descriptor)
     return POSIX.IO.File_Descriptor;
   procedure Set_File
     (AD  : AIO_Descriptor;
      File : POSIX.IO.File_Descriptor);
   function Get_Offset (AD : AIO_Descriptor) return POSIX.IO.IO_Offset;
   procedure Set_Offset
     (AD     : AIO_Descriptor;
      Offset : POSIX.IO.IO_Offset);
   function Get_Buffer (AD : AIO_Descriptor) return IO_Array_Pointer;
   procedure Set_Buffer
     (AD     : AIO_Descriptor;
      Buffer : IO_Array_Pointer);
   function Get_Length (AD : AIO_Descriptor) return POSIX.IO_Count;
   procedure Set_Length
     (AD     : AIO_Descriptor;
      Length : POSIX.IO_Count);
   function Get_Priority_Reduction (AD : AIO_Descriptor) return Natural;
   procedure Set_Priority_Reduction
     (AD                 : AIO_Descriptor;
      Priority_Reduction : Natural);
   function Get_Event (AD : AIO_Descriptor) return POSIX.Signals.Signal_Event;
   procedure Set_Event
     (AD    : AIO_Descriptor;
      Event : POSIX.Signals.Signal_Event);
   function Get_Operation (AD : AIO_Descriptor) return List_IO_Operations;
   procedure Set_Operation
     (AD        : AIO_Descriptor;
      Operation : List_IO_Operations);

   procedure Read (AD : AIO_Descriptor);
   procedure Write (AD : AIO_Descriptor);

   type AIO_Descriptor_List is
      array (Positive range <>) of aliased AIO_Descriptor;

   --  .... "aliased" is not in POSIX.5b

   --  ????? Change POSIX.5b?
   --  This array should probably have been a private (or limited private)
   --  type, so that we could hide a copy of the C-style array of pointers
   --  inside the object.  As things stand, the need to be able to recover
   --  an Ada pointer to the buffer of each AIOCB is forcing us to put a
   --  wrapper around each AIOCB pointer, and so we cannot pass the array
   --  directly as argument to any C system call.  Instead, we have to
   --  dynamically create a C-style array at the point of call.

   procedure List_IO_No_Wait
     (List  : in out AIO_Descriptor_List;
      Event : POSIX.Signals.Signal_Event);
   procedure List_IO_Wait
     (List           : in out AIO_Descriptor_List;
      Masked_Signals : POSIX.Signal_Masking := POSIX.RTS_Signals);

   type AIO_Status is
     (In_Progress,
      Completed_Successfully,
      Canceled);
   function Get_AIO_Status (AD : AIO_Descriptor) return AIO_Status;
   function Get_AIO_Error_Code (AD : AIO_Descriptor) return POSIX.Error_Code;
   function Get_Bytes_Transferred (AD : AIO_Descriptor) return POSIX.IO_Count;

   type Cancelation_Status is
     (Canceled,
      Not_Canceled,
      All_Done);
   function Cancel (AD : AIO_Descriptor) return Cancelation_Status;
   function Cancel (File : POSIX.IO.File_Descriptor) return Cancelation_Status;

   procedure Await_IO_Or_Timeout
     (AD             : AIO_Descriptor;
      Timeout        : POSIX.Timespec;
      Masked_Signals : POSIX.Signal_Masking := POSIX.RTS_Signals);
   procedure Await_IO
     (AD             : AIO_Descriptor;
      Masked_Signals : POSIX.Signal_Masking := POSIX.RTS_Signals);
   procedure Await_IO_Or_Timeout
     (List           : AIO_Descriptor_List;
      Timeout        : POSIX.Timespec;
      Masked_Signals : POSIX.Signal_Masking := POSIX.RTS_Signals);
   procedure Await_IO
     (List           : AIO_Descriptor_List;
      Masked_Signals : POSIX.Signal_Masking := POSIX.RTS_Signals);
   procedure Synchronize_File (AD : AIO_Descriptor);
   procedure Synchronize_Data (AD : AIO_Descriptor);

private

   --  The following wrapper is needed around the C struct aiocb
   --  in order to preserve the Ada "fat" pointer (including constraint info)
   --  that we need in order to be able to recover the range constraint of the
   --  Stream_Element_Array object referenced by the aiocb.
   --  Our code is going to rely on the component C being allocated in first
   --  position.  There will be code in the package body to verify this
   --  assumption.

   type Aiocb_Wrapper is record
      C : aliased POSIX.C.struct_aiocb;
      P : IO_Array_Pointer;
   end record;
   type AIO_Descriptor is access Aiocb_Wrapper;

end POSIX.Asynchronous_IO;