@@ -47,17 +47,13 @@ object Bloop {
47
47
private val defaultPort : Int = 8212 // 8100 + 'p'
48
48
def main (args : Array [String ]): Unit = {
49
49
def toPortNumber (userPort : String ) = Try (userPort.toInt).getOrElse(Bloop .defaultPort)
50
- val lockFilesOrHostPort = args match {
50
+ val lockFilesDirOrHostPort = args match {
51
51
case Array () =>
52
52
val dir = bloop.io.Paths .daemonDir.underlying
53
- ensureSafeDirectoryExists(dir)
54
- val lockFiles = LockFiles .under(dir)
55
- Right (lockFiles)
53
+ Right (dir)
56
54
case Array (daemonArg) if daemonArg.startsWith(" daemon:" ) =>
57
55
val dir = Paths .get(daemonArg.stripPrefix(" daemon:" ))
58
- ensureSafeDirectoryExists(dir)
59
- val lockFiles = LockFiles .under(dir)
60
- Right (lockFiles)
56
+ Right (dir)
61
57
case Array (arg) =>
62
58
Left ((InetAddress .getLoopbackAddress(), toPortNumber(arg)))
63
59
case Array (host, portStr) =>
@@ -82,15 +78,17 @@ object Bloop {
82
78
truncateFilePeriodically(Paths .get(value))
83
79
}
84
80
85
- lockFilesOrHostPort match {
81
+ lockFilesDirOrHostPort match {
86
82
case Left (hostPort) =>
87
83
startServer(Left (hostPort))
88
- case Right (lockFiles ) =>
84
+ case Right (lockFilesDir ) =>
89
85
val period = 3 .second
90
86
val attempts = 10
91
87
92
88
@ tailrec
93
89
def loop (remainingAttempts : Int ): Unit = {
90
+ ensureSafeDirectoryExists(lockFilesDir)
91
+ val lockFiles = LockFiles .under(lockFilesDir)
94
92
val res = Lock .tryAcquire(lockFiles, LockProcess .default) {
95
93
startServer(Right (lockFiles.socketPaths))
96
94
}
@@ -104,6 +102,9 @@ object Bloop {
104
102
throw new Exception (err)
105
103
case Left (_ : LockError .AlreadyRunning ) =>
106
104
sys.exit(222 ) // Special exit code if a server is already running
105
+ case Left (_ : LockError .ZombieFound ) =>
106
+ Files .delete(lockFiles.pidFile)
107
+ loop(remainingAttempts - 1 )
107
108
case Left (err : LockError .FatalError ) =>
108
109
throw new Exception (err)
109
110
case Right (()) =>
0 commit comments