Description
Provides positional file I/O with lane-specific blocking behavior.
Example:
File := Flyology.IO.Files.Open ("state.bin");
Cancellation_Token
subtype Cancellation_Token is Flyology.Cancellation.Token;
Shared one-shot token. The token must outlive every operation using it.
Close
procedure Close (File : in out File_Descriptor)
Close File and set it to Invalid_File. Closing Invalid_File is harmless.
Parameters
- File
Descriptor whose ownership is released
Raised exceptions
- Device_Error
close(2) reports an error; File is invalidated
File_Descriptor
type File_Descriptor is private;
Owned operating-system file handle. This type is not controlled: the owning task must call Close. Concurrent operations require external synchronization, especially if Close may run at the same time.
File_Offset
type File_Offset is range 0 .. Interfaces.C.long_long'Last;
Nonnegative byte position used by positional reads and writes.
File_Operation
type File_Operation is abstract new Flyology.Operations.Operation with private;
Common limited base for completion-driven positional file operations. Concrete operations either borrow an aliased array or own a moved unique-buffer token until Finish consumes the terminal result. Scoped file operations currently require a lightweight owner; the existing synchronous overloads remain available in both lanes.
Finish
procedure Finish (Operation : in out Read_Operation; Last : out Ada.Streams.Stream_Element_Offset)
Consume a terminal positional read and publish its Last value.
Parameters
- Operation
Terminal read operation
- Last
Last element read, or Item'First - 1 at end of file
Raised exceptions
- Device_Error
Submission or completion failed
- Operation_Cancelled
Cancellation reached terminal state
- Timeout_Error
Deadline cancellation reached terminal state
Finish
procedure Finish
(Operation : in out Read_Operation; Item : in out Flyology.Buffers.Unique_Buffer; Read : out Natural)
Consume an owning positional read, move its buffer into vacant Item, and publish the new readable length. The move also occurs before a retained provider exception is raised.
Parameters
- Operation
Terminal owning read operation
- Item
Vacant buffer handle from the same pool
- Read
Number of bytes read; zero at end of file
Raised exceptions
- Program_Error
Item is occupied, belongs to another pool, or Operation does not own a buffer
Finish
procedure Finish (Operation : in out Write_Operation; Last : out Ada.Streams.Stream_Element_Offset)
Consume a terminal positional write and publish its Last value.
Parameters
- Operation
Terminal write operation
- Last
Last element written, or Item'First - 1 when none
Raised exceptions
- Device_Error
Submission or completion failed
- Operation_Cancelled
Cancellation reached terminal state
- Timeout_Error
Deadline cancellation reached terminal state
Finish
procedure Finish
(Operation : in out Write_Operation; Item : in out Flyology.Buffers.Unique_Buffer; Written : out Natural)
Consume an owning positional write, move its buffer into vacant Item, and publish the transferred byte count. The move also occurs before a retained provider exception is raised.
Parameters
- Operation
Terminal owning write operation
- Item
Vacant buffer handle from the same pool
- Written
Number of bytes written on normal return
Raised exceptions
- Program_Error
Item is occupied, belongs to another pool, or Operation does not own a buffer
Invalid_File
Invalid_File : constant File_Descriptor;
Sentinel denoting no open file.
Open
function Open
(Path : String; Mode : Open_Mode := Read_Only; Create : Boolean := False; Truncate : Boolean := False)
return File_Descriptor
Open Path directly on the calling lane. Create adds the platform create flag and Truncate truncates an existing file. Truncate is invalid with Read_Only. Open and Close are metadata syscalls and may block either lane's underlying thread.
Parameters
- Path
Filesystem path
- Mode
Requested access mode
- Create
Create the file when it does not exist
- Truncate
Truncate the file before returning
Return value
Newly owned file descriptor; the caller must Close it
Raised exceptions
- Device_Error
The mode combination is invalid or open(2) fails
Open_Mode
type Open_Mode is (Read_Only, Write_Only, Read_Write);
Access requested from Open.
Enumeration literals
- Read_Only
Permit reads only
- Write_Only
Permit writes only
- Read_Write
Permit both reads and writes
Operation_Cancelled
Operation_Cancelled : exception renames Flyology.Cancellation.Operation_Cancelled;
Raised only after a cancellation request reaches a terminal state and the caller may safely reuse its I/O buffer.
Read_At
function Read_At
(Set : not null access Flyology.Operations.Completion_Set'Class;
File : File_Descriptor;
Offset : File_Offset;
Item : in out Flyology.Buffers.Unique_Buffer;
Timeout : Duration := Flyology.IO.Infinite) return Read_Operation
Start one positional read after moving Item into the operation. Item is vacant on return. Typed Finish moves the buffer back only after the kernel has relinquished it; abandoning the operation drains and releases the owned buffer to its pool. Item's pool must outlive the operation.
Parameters
- Set
Completion set that owns the operation slot
- File
Open descriptor permitting reads
- Offset
Starting byte position
- Item
Acquired destination buffer whose ownership transfers
- Timeout
Relative operation deadline
Return value
Started limited owning read operation
Read_At
function Read_At
(Set : not null access Flyology.Operations.Completion_Set'Class;
File : File_Descriptor;
Offset : File_Offset;
Item : not null access Ada.Streams.Stream_Element_Array;
Timeout : Duration := Flyology.IO.Infinite) return Read_Operation
Start one completion-driven positional read without parking the owner. Set, File, and Item must outlive the returned operation. Item is exclusively borrowed until Finish or finalization drains cancellation.
Parameters
- Set
Completion set that owns the operation slot
- File
Open descriptor permitting reads
- Offset
Starting byte position
- Item
Aliased destination buffer
- Timeout
Relative operation deadline; zero makes one immediate completion attempt and negative means none
Return value
Started limited read operation
Read_At
procedure Read_At
(File : File_Descriptor;
Offset : File_Offset;
Item : out Ada.Streams.Stream_Element_Array;
Last : out Ada.Streams.Stream_Element_Offset;
Token : access Cancellation_Token := null)
Read at Offset without changing the descriptor's file position. A lightweight task suspends until kernel completion; a native task blocks its thread in pread. A requested token is observed before native pread starts, but cannot interrupt a native syscall already in progress. A lightweight cancellation stays suspended until the kernel relinquishes Item, so Operation_Cancelled is a terminal buffer-ownership handoff. This is a potentially blocking operation and must not be called inside a protected action: a lightweight caller there raises Program_Error before Item is submitted, and native tasks keep stock behavior.
Parameters
- File
Open descriptor permitting reads
- Offset
Starting byte position
- Item
Destination buffer
- Last
Last element written, or Item'First - 1 at end of file
- Token
Optional one-shot cancellation token
Raised exceptions
- Device_Error
Submission, completion, or pread reports failure
- Operation_Cancelled
Token cancellation reaches a terminal state
- Program_Error
Lightweight caller is inside a protected action
Read_At
procedure Read_At
(File : File_Descriptor;
Offset : File_Offset;
Item : out Ada.Streams.Stream_Element_Array;
Last : out Ada.Streams.Stream_Element_Offset;
Timeout : Duration;
Token : access Cancellation_Token := null)
Read positionally within one relative deadline. A lightweight timeout requests kernel cancellation and does not return until the kernel has relinquished Item. A native pread cannot be interrupted after entry, so timeout delivery may be delayed until that syscall returns. Negative Timeout waits without a deadline. Zero is one immediate attempt whose result wins, matching Flyology.IO.Wait and Flyology.Buffers.Acquire_For: a positional read has no readiness wait, so the attempt runs and returns transferred bytes, end of file, or a failure rather than Timeout_Error. Zero still bounds only readiness, not device latency, so a page-cache miss may occupy the caller for the duration of the disk read.
Parameters
- File
Open descriptor permitting reads
- Offset
Starting byte position
- Item
Destination buffer
- Last
Last element written, or Item'First - 1 at end of file
- Timeout
Maximum monotonic wait in seconds
- Token
Optional one-shot cancellation token
Raised exceptions
- Device_Error
Submission, completion, or pread reports failure
- Operation_Cancelled
Token cancellation reaches a terminal state
- Timeout_Error
Deadline cancellation reaches a terminal state; never raised for a zero or negative Timeout
- Program_Error
Lightweight caller is inside a protected action
Read_At
procedure Read_At
(File : File_Descriptor;
Offset : File_Offset;
Item : in out Flyology.Buffers.Unique_Buffer;
Timeout : Duration := Flyology.IO.Infinite;
Operation : in out Read_Operation)
Start or restart one owning positional read.
Parameters
- File
Open descriptor permitting reads
- Offset
Starting byte position
- Item
Acquired destination buffer whose ownership transfers
- Timeout
Relative operation deadline
- Operation
Fresh, released, or consumed read operation
Read_At
procedure Read_At
(File : File_Descriptor;
Offset : File_Offset;
Item : in out Flyology.Buffers.Unique_Buffer;
Read : out Natural;
Token : access Cancellation_Token := null)
Read directly into an acquired unique buffer and replace its readable length. Kernel ownership and cancellation semantics match the array overload.
Parameters
- File
Open descriptor permitting reads
- Offset
Starting byte position
- Item
Acquired destination buffer
- Read
Number of bytes read; zero at end of file
- Token
Optional one-shot cancellation token
Raised exceptions
- Device_Error
Submission, completion, or pread reports failure
- Operation_Cancelled
Cancellation reaches a terminal state
- Program_Error
Lightweight caller is inside a protected action
Read_At
procedure Read_At
(File : File_Descriptor;
Offset : File_Offset;
Item : in out Flyology.Buffers.Unique_Buffer;
Read : out Natural;
Timeout : Duration;
Token : access Cancellation_Token := null)
Read positionally into a unique buffer within one relative deadline. Timeout, cancellation, and terminal buffer ownership match the array overload, including the zero-Timeout immediate attempt.
Parameters
- File
Open descriptor permitting reads
- Offset
Starting byte position
- Item
Acquired destination buffer
- Read
Number of bytes read; zero at end of file
- Timeout
Maximum monotonic wait in seconds
- Token
Optional one-shot cancellation token
Raised exceptions
- Device_Error
Submission, completion, or pread reports failure
- Operation_Cancelled
Token cancellation reaches a terminal state
- Timeout_Error
Deadline cancellation reaches a terminal state; never raised for a zero or negative Timeout
- Program_Error
Lightweight caller is inside a protected action
Read_At
procedure Read_At
(File : File_Descriptor;
Offset : File_Offset;
Item : not null access Ada.Streams.Stream_Element_Array;
Timeout : Duration := Flyology.IO.Infinite;
Operation : in out Read_Operation)
Start or restart a positional read in an established operation object.
Parameters
- File
Open descriptor permitting reads
- Offset
Starting byte position
- Item
Aliased destination buffer
- Timeout
Relative operation deadline
- Operation
Fresh, released, or consumed read operation
Read_Operation
type Read_Operation is new File_Operation with private;
Scoped completion-driven positional read.
Timeout_Error
Timeout_Error : exception renames Flyology.IO.Timeout_Error;
Raised after a timed file operation's abort has reached a terminal state and the caller may safely reuse its buffer.
Write_At
function Write_At
(Set : not null access Flyology.Operations.Completion_Set'Class;
File : File_Descriptor;
Offset : File_Offset;
Item : in out Flyology.Buffers.Unique_Buffer;
Timeout : Duration := Flyology.IO.Infinite) return Write_Operation
Start one positional write after moving Item into the operation. The readable payload length bounds the write.
Parameters
- Set
Completion set that owns the operation slot
- File
Open descriptor permitting writes
- Offset
Starting byte position
- Item
Acquired source buffer whose ownership transfers
- Timeout
Relative operation deadline
Return value
Started limited owning write operation
Write_At
function Write_At
(Set : not null access Flyology.Operations.Completion_Set'Class;
File : File_Descriptor;
Offset : File_Offset;
Item : not null access constant Ada.Streams.Stream_Element_Array;
Timeout : Duration := Flyology.IO.Infinite) return Write_Operation
Start one completion-driven positional write without parking the owner. A terminal cancellation does not roll back bytes already written. Set, File, and Item must outlive the returned operation, and Item must not be changed until Finish or finalization drains cancellation.
Parameters
- Set
Completion set that owns the operation slot
- File
Open descriptor permitting writes
- Offset
Starting byte position
- Item
Aliased source buffer
- Timeout
Relative operation deadline; zero makes one immediate completion attempt and negative means none
Return value
Started limited write operation
Write_At
procedure Write_At
(File : File_Descriptor;
Offset : File_Offset;
Item : Ada.Streams.Stream_Element_Array;
Last : out Ada.Streams.Stream_Element_Offset;
Token : access Cancellation_Token := null)
Write at Offset without changing the descriptor's file position. A single call may transfer fewer than Item'Length elements. Lightweight tasks suspend for kernel completion; native tasks block in pwrite. Token and buffer-lifetime semantics match Read_At. Cancellation does not roll back bytes already written. When Operation_Cancelled is raised, Last has no defined application meaning and a blind retry may duplicate or overwrite data; callers needing retry safety must provide an idempotent protocol or track committed offsets independently. Like Read_At, this must not be called inside a protected action; a lightweight caller there raises Program_Error before Item is submitted.
Parameters
- File
Open descriptor permitting writes
- Offset
Starting byte position
- Item
Source buffer
- Last
Last element written, or Item'First - 1 if none, meaningful only on normal return
- Token
Optional one-shot cancellation token
Raised exceptions
- Device_Error
Submission, completion, or pwrite reports failure
- Operation_Cancelled
Token cancellation reaches a terminal state
- Program_Error
Lightweight caller is inside a protected action
Write_At
procedure Write_At
(File : File_Descriptor;
Offset : File_Offset;
Item : in out Flyology.Buffers.Unique_Buffer;
Timeout : Duration := Flyology.IO.Infinite;
Operation : in out Write_Operation)
Start or restart one owning positional write.
Parameters
- File
Open descriptor permitting writes
- Offset
Starting byte position
- Item
Acquired source buffer whose ownership transfers
- Timeout
Relative operation deadline
- Operation
Fresh, released, or consumed write operation
Write_At
procedure Write_At
(File : File_Descriptor;
Offset : File_Offset;
Item : Flyology.Buffers.Unique_Buffer;
Written : out Natural;
Token : access Cancellation_Token := null)
Write directly from a unique buffer's readable payload. Item remains owned until the synchronous call returns.
Parameters
- File
Open descriptor permitting writes
- Offset
Starting byte position
- Item
Acquired source buffer
- Written
Number of bytes written on normal return
- Token
Optional one-shot cancellation token
Raised exceptions
- Device_Error
Submission, completion, or pwrite reports failure
- Operation_Cancelled
Cancellation reaches a terminal state
- Program_Error
Lightweight caller is inside a protected action
Write_At
procedure Write_At
(File : File_Descriptor;
Offset : File_Offset;
Item : not null access constant Ada.Streams.Stream_Element_Array;
Timeout : Duration := Flyology.IO.Infinite;
Operation : in out Write_Operation)
Start or restart a positional write in an established operation object.
Parameters
- File
Open descriptor permitting writes
- Offset
Starting byte position
- Item
Aliased source buffer
- Timeout
Relative operation deadline
- Operation
Fresh, released, or consumed write operation
Write_Operation
type Write_Operation is new File_Operation with private;
Scoped completion-driven positional write.