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 | --
-- Copyright (C) 2018-2023, AdaCore
--
-- SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
--
with Ada.Streams;
with Glib.Main;
with Spawn.Windows_API;
pragma Warnings (Off);
with System.Win32;
pragma Warnings (On);
with Spawn.Common;
private package Spawn.Internal is
package Environments is
function To_Key (Text : UTF_8_String) return Wide_String;
function "=" (Left, Right : UTF_8_String) return Boolean;
function "<" (Left, Right : UTF_8_String) return Boolean;
end Environments;
type Process is tagged;
Buffer_Size : constant Ada.Streams.Stream_Element_Count := 512;
subtype Stream_Element_Buffer is
Ada.Streams.Stream_Element_Array (1 .. Buffer_Size);
subtype Pipe_Kinds is Spawn.Common.Pipe_Kinds;
type Context is record
lpOverlapped : Windows_API.OVERLAPPED;
Process : access Spawn.Internal.Process'Class;
Kind : Pipe_Kinds;
Handle : Windows_API.HANDLE := System.Win32.INVALID_HANDLE_VALUE;
Waiting_IO : Boolean := False;
-- ReadFileEx/WriteFileEx overlapped operation in progress
Close_IO : Boolean := False;
-- User closed the pipe while overlapped operation in progress
Buffer : Stream_Element_Buffer;
Last : Ada.Streams.Stream_Element_Count := 0 with Atomic;
-- Last could be > Buffer'Last for Stdin that means 'send notification'
end record;
type Pipe_Array is array (Pipe_Kinds) of aliased Context;
-- Context for each pipe kind
type Process_Reference is record
Self : access Process'Class;
end record;
-- A wrapper to pass process pointer to C binding functions
type Process is new Spawn.Common.Process with record
Reference : aliased Process_Reference;
Event : Glib.Main.G_Source_Id := 0;
pid : aliased Windows_API.PROCESS_INFORMATION;
pipe : Pipe_Array;
end record;
-- Process implementation type provides the same interface as
-- Spawn.Processes.Process type.
overriding procedure Finalize (Self : in out Process);
procedure Start (Self : in out Process'Class);
-- See documentation in Spawn.Processes.
procedure Terminate_Process (Self : in out Process'Class);
-- See documentation in Spawn.Processes.
procedure Kill_Process (Self : in out Process'Class);
-- See documentation in Spawn.Processes.
function Identifier (Self : Process'Class) return String;
-- See documentation in Spawn.Processes.
procedure Close_Standard_Input (Self : in out Process'Class);
-- See documentation in Spawn.Processes.
procedure Write_Standard_Input
(Self : in out Process'Class;
Data : Ada.Streams.Stream_Element_Array;
Last : out Ada.Streams.Stream_Element_Offset;
Success : in out Boolean);
-- See documentation in Spawn.Processes.
procedure Close_Standard_Output (Self : in out Process'Class);
-- See documentation in Spawn.Processes.
procedure Read_Standard_Output
(Self : in out Process'Class;
Data : out Ada.Streams.Stream_Element_Array;
Last : out Ada.Streams.Stream_Element_Offset;
Success : in out Boolean);
-- See documentation in Spawn.Processes.
procedure Close_Standard_Error (Self : in out Process'Class);
-- See documentation in Spawn.Processes.
procedure Read_Standard_Error
(Self : in out Process'Class;
Data : out Ada.Streams.Stream_Element_Array;
Last : out Ada.Streams.Stream_Element_Offset;
Success : in out Boolean);
-- See documentation in Spawn.Processes.
end Spawn.Internal;
|