Skip to content

HashMap errors in Tests on iOS. #489

@Burtan

Description

@Burtan

Hi,

I'm experiencing the following error when running tests on iOS with kodein 7.26.1 on kotlin 2.1.21 and MacOS 15.5. I don't have anything fancy in my container setup, just some singletons. This error is not always thrown and seems to be a race condition.

fun getMainDI(
    platformFunctions: PlatformFunctions
) = DI.Module("main") {
    bindSingleton { platformFunctions.licensesFactory }
    bindSingleton { platformFunctions.resReader }
    bindSingleton<DaoFacade> { DaoSqlite(platformFunctions.driverFactory) }
    bindSingleton { TaskManager() }
    bindSingleton {
        HttpClient(platformFunctions.httpEngine) {
            install(ContentNegotiation) {
                json()
            }
            install(Logging) {
                logger = Logger.EMPTY
                level = LogLevel.INFO
            }
            // the default timeout differs between platforms and devices
            // some have no time out, so define it here
            install(HttpTimeout) {
                requestTimeoutMillis = 5000
            }
        }
    }
}

The instances are received via by instance(). Is HashMap on native really thread safe?

kotlin.ArrayIndexOutOfBoundsException
	at kotlin.Throwable#<init>(/opt/buildAgent/work/7377bd4dc65e1c03/kotlin/kotlin-native/runtime/src/main/kotlin/kotlin/Throwable.kt:34)
	at kotlin.Exception#<init>(/opt/buildAgent/work/7377bd4dc65e1c03/kotlin/kotlin-native/runtime/src/main/kotlin/kotlin/Exceptions.kt:21)
	at kotlin.RuntimeException#<init>(/opt/buildAgent/work/7377bd4dc65e1c03/kotlin/kotlin-native/runtime/src/main/kotlin/kotlin/Exceptions.kt:32)
	at kotlin.IndexOutOfBoundsException#<init>(/opt/buildAgent/work/7377bd4dc65e1c03/kotlin/kotlin-native/runtime/src/main/kotlin/kotlin/Exceptions.kt:90)
	at kotlin.ArrayIndexOutOfBoundsException#<init>(/opt/buildAgent/work/7377bd4dc65e1c03/kotlin/kotlin-native/runtime/src/main/kotlin/kotlin/Exceptions.kt:99)
	at <global>.ThrowArrayIndexOutOfBoundsException(/opt/buildAgent/work/7377bd4dc65e1c03/kotlin/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/RuntimeUtils.kt:33)
	at <global>.Kotlin_Array_set(Unknown Source)
	at kotlin.collections.HashMap#addKey(/opt/buildAgent/work/7377bd4dc65e1c03/kotlin/libraries/stdlib/native-wasm/src/kotlin/collections/HashMap.kt:360)
	at kotlin.collections.HashMap#put(/opt/buildAgent/work/7377bd4dc65e1c03/kotlin/libraries/stdlib/native-wasm/src/kotlin/collections/HashMap.kt:117)
	at kotlin.collections.MutableMap#put(/opt/buildAgent/work/7377bd4dc65e1c03/kotlin/libraries/stdlib/native-wasm/src/kotlin/collections/Map.kt:92)
	at org.kodein.di.internal.DITreeImpl#find(/Users/runner/work/Kodein/Kodein/kodein-di/src/commonMain/kotlin/org/kodein/di/internal/DITreeImpl.kt:132)
	at org.kodein.di.DITree#find(/Users/runner/work/Kodein/Kodein/kodein-di/src/commonMain/kotlin/org/kodein/di/DITree.kt:36)
	at org.kodein.di.DITree#find$default(/Users/runner/work/Kodein/Kodein/kodein-di/src/commonMain/kotlin/org/kodein/di/DITree.kt:36)
	at org.kodein.di.internal.DIContainerImpl#factory(/Users/runner/work/Kodein/Kodein/kodein-di/src/commonMain/kotlin/org/kodein/di/internal/DIContainerImpl.kt:171)
	at org.kodein.di.DIContainer#factory(/Users/runner/work/Kodein/Kodein/kodein-di/src/commonMain/kotlin/org/kodein/di/DIContainer.kt:32)
	at org.kodein.di.DIContainer#factory$default(/Users/runner/work/Kodein/Kodein/kodein-di/src/commonMain/kotlin/org/kodein/di/DIContainer.kt:32)
	at org.kodein.di.DIContainer#provider(/Users/runner/work/Kodein/Kodein/kodein-di/src/commonMain/kotlin/org/kodein/di/DIContainer.kt:76)
	at org.kodein.di.DIContainer#provider(/Users/runner/work/Kodein/Kodein/kodein-di/src/commonMain/kotlin/org/kodein/di/DIContainer.kt:75)
	at org.kodein.di.DIContainer#provider$default(/Users/runner/work/Kodein/Kodein/kodein-di/src/commonMain/kotlin/org/kodein/di/DIContainer.kt:75)
	at org.kodein.di.Instance$1.invoke#internal(/Users/runner/work/Kodein/Kodein/kodein-di/src/commonMain/kotlin/org/kodein/di/DIAware.kt:208)
	at kotlin.Function2#invoke(/Users/teamcity/.gradle/daemon/8.12.1/[K][Suspend]Functions:1)
	at org.kodein.di.DIProperty.DIProperty$provideDelegate$1.invoke#internal(/Users/runner/work/Kodein/Kodein/kodein-di/src/commonMain/kotlin/org/kodein/di/properties.kt:57)
	at kotlin.Function0#invoke(/Users/teamcity/.gradle/daemon/8.12.1/[K][Suspend]Functions:1)
	at kotlin.native.concurrent.SynchronizedLazyImpl#<get-value>(/opt/buildAgent/work/7377bd4dc65e1c03/kotlin/kotlin-native/runtime/src/main/kotlin/kotlin/native/concurrent/Lazy.kt:77)
	at kotlin.Lazy#<get-value>(/opt/buildAgent/work/7377bd4dc65e1c03/kotlin/libraries/stdlib/src/kotlin/util/Lazy.kt:27)
	at app.pathoshare.shared.main.pages.history.HistoryComponent.<get-dao>#internal(/Users/frederik/builds/t1_P9Ssdn/0/pathology/pathoshare/pathoshare-app/shared/src/commonMain/kotlin/app/pathoshare/shared/main/pages/history/HistoryComponent.kt:30)
	at app.pathoshare.shared.main.pages.history.HistoryComponent.HistoryComponent$1.$invokeCOROUTINE$0.invokeSuspend#internal(/Users/frederik/builds/t1_P9Ssdn/0/pathology/pathoshare/pathoshare-app/shared/src/commonMain/kotlin/app/pathoshare/shared/main/pages/history/HistoryComponent.kt:46)
	at app.pathoshare.shared.main.pages.history.HistoryComponent.HistoryComponent$1.invoke#internal(/Users/frederik/builds/t1_P9Ssdn/0/pathology/pathoshare/pathoshare-app/shared/src/commonMain/kotlin/app/pathoshare/shared/main/pages/history/HistoryComponent.kt:45)
	at kotlin.Function2#invoke(/Users/teamcity/.gradle/daemon/8.12.1/[K][Suspend]Functions:1)
	at kotlin.coroutines.intrinsics.createCoroutineUnintercepted$$inlined$createCoroutineFromSuspendFunction$4.invokeSuspend#internal(/opt/buildAgent/work/7377bd4dc65e1c03/kotlin/kotlin-native/runtime/src/main/kotlin/kotlin/coroutines/intrinsics/IntrinsicsNative.kt:254)
	at kotlin.coroutines.native.internal.BaseContinuationImpl#invokeSuspend(/opt/buildAgent/work/7377bd4dc65e1c03/kotlin/kotlin-native/runtime/src/main/kotlin/kotlin/coroutines/ContinuationImpl.kt:50)
	at kotlin.coroutines.native.internal.BaseContinuationImpl#resumeWith(/opt/buildAgent/work/7377bd4dc65e1c03/kotlin/kotlin-native/runtime/src/main/kotlin/kotlin/coroutines/ContinuationImpl.kt:30)
	at kotlin.coroutines.Continuation#resumeWith(/opt/buildAgent/work/7377bd4dc65e1c03/kotlin/libraries/stdlib/src/kotlin/coroutines/Continuation.kt:26)
	at kotlinx.coroutines.DispatchedTask#run(/opt/buildAgent/work/44ec6e850d5c63f0/kotlinx-coroutines-core/common/src/internal/DispatchedTask.kt:100)
	at kotlinx.coroutines.Runnable#run(/opt/buildAgent/work/44ec6e850d5c63f0/kotlinx-coroutines-core/native/src/Runnable.kt:12)
	at kotlinx.coroutines.DarwinGlobalQueueDispatcher.DarwinGlobalQueueDispatcher$dispatch$$inlined$autoreleasepool$1.invoke#internal(/opt/buildAgent/work/44ec6e850d5c63f0/kotlinx-coroutines-core/nativeDarwin/src/Dispatchers.kt:22)
	at kotlinx.coroutines.DarwinGlobalQueueDispatcher.DarwinGlobalQueueDispatcher$dispatch$$inlined$autoreleasepool$1.$<bridge-DNN>invoke(/opt/buildAgent/work/44ec6e850d5c63f0/kotlinx-coroutines-core/nativeDarwin/src/Dispatchers.kt:21)
	at kotlin.Function0#invoke(/Users/teamcity/.gradle/daemon/8.12.1/[K][Suspend]Functions:1)
	at <global>._6f72672e6a6574627261696e732e6b6f746c696e783a6b6f746c696e782d636f726f7574696e65732d636f72652f6f70742f6275696c644167656e742f776f726b2f343465633665383530643563363366302f6b6f746c696e782d636f726f7574696e65732d636f72652f6e617469766544617277696e2f7372632f44697370617463686572732e6b74_knbridge8(/opt/buildAgent/work/44ec6e850d5c63f0/kotlinx-coroutines-core/nativeDarwin/src/Dispatchers.kt:21)
	at <global>._dispatch_call_block_and_release(Unknown Source)
	at <global>._dispatch_client_callout(Unknown Source)
	at _dispatch_workloop_invoke.cold.4(Unknown Source)
	at <global>._dispatch_queue_override_invoke(Unknown Source)
	at <global>._dispatch_root_queue_drain(Unknown Source)
	at <global>._dispatch_worker_thread2(Unknown Source)
	at <global>._pthread_wqthread(Unknown Source)
	at <global>.start_wqthread(Unknown Source)

a second error

kotlin.IllegalStateException: This cannot happen with fixed magic multiplier and grow-only hash array. Have object hashCodes changed?
	at kotlin.Throwable#<init>(/opt/buildAgent/work/7377bd4dc65e1c03/kotlin/kotlin-native/runtime/src/main/kotlin/kotlin/Throwable.kt:30)
	at kotlin.Exception#<init>(/opt/buildAgent/work/7377bd4dc65e1c03/kotlin/kotlin-native/runtime/src/main/kotlin/kotlin/Exceptions.kt:23)
	at kotlin.RuntimeException#<init>(/opt/buildAgent/work/7377bd4dc65e1c03/kotlin/kotlin-native/runtime/src/main/kotlin/kotlin/Exceptions.kt:34)
	at kotlin.IllegalStateException#<init>(/opt/buildAgent/work/7377bd4dc65e1c03/kotlin/kotlin-native/runtime/src/main/kotlin/kotlin/Exceptions.kt:70)
	at kotlin.collections.HashMap.rehash#internal(/opt/buildAgent/work/7377bd4dc65e1c03/kotlin/libraries/stdlib/native-wasm/src/kotlin/collections/HashMap.kt:302)
	at kotlin.collections.HashMap.ensureCapacity#internal(/opt/buildAgent/work/7377bd4dc65e1c03/kotlin/libraries/stdlib/native-wasm/src/kotlin/collections/HashMap.kt:253)
	at kotlin.collections.HashMap.ensureExtraCapacity#internal(/opt/buildAgent/work/7377bd4dc65e1c03/kotlin/libraries/stdlib/native-wasm/src/kotlin/collections/HashMap.kt:233)
	at kotlin.collections.HashMap#addKey(/opt/buildAgent/work/7377bd4dc65e1c03/kotlin/libraries/stdlib/native-wasm/src/kotlin/collections/HashMap.kt:356)
	at kotlin.collections.HashMap#put(/opt/buildAgent/work/7377bd4dc65e1c03/kotlin/libraries/stdlib/native-wasm/src/kotlin/collections/HashMap.kt:117)
	at kotlin.collections.MutableMap#put(/opt/buildAgent/work/7377bd4dc65e1c03/kotlin/libraries/stdlib/native-wasm/src/kotlin/collections/Map.kt:92)
	at org.kodein.di.internal.DITreeImpl#find(/Users/runner/work/Kodein/Kodein/kodein-di/src/commonMain/kotlin/org/kodein/di/internal/DITreeImpl.kt:132)
	at org.kodein.di.DITree#find(/Users/runner/work/Kodein/Kodein/kodein-di/src/commonMain/kotlin/org/kodein/di/DITree.kt:36)
	at org.kodein.di.DITree#find$default(/Users/runner/work/Kodein/Kodein/kodein-di/src/commonMain/kotlin/org/kodein/di/DITree.kt:36)
	at org.kodein.di.internal.DIContainerImpl#factory(/Users/runner/work/Kodein/Kodein/kodein-di/src/commonMain/kotlin/org/kodein/di/internal/DIContainerImpl.kt:171)
	at org.kodein.di.DIContainer#factory(/Users/runner/work/Kodein/Kodein/kodein-di/src/commonMain/kotlin/org/kodein/di/DIContainer.kt:32)
	at org.kodein.di.DIContainer#factory$default(/Users/runner/work/Kodein/Kodein/kodein-di/src/commonMain/kotlin/org/kodein/di/DIContainer.kt:32)
	at org.kodein.di.DIContainer#provider(/Users/runner/work/Kodein/Kodein/kodein-di/src/commonMain/kotlin/org/kodein/di/DIContainer.kt:76)
	at org.kodein.di.DIContainer#provider(/Users/runner/work/Kodein/Kodein/kodein-di/src/commonMain/kotlin/org/kodein/di/DIContainer.kt:75)
	at org.kodein.di.DIContainer#provider$default(/Users/runner/work/Kodein/Kodein/kodein-di/src/commonMain/kotlin/org/kodein/di/DIContainer.kt:75)
	at org.kodein.di.Instance$1.invoke#internal(/Users/runner/work/Kodein/Kodein/kodein-di/src/commonMain/kotlin/org/kodein/di/DIAware.kt:208)
	at kotlin.Function2#invoke(/Users/teamcity/.gradle/daemon/8.12.1/[K][Suspend]Functions:1)
	at org.kodein.di.DIProperty.DIProperty$provideDelegate$1.invoke#internal(/Users/runner/work/Kodein/Kodein/kodein-di/src/commonMain/kotlin/org/kodein/di/properties.kt:57)
	at kotlin.Function0#invoke(/Users/teamcity/.gradle/daemon/8.12.1/[K][Suspend]Functions:1)
	at kotlin.native.concurrent.SynchronizedLazyImpl#<get-value>(/opt/buildAgent/work/7377bd4dc65e1c03/kotlin/kotlin-native/runtime/src/main/kotlin/kotlin/native/concurrent/Lazy.kt:77)
	at kotlin.Lazy#<get-value>(/opt/buildAgent/work/7377bd4dc65e1c03/kotlin/libraries/stdlib/src/kotlin/util/Lazy.kt:27)
	at app.pathoshare.shared.main.pages.PagesComponent#<get-patho>(/Users/frederik/builds/t1_P9Ssdn/0/pathology/pathoshare/pathoshare-app/shared/src/commonMain/kotlin/app/pathoshare/shared/main/pages/PagesComponent.kt:57)
	at app.pathoshare.shared.main.pages.PagesComponent.PagesComponent$2.invoke#internal(/Users/frederik/builds/t1_P9Ssdn/0/pathology/pathoshare/pathoshare-app/shared/src/commonMain/kotlin/app/pathoshare/shared/main/pages/PagesComponent.kt:64)
	at kotlin.Function2#invoke(/Users/teamcity/.gradle/daemon/8.12.1/[K][Suspend]Functions:1)
	at kotlin.coroutines.intrinsics.createCoroutineUnintercepted$$inlined$createCoroutineFromSuspendFunction$4.invokeSuspend#internal(/opt/buildAgent/work/7377bd4dc65e1c03/kotlin/kotlin-native/runtime/src/main/kotlin/kotlin/coroutines/intrinsics/IntrinsicsNative.kt:254)
	at kotlin.coroutines.native.internal.BaseContinuationImpl#invokeSuspend(/opt/buildAgent/work/7377bd4dc65e1c03/kotlin/kotlin-native/runtime/src/main/kotlin/kotlin/coroutines/ContinuationImpl.kt:50)
	at kotlin.coroutines.native.internal.BaseContinuationImpl#resumeWith(/opt/buildAgent/work/7377bd4dc65e1c03/kotlin/kotlin-native/runtime/src/main/kotlin/kotlin/coroutines/ContinuationImpl.kt:30)
	at kotlin.coroutines.Continuation#resumeWith(/opt/buildAgent/work/7377bd4dc65e1c03/kotlin/libraries/stdlib/src/kotlin/coroutines/Continuation.kt:26)
	at kotlinx.coroutines.DispatchedTask#run(/opt/buildAgent/work/44ec6e850d5c63f0/kotlinx-coroutines-core/common/src/internal/DispatchedTask.kt:100)
	at kotlinx.coroutines.Runnable#run(/opt/buildAgent/work/44ec6e850d5c63f0/kotlinx-coroutines-core/native/src/Runnable.kt:12)
	at kotlinx.coroutines.DarwinGlobalQueueDispatcher.DarwinGlobalQueueDispatcher$dispatch$$inlined$autoreleasepool$1.invoke#internal(/opt/buildAgent/work/44ec6e850d5c63f0/kotlinx-coroutines-core/nativeDarwin/src/Dispatchers.kt:22)
	at kotlinx.coroutines.DarwinGlobalQueueDispatcher.DarwinGlobalQueueDispatcher$dispatch$$inlined$autoreleasepool$1.$<bridge-DNN>invoke(/opt/buildAgent/work/44ec6e850d5c63f0/kotlinx-coroutines-core/nativeDarwin/src/Dispatchers.kt:21)
	at kotlin.Function0#invoke(/Users/teamcity/.gradle/daemon/8.12.1/[K][Suspend]Functions:1)
	at <global>._6f72672e6a6574627261696e732e6b6f746c696e783a6b6f746c696e782d636f726f7574696e65732d636f72652f6f70742f6275696c644167656e742f776f726b2f343465633665383530643563363366302f6b6f746c696e782d636f726f7574696e65732d636f72652f6e617469766544617277696e2f7372632f44697370617463686572732e6b74_knbridge8(/opt/buildAgent/work/44ec6e850d5c63f0/kotlinx-coroutines-core/nativeDarwin/src/Dispatchers.kt:21)
	at <global>._dispatch_call_block_and_release(Unknown Source)
	at <global>._dispatch_client_callout(Unknown Source)
	at _dispatch_workloop_invoke.cold.4(Unknown Source)
	at <global>._dispatch_queue_override_invoke(Unknown Source)
	at <global>._dispatch_root_queue_drain(Unknown Source)
	at <global>._dispatch_worker_thread2(Unknown Source)
	at <global>._pthread_wqthread(Unknown Source)
	at <global>.start_wqthread(Unknown Source)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions