Skip to content

Commit 00ac3e5

Browse files
committed
added fallback
1 parent 8cfce3c commit 00ac3e5

File tree

3 files changed

+271
-242
lines changed

3 files changed

+271
-242
lines changed
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
/*
2+
* Copyright (c) 2013 Functional Streams for Scala
3+
*
4+
* Permission is hereby granted, free of charge, to any person obtaining a copy of
5+
* this software and associated documentation files (the "Software"), to deal in
6+
* the Software without restriction, including without limitation the rights to
7+
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
8+
* the Software, and to permit persons to whom the Software is furnished to do so,
9+
* subject to the following conditions:
10+
*
11+
* The above copyright notice and this permission notice shall be included in all
12+
* copies or substantial portions of the Software.
13+
*
14+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
16+
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
17+
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
18+
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
19+
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20+
*/
21+
22+
package fs2
23+
package io
24+
package process
25+
26+
import cats.effect.kernel.Async
27+
import cats.effect.kernel.Resource
28+
import cats.syntax.all.*
29+
import fs2.io.CollectionCompat.*
30+
31+
import java.lang
32+
33+
private[process] trait Processesjvmnative {
34+
def forAsync[F[_]](implicit F: Async[F]): Processes[F] = new UnsealedProcesses[F] {
35+
36+
def spawn(process: ProcessBuilder): Resource[F, Process[F]] =
37+
Resource
38+
.make {
39+
F.blocking {
40+
val builder = new lang.ProcessBuilder((process.command :: process.args).asJava)
41+
42+
process.workingDirectory.foreach { path =>
43+
builder.directory(path.toNioPath.toFile)
44+
}
45+
46+
val env = builder.environment()
47+
if (!process.inheritEnv) env.clear()
48+
process.extraEnv.foreach { case (k, v) =>
49+
env.put(k, v)
50+
}
51+
52+
builder.start()
53+
}
54+
} { process =>
55+
F.delay(process.isAlive())
56+
.ifM(
57+
evalOnVirtualThreadIfAvailable(
58+
F.blocking {
59+
process.destroy()
60+
process.waitFor()
61+
()
62+
}
63+
),
64+
F.unit
65+
)
66+
}
67+
.map { process =>
68+
new UnsealedProcess[F] {
69+
def isAlive = F.delay(process.isAlive())
70+
71+
def exitValue = isAlive.ifM(
72+
evalOnVirtualThreadIfAvailable(F.interruptible(process.waitFor())),
73+
F.delay(process.exitValue())
74+
)
75+
76+
def stdin = writeOutputStreamCancelable(
77+
F.delay(process.getOutputStream()),
78+
F.blocking(process.destroy())
79+
)
80+
81+
def stdout = readInputStreamCancelable(
82+
F.delay(process.getInputStream()),
83+
F.blocking(process.destroy()),
84+
8192
85+
)
86+
87+
def stderr = readInputStreamCancelable(
88+
F.delay(process.getErrorStream()),
89+
F.blocking(process.destroy()),
90+
8192
91+
)
92+
93+
}
94+
}
95+
}
96+
}

io/jvm/src/main/scala/fs2/io/process/ProcessesPlatform.scala

Lines changed: 1 addition & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -23,74 +23,4 @@ package fs2
2323
package io
2424
package process
2525

26-
import cats.effect.kernel.Async
27-
import cats.effect.kernel.Resource
28-
import cats.syntax.all.*
29-
import fs2.io.CollectionCompat.*
30-
31-
import java.lang
32-
33-
private[process] trait ProcessesCompanionPlatform {
34-
def forAsync[F[_]](implicit F: Async[F]): Processes[F] = new UnsealedProcesses[F] {
35-
36-
def spawn(process: ProcessBuilder): Resource[F, Process[F]] =
37-
Resource
38-
.make {
39-
F.blocking {
40-
val builder = new lang.ProcessBuilder((process.command :: process.args).asJava)
41-
42-
process.workingDirectory.foreach { path =>
43-
builder.directory(path.toNioPath.toFile)
44-
}
45-
46-
val env = builder.environment()
47-
if (!process.inheritEnv) env.clear()
48-
process.extraEnv.foreach { case (k, v) =>
49-
env.put(k, v)
50-
}
51-
52-
builder.start()
53-
}
54-
} { process =>
55-
F.delay(process.isAlive())
56-
.ifM(
57-
evalOnVirtualThreadIfAvailable(
58-
F.blocking {
59-
process.destroy()
60-
process.waitFor()
61-
()
62-
}
63-
),
64-
F.unit
65-
)
66-
}
67-
.map { process =>
68-
new UnsealedProcess[F] {
69-
def isAlive = F.delay(process.isAlive())
70-
71-
def exitValue = isAlive.ifM(
72-
evalOnVirtualThreadIfAvailable(F.interruptible(process.waitFor())),
73-
F.delay(process.exitValue())
74-
)
75-
76-
def stdin = writeOutputStreamCancelable(
77-
F.delay(process.getOutputStream()),
78-
F.blocking(process.destroy())
79-
)
80-
81-
def stdout = readInputStreamCancelable(
82-
F.delay(process.getInputStream()),
83-
F.blocking(process.destroy()),
84-
8192
85-
)
86-
87-
def stderr = readInputStreamCancelable(
88-
F.delay(process.getErrorStream()),
89-
F.blocking(process.destroy()),
90-
8192
91-
)
92-
93-
}
94-
}
95-
}
96-
}
26+
private[process] trait ProcessesCompanionPlatform extends Processesjvmnative

0 commit comments

Comments
 (0)