From 7db6a45437312c9c9a049c23136240756fa803d1 Mon Sep 17 00:00:00 2001 From: nathan Date: Thu, 10 Sep 2020 14:38:54 +0200 Subject: [PATCH] Fixed thread visibility issues in the client handshake when reconnecting --- src/dorkbox/network/handshake/ClientHandshake.kt | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/dorkbox/network/handshake/ClientHandshake.kt b/src/dorkbox/network/handshake/ClientHandshake.kt index a432f519..9a4c0fc8 100644 --- a/src/dorkbox/network/handshake/ClientHandshake.kt +++ b/src/dorkbox/network/handshake/ClientHandshake.kt @@ -25,16 +25,19 @@ import dorkbox.network.exceptions.ClientTimedOutException import io.aeron.FragmentAssembler import io.aeron.logbuffer.FragmentHandler import io.aeron.logbuffer.Header -import mu.KLogger import org.agrona.DirectBuffer import java.security.SecureRandom -internal class ClientHandshake(private val logger: KLogger, - private val config: Configuration, +internal class ClientHandshake(private val config: Configuration, private val crypto: CryptoManagement, private val endPoint: EndPoint) { + + // @Volatile is used BECAUSE suspension of coroutines can continue on a DIFFERENT thread. We want to make sure that thread visibility is + // correct when this happens. There are no race-conditions to be wary of. + // a one-time key for connecting private val oneTimePad = SecureRandom().nextInt() + private val handler: FragmentHandler @Volatile private var connectionHelloInfo: ClientConnectionInfo? = null @@ -45,7 +48,7 @@ internal class ClientHandshake(private val logger: KLogg @Volatile private var failed: Exception? = null - private var handler: FragmentHandler + @Volatile private var sessionId: Int = 0 init {