Skip to content

Commit a80a69e

Browse files
committed
Update implementation to new API for POSIX.
Don't emit Error_Occured on sych IO errors.
1 parent a2c2037 commit a80a69e

File tree

4 files changed

+59
-42
lines changed

4 files changed

+59
-42
lines changed

source/spawn/spawn-channels__posix.adb

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
--
2-
-- Copyright (C) 2018-2022, AdaCore
2+
-- Copyright (C) 2018-2023, AdaCore
33
--
44
-- SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
55
--
@@ -255,10 +255,11 @@ package body Spawn.Channels is
255255
----------
256256

257257
procedure Read
258-
(Self : in out Channels;
259-
Kind : Spawn.Common.Pipe_Kinds;
260-
Data : out Ada.Streams.Stream_Element_Array;
261-
Last : out Ada.Streams.Stream_Element_Offset)
258+
(Self : in out Channels;
259+
Kind : Spawn.Common.Pipe_Kinds;
260+
Data : out Ada.Streams.Stream_Element_Array;
261+
Last : out Ada.Streams.Stream_Element_Offset;
262+
Success : in out Boolean)
262263
is
263264
use type Ada.Streams.Stream_Element_Offset;
264265
use type Interfaces.C.size_t;
@@ -267,13 +268,15 @@ package body Spawn.Channels is
267268
Posix.read (Self.Parent (Kind), Data, Data'Length);
268269

269270
Error : constant Interfaces.C.int := Errno;
271+
270272
begin
271273
Last := Data'First - 1;
272274

273275
if Count /= Interfaces.C.size_t'Last then
274276
Last := Data'First + Ada.Streams.Stream_Element_Offset (Count) - 1;
277+
275278
elsif Error not in Posix.EAGAIN | Posix.EINTR then
276-
Self.Process.Emit_Error_Occurred (Integer (Error));
279+
Success := False;
277280
end if;
278281
end Read;
279282

@@ -535,10 +538,15 @@ package body Spawn.Channels is
535538
Listener => Self'Unchecked_Access);
536539
end Start_Watch;
537540

541+
-----------------
542+
-- Write_Stdin --
543+
-----------------
544+
538545
procedure Write_Stdin
539-
(Self : in out Channels;
540-
Data : Ada.Streams.Stream_Element_Array;
541-
Last : out Ada.Streams.Stream_Element_Offset)
546+
(Self : in out Channels;
547+
Data : Ada.Streams.Stream_Element_Array;
548+
Last : out Ada.Streams.Stream_Element_Offset;
549+
Success : in out Boolean)
542550
is
543551
use type Ada.Streams.Stream_Element_Offset;
544552
use type Interfaces.C.size_t;
@@ -552,8 +560,9 @@ package body Spawn.Channels is
552560

553561
if Count /= Interfaces.C.size_t'Last then
554562
Last := Data'First + Ada.Streams.Stream_Element_Offset (Count) - 1;
563+
555564
elsif Error not in Posix.EAGAIN | Posix.EINTR then
556-
Self.Process.Emit_Error_Occurred (Integer (Error));
565+
Success := False;
557566
end if;
558567
end Write_Stdin;
559568
end Spawn.Channels;

source/spawn/spawn-channels__posix.ads

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
--
2-
-- Copyright (C) 2018-2022, AdaCore
2+
-- Copyright (C) 2018-2023, AdaCore
33
--
44
-- SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
55
--
@@ -45,15 +45,17 @@ package Spawn.Channels is
4545
Poll : Spawn.Polls.Poll_Access);
4646

4747
procedure Write_Stdin
48-
(Self : in out Channels;
49-
Data : Ada.Streams.Stream_Element_Array;
50-
Last : out Ada.Streams.Stream_Element_Offset);
48+
(Self : in out Channels;
49+
Data : Ada.Streams.Stream_Element_Array;
50+
Last : out Ada.Streams.Stream_Element_Offset;
51+
Success : in out Boolean);
5152

5253
procedure Read
53-
(Self : in out Channels;
54-
Kind : Spawn.Common.Pipe_Kinds;
55-
Data : out Ada.Streams.Stream_Element_Array;
56-
Last : out Ada.Streams.Stream_Element_Offset);
54+
(Self : in out Channels;
55+
Kind : Spawn.Common.Pipe_Kinds;
56+
Data : out Ada.Streams.Stream_Element_Array;
57+
Last : out Ada.Streams.Stream_Element_Offset;
58+
Success : in out Boolean);
5759

5860
function Is_Active (Self : Channels) return Boolean;
5961

source/spawn/spawn-internal__posix.adb

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -111,9 +111,10 @@ package body Spawn.Internal is
111111
-------------------------
112112

113113
procedure Read_Standard_Error
114-
(Self : in out Process'Class;
115-
Data : out Ada.Streams.Stream_Element_Array;
116-
Last : out Ada.Streams.Stream_Element_Offset)
114+
(Self : in out Process'Class;
115+
Data : out Ada.Streams.Stream_Element_Array;
116+
Last : out Ada.Streams.Stream_Element_Offset;
117+
Success : in out Boolean)
117118
is
118119
use type Ada.Streams.Stream_Element_Offset;
119120

@@ -123,9 +124,9 @@ package body Spawn.Internal is
123124
return;
124125
end if;
125126

126-
Spawn.Channels.Read (Self.Channels, Stderr, Data, Last);
127+
Spawn.Channels.Read (Self.Channels, Stderr, Data, Last, Success);
127128

128-
if Last = Data'First - 1 then
129+
if Success and Last = Data'First - 1 then
129130
Monitor.Enqueue
130131
((Monitor.Watch_Pipe, Self'Unchecked_Access, Stderr));
131132
end if;
@@ -136,9 +137,10 @@ package body Spawn.Internal is
136137
--------------------------
137138

138139
procedure Read_Standard_Output
139-
(Self : in out Process'Class;
140-
Data : out Ada.Streams.Stream_Element_Array;
141-
Last : out Ada.Streams.Stream_Element_Offset)
140+
(Self : in out Process'Class;
141+
Data : out Ada.Streams.Stream_Element_Array;
142+
Last : out Ada.Streams.Stream_Element_Offset;
143+
Success : in out Boolean)
142144
is
143145
use type Ada.Streams.Stream_Element_Offset;
144146

@@ -148,9 +150,9 @@ package body Spawn.Internal is
148150
return;
149151
end if;
150152

151-
Spawn.Channels.Read (Self.Channels, Stdout, Data, Last);
153+
Spawn.Channels.Read (Self.Channels, Stdout, Data, Last, Success);
152154

153-
if Last = Data'First - 1 then
155+
if Success and Last = Data'First - 1 then
154156
Monitor.Enqueue
155157
((Monitor.Watch_Pipe, Self'Unchecked_Access, Stdout));
156158
end if;
@@ -186,9 +188,10 @@ package body Spawn.Internal is
186188
--------------------------
187189

188190
procedure Write_Standard_Input
189-
(Self : in out Process'Class;
190-
Data : Ada.Streams.Stream_Element_Array;
191-
Last : out Ada.Streams.Stream_Element_Offset)
191+
(Self : in out Process'Class;
192+
Data : Ada.Streams.Stream_Element_Array;
193+
Last : out Ada.Streams.Stream_Element_Offset;
194+
Success : in out Boolean)
192195
is
193196
use type Ada.Streams.Stream_Element_Offset;
194197

@@ -198,9 +201,9 @@ package body Spawn.Internal is
198201
return;
199202
end if;
200203

201-
Spawn.Channels.Write_Stdin (Self.Channels, Data, Last);
204+
Spawn.Channels.Write_Stdin (Self.Channels, Data, Last, Success);
202205

203-
if Last /= Data'Length then
206+
if Success and Last /= Data'Length then
204207
Monitor.Enqueue ((Monitor.Watch_Pipe, Self'Unchecked_Access, Stdin));
205208
end if;
206209
end Write_Standard_Input;

source/spawn/spawn-internal__posix.ads

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -49,27 +49,30 @@ private package Spawn.Internal is
4949
-- See documentation in Spawn.Processes.
5050

5151
procedure Write_Standard_Input
52-
(Self : in out Process'Class;
53-
Data : Ada.Streams.Stream_Element_Array;
54-
Last : out Ada.Streams.Stream_Element_Offset);
52+
(Self : in out Process'Class;
53+
Data : Ada.Streams.Stream_Element_Array;
54+
Last : out Ada.Streams.Stream_Element_Offset;
55+
Success : in out Boolean);
5556
-- See documentation in Spawn.Processes.
5657

5758
procedure Close_Standard_Output (Self : in out Process'Class);
5859
-- See documentation in Spawn.Processes.
5960

6061
procedure Read_Standard_Output
61-
(Self : in out Process'Class;
62-
Data : out Ada.Streams.Stream_Element_Array;
63-
Last : out Ada.Streams.Stream_Element_Offset);
62+
(Self : in out Process'Class;
63+
Data : out Ada.Streams.Stream_Element_Array;
64+
Last : out Ada.Streams.Stream_Element_Offset;
65+
Success : in out Boolean);
6466
-- See documentation in Spawn.Processes.
6567

6668
procedure Close_Standard_Error (Self : in out Process'Class);
6769
-- See documentation in Spawn.Processes.
6870

6971
procedure Read_Standard_Error
70-
(Self : in out Process'Class;
71-
Data : out Ada.Streams.Stream_Element_Array;
72-
Last : out Ada.Streams.Stream_Element_Offset);
72+
(Self : in out Process'Class;
73+
Data : out Ada.Streams.Stream_Element_Array;
74+
Last : out Ada.Streams.Stream_Element_Offset;
75+
Success : in out Boolean);
7376
-- See documentation in Spawn.Processes.
7477

7578
private

0 commit comments

Comments
 (0)