From 2cbace5bb5d99c5cb544257025bae42eb521ab32 Mon Sep 17 00:00:00 2001 From: Zane Schepke Date: Tue, 30 Sep 2025 13:10:19 -0400 Subject: [PATCH] fix: tunnel performance bug --- .../wireguardautotunnel/core/tunnel/BaseTunnel.kt | 10 +++++++--- .../wireguardautotunnel/core/tunnel/KernelTunnel.kt | 5 ++++- .../wireguardautotunnel/core/tunnel/UserspaceTunnel.kt | 5 ++++- .../zaneschepke/wireguardautotunnel/di/TunnelModule.kt | 7 ++++++- 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel/BaseTunnel.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel/BaseTunnel.kt index a41648a3..05235724 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel/BaseTunnel.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel/BaseTunnel.kt @@ -1,6 +1,7 @@ package com.zaneschepke.wireguardautotunnel.core.tunnel import com.zaneschepke.wireguardautotunnel.di.ApplicationScope +import com.zaneschepke.wireguardautotunnel.di.IoDispatcher import com.zaneschepke.wireguardautotunnel.domain.enums.BackendMode import com.zaneschepke.wireguardautotunnel.domain.enums.TunnelStatus import com.zaneschepke.wireguardautotunnel.domain.events.BackendCoreException @@ -12,6 +13,7 @@ import com.zaneschepke.wireguardautotunnel.domain.state.TunnelState import com.zaneschepke.wireguardautotunnel.domain.state.TunnelStatistics import java.util.concurrent.ConcurrentHashMap import kotlin.coroutines.cancellation.CancellationException +import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job import kotlinx.coroutines.flow.* @@ -21,8 +23,10 @@ import kotlinx.coroutines.sync.withLock import org.amnezia.awg.crypto.Key import timber.log.Timber -abstract class BaseTunnel(@ApplicationScope protected val applicationScope: CoroutineScope) : - TunnelProvider { +abstract class BaseTunnel( + @ApplicationScope protected val applicationScope: CoroutineScope, + @IoDispatcher protected val ioDispatcher: CoroutineDispatcher, +) : TunnelProvider { protected val errors = MutableSharedFlow>() override val errorEvents = errors.asSharedFlow() @@ -105,7 +109,7 @@ abstract class BaseTunnel(@ApplicationScope protected val applicationScope: Coro updateTunnelStatus(tunnelConf.id, TunnelStatus.Starting) val job = - applicationScope.launch { + applicationScope.launch(ioDispatcher) { try { tunnelStateFlow(tunnelConf).collect { status -> updateTunnelStatus(tunnelConf.id, status) diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel/KernelTunnel.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel/KernelTunnel.kt index 77fb59d0..1fd96faf 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel/KernelTunnel.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel/KernelTunnel.kt @@ -4,6 +4,7 @@ import com.wireguard.android.backend.Backend import com.wireguard.android.backend.BackendException import com.wireguard.android.backend.Tunnel as WgTunnel import com.zaneschepke.wireguardautotunnel.di.ApplicationScope +import com.zaneschepke.wireguardautotunnel.di.IoDispatcher import com.zaneschepke.wireguardautotunnel.di.Kernel import com.zaneschepke.wireguardautotunnel.domain.enums.BackendMode import com.zaneschepke.wireguardautotunnel.domain.enums.TunnelStatus @@ -15,6 +16,7 @@ import com.zaneschepke.wireguardautotunnel.util.extensions.asTunnelState import com.zaneschepke.wireguardautotunnel.util.extensions.toBackendCoreException import java.util.concurrent.ConcurrentHashMap import javax.inject.Inject +import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.channels.awaitClose @@ -28,8 +30,9 @@ class KernelTunnel @Inject constructor( @ApplicationScope applicationScope: CoroutineScope, + @IoDispatcher ioDispatcher: CoroutineDispatcher, @Kernel private val backend: Backend, -) : BaseTunnel(applicationScope) { +) : BaseTunnel(applicationScope, ioDispatcher) { private val runtimeTunnels = ConcurrentHashMap() diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel/UserspaceTunnel.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel/UserspaceTunnel.kt index c6da7ea8..23fad99d 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel/UserspaceTunnel.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel/UserspaceTunnel.kt @@ -2,6 +2,7 @@ package com.zaneschepke.wireguardautotunnel.core.tunnel import com.zaneschepke.wireguardautotunnel.data.model.DnsProtocol import com.zaneschepke.wireguardautotunnel.di.ApplicationScope +import com.zaneschepke.wireguardautotunnel.di.IoDispatcher import com.zaneschepke.wireguardautotunnel.domain.enums.BackendMode import com.zaneschepke.wireguardautotunnel.domain.enums.TunnelStatus import com.zaneschepke.wireguardautotunnel.domain.events.BackendCoreException @@ -19,6 +20,7 @@ import java.io.IOException import java.util.* import java.util.concurrent.ConcurrentHashMap import javax.inject.Inject +import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.channels.awaitClose @@ -41,10 +43,11 @@ class UserspaceTunnel @Inject constructor( @ApplicationScope applicationScope: CoroutineScope, + @IoDispatcher ioDispatcher: CoroutineDispatcher, private val proxySettingsRepository: ProxySettingsRepository, private val settingsRepository: GeneralSettingRepository, private val backend: Backend, -) : BaseTunnel(applicationScope) { +) : BaseTunnel(applicationScope, ioDispatcher) { private val runtimeTunnels = ConcurrentHashMap() diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/di/TunnelModule.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/di/TunnelModule.kt index 08fb493e..4ab67f13 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/di/TunnelModule.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/di/TunnelModule.kt @@ -85,9 +85,10 @@ class TunnelModule { @Kernel fun provideKernelProvider( @ApplicationScope applicationScope: CoroutineScope, + @IoDispatcher ioDispatcher: CoroutineDispatcher, backend: com.wireguard.android.backend.Backend, ): TunnelProvider { - return KernelTunnel(applicationScope, backend) + return KernelTunnel(applicationScope, ioDispatcher, backend) } @Provides @@ -98,9 +99,11 @@ class TunnelModule { proxySettingsRepository: ProxySettingsRepository, settingsRepository: GeneralSettingRepository, @Userspace backend: Backend, + @IoDispatcher ioDispatcher: CoroutineDispatcher, ): TunnelProvider { return UserspaceTunnel( applicationScope, + ioDispatcher, proxySettingsRepository, settingsRepository, backend, @@ -115,9 +118,11 @@ class TunnelModule { settingsRepository: GeneralSettingRepository, proxySettingsRepository: ProxySettingsRepository, @ProxyUserspace backend: Backend, + @IoDispatcher ioDispatcher: CoroutineDispatcher, ): TunnelProvider { return UserspaceTunnel( applicationScope, + ioDispatcher, proxySettingsRepository, settingsRepository, backend,