Skip to content
This repository was archived by the owner on Oct 18, 2024. It is now read-only.

Commit f3a8f3e

Browse files
committed
fix(logreceiver): use ConcurrentHashMap for storing LogSenderHandler instances (#1195)
1 parent 9ef5eaa commit f3a8f3e

File tree

1 file changed

+8
-9
lines changed

1 file changed

+8
-9
lines changed

app/src/main/java/com/itsaky/androidide/services/log/MultiLogSenderHandler.kt

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import com.itsaky.androidide.logsender.socket.SocketCommandParser
2222
import com.itsaky.androidide.models.LogLine
2323
import com.itsaky.androidide.utils.ILogger
2424
import java.net.ServerSocket
25-
import java.util.Collections
25+
import java.util.concurrent.ConcurrentHashMap
2626
import java.util.concurrent.atomic.AtomicBoolean
2727
import java.util.concurrent.atomic.AtomicInteger
2828

@@ -35,7 +35,7 @@ class MultiLogSenderHandler(consumer: ((LogLine) -> Unit)? = null) :
3535
Thread("MultiLogSenderHandler"), AutoCloseable {
3636

3737
private val log = ILogger.newInstance("MultiLogSenderHandler")
38-
private val clients = Collections.synchronizedMap(HashMap<String, LogSenderHandler>())
38+
private val clients = ConcurrentHashMap<String, LogSenderHandler>()
3939
private val port = AtomicInteger(-1)
4040
private var keepAlive = AtomicBoolean(false)
4141

@@ -67,7 +67,8 @@ class MultiLogSenderHandler(consumer: ((LogLine) -> Unit)? = null) :
6767
val senderInfoLine = clientSocket.getInputStream().bufferedReader().readLine()
6868
val command = SocketCommandParser.parse(senderInfoLine)
6969
if (command == null || command !is SenderInfoCommand) {
70-
log.error("Cannot accept log sender client. A sender must send the /sender command first.")
70+
log.error(
71+
"Cannot accept log sender client. A sender must send the /sender command first.")
7172
clientSocket.use {}
7273
continue
7374
}
@@ -96,13 +97,11 @@ class MultiLogSenderHandler(consumer: ((LogLine) -> Unit)? = null) :
9697
}
9798

9899
private fun removeAllClients() {
99-
synchronized(this.clients) {
100-
val iterator = this.clients.iterator()
101-
while(iterator.hasNext()) {
102-
iterator.next().value.closeAndLogError()
103-
iterator.remove()
104-
}
100+
this.clients.forEach { (_, handler) ->
101+
handler.closeAndLogError()
105102
}
103+
104+
this.clients.clear()
106105
}
107106

108107
override fun start() {

0 commit comments

Comments
 (0)