Skip to content

Commit c8c3835

Browse files
author
Michał Wiącek
committed
Try get rid of CompletableFuture start using TaskApp
preliminary changes to get rid of CompletableFuture from Cli and use Deffered isntead and start using TaskApp instead of App One compile test is failing, not sure if end conditions are ok. It would be good to add some tests
1 parent c6c2fca commit c8c3835

File tree

11 files changed

+870
-162
lines changed

11 files changed

+870
-162
lines changed
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package bloop.task
2+
3+
import cats.effect.Concurrent
4+
import cats.effect.concurrent.{Deferred, Ref}
5+
import monix.eval.{Task => MonixTask}
6+
import monix.execution.atomic.AtomicBoolean
7+
8+
class ObservableDeferred[A](
9+
ref: Deferred[MonixTask, A],
10+
state: Ref[MonixTask, Boolean],
11+
syncFlag: AtomicBoolean
12+
) {
13+
def complete(value: A): MonixTask[Unit] = {
14+
MonixTask.defer {
15+
ref
16+
.complete(value)
17+
.flatMap { _ =>
18+
syncFlag.set(true)
19+
state.set(true)
20+
}
21+
}.uncancelable
22+
}
23+
24+
def isCompletedUnsafe: Boolean = syncFlag.get
25+
26+
def isCompleted: MonixTask[Boolean] = state.get
27+
28+
def get: MonixTask[A] = ref.get
29+
}
30+
31+
object ObservableDeferred {
32+
33+
def apply[A](implicit F: Concurrent[MonixTask]): MonixTask[ObservableDeferred[A]] =
34+
for {
35+
ref <- Deferred[MonixTask, A]
36+
state <- Ref[MonixTask].of(false)
37+
} yield new ObservableDeferred(ref, state, AtomicBoolean(false))
38+
39+
}

build.sbt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ lazy val backend = project
105105
Dependencies.libraryManagement,
106106
Dependencies.sourcecode,
107107
Dependencies.monix,
108+
Dependencies.monixTest,
108109
Dependencies.directoryWatcher,
109110
Dependencies.zt,
110111
Dependencies.brave,
@@ -156,6 +157,7 @@ lazy val frontend: Project = project
156157
Dependencies.jsoniterMacros % Provided,
157158
Dependencies.scalazCore,
158159
Dependencies.monix,
160+
Dependencies.monixTest,
159161
Dependencies.caseApp,
160162
Dependencies.scalaDebugAdapter,
161163
Dependencies.bloopConfig,

frontend/src/main/scala/bloop/Bloop.scala

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,14 @@
11
package bloop
22

33
import scala.annotation.tailrec
4-
54
import bloop.cli.CliOptions
65
import bloop.cli.Commands
76
import bloop.cli.ExitStatus
87
import bloop.data.ClientInfo
98
import bloop.data.WorkspaceSettings
10-
import bloop.engine.Build
11-
import bloop.engine.BuildLoader
12-
import bloop.engine.Exit
13-
import bloop.engine.Interpreter
14-
import bloop.engine.NoPool
15-
import bloop.engine.Run
16-
import bloop.engine.State
9+
import bloop.engine.{Build, BuildLoader, ExecutionContext, Exit, Interpreter, NoPool, Run, State}
1710
import bloop.io.AbsolutePath
1811
import bloop.logging.BloopLogger
19-
2012
import _root_.bloop.task.Task
2113
import caseapp.CaseApp
2214
import caseapp.RemainingArgs
@@ -50,7 +42,7 @@ object Bloop extends CaseApp[CliOptions] {
5042
// Ignore the exit status here, all we want is the task to finish execution or fail.
5143
Cli.waitUntilEndOfWorld(options, state.pool, config, state.logger) {
5244
t.map(s => { State.stateCache.updateBuild(s.copy(status = ExitStatus.Ok)); s.status })
53-
}
45+
}(ExecutionContext.ioScheduler)
5446

5547
// Recover the state if the previous task has been successful.
5648
State.stateCache

0 commit comments

Comments
 (0)