@@ -5,11 +5,20 @@ defmodule Mix.Tasks.Deps.Parallel do
5
5
## Server
6
6
7
7
def server ( deps , count , force? ) do
8
+ { :ok , socket } = :gen_tcp . listen ( 0 , [ :binary , packet: :line , active: true , reuseaddr: true ] )
9
+
10
+ try do
11
+ server ( socket , deps , count , force? )
12
+ after
13
+ :gen_tcp . close ( socket )
14
+ end
15
+ end
16
+
17
+ defp server ( socket , deps , count , force? ) do
8
18
elixir =
9
19
System . find_executable ( "elixir" ) ||
10
20
raise "cannot find elixir executable for parallel compilation"
11
21
12
- { :ok , socket } = :gen_tcp . listen ( 0 , [ :binary , packet: :line , active: true , reuseaddr: true ] )
13
22
{ :ok , { ip , port } } = :inet . sockname ( socket )
14
23
ansi_flag = if IO.ANSI . enabled? ( ) , do: ~c" --color" , else: ~c" --no-color"
15
24
force_flag = if force? , do: ~c" --force" , else: ~c" --no-force"
@@ -53,7 +62,7 @@ defmodule Mix.Tasks.Deps.Parallel do
53
62
could not start parallel dependency compiler, no connection made to TCP port: #{ inspect ( error ) }
54
63
55
64
The spawned operating system process wrote the following output:
56
- #{ collect_data ( port , "" ) }
65
+ #{ close_port ( port , "" ) }
57
66
"""
58
67
end
59
68
end )
@@ -105,11 +114,14 @@ defmodule Mix.Tasks.Deps.Parallel do
105
114
106
115
{ :tcp_closed , socket } ->
107
116
shutdown_clients ( available ++ busy )
108
- raise "socket #{ inspect ( socket ) } closed unexpectedly"
117
+ Mix . shell ( ) . error ( "ERROR! mix deps.parallel #{ inspect ( socket ) } closed unexpectedly")
109
118
110
119
{ :tcp_error , socket , error } ->
111
120
shutdown_clients ( available ++ busy )
112
- raise "socket #{ inspect ( socket ) } errored: #{ inspect ( error ) } "
121
+
122
+ Mix . shell ( ) . error (
123
+ "ERROR! mix deps.parallel #{ inspect ( socket ) } errored: #{ inspect ( error ) } "
124
+ )
113
125
114
126
{ port , { :data , { eol , data } } } ->
115
127
with % { index: index } <-
@@ -136,16 +148,18 @@ defmodule Mix.Tasks.Deps.Parallel do
136
148
end
137
149
138
150
_ = :gen_tcp . close ( socket )
139
- IO . write ( collect_data ( port , "#{ index } > " ) )
151
+ IO . write ( close_port ( port , "#{ index } > " ) )
140
152
end )
141
153
end
142
154
143
- defp collect_data ( port , prefix ) do
155
+ defp close_port ( port , prefix ) do
144
156
receive do
145
- { ^ port , { :data , { :eol , data } } } -> [ prefix , data , ?\n | collect_data ( port , prefix ) ]
146
- { ^ port , { :data , { :noeol , data } } } -> [ data | collect_data ( port , prefix ) ]
157
+ { ^ port , { :data , { :eol , data } } } -> [ prefix , data , ?\n | close_port ( port , prefix ) ]
158
+ { ^ port , { :data , { :noeol , data } } } -> [ data | close_port ( port , prefix ) ]
147
159
after
148
- 0 -> [ ]
160
+ 0 ->
161
+ Port . close ( port )
162
+ [ ]
149
163
end
150
164
end
151
165
0 commit comments