Kodein: InvalidMutabilityException caused by presenter injection
Kodein 7.1.0 Kotlin 1.4.10 Ktor 1.4.1 Corutines 1.3.9-native-mt-2
Application is crashing on iOS, but on Android is working fine.
super.init(
contentView: NewDeviceContentView(),
presenter: CommonLibraryInitializer.init().provideBeaconRegistrationPresenter(),
coordinator: coordinator,
shouldReattachWhenAppear: false
)
fun provideBeaconRegistrationPresenter() = PresentationKodeinProvider.kodein.direct.instance<BeaconRegistrationPresenter>()
Uncaught Kotlin exception: kotlin.native.concurrent.InvalidMutabilityException: mutation attempt of frozen kotlin.collections.HashMap@887968
at 0 CompanyCommon 0x0000000105c359fd kfun:kotlin.Throwable#<init>(kotlin.String?){} + 93 (/Users/teamcity/buildAgent/work/cae0e6559deed4c4/runtime/src/main/kotlin/kotlin/Throwable.kt:23:37)
at 1 CompanyCommon 0x0000000105c2e39b kfun:kotlin.Exception#<init>(kotlin.String?){} + 91 (/Users/teamcity/buildAgent/work/cae0e6559deed4c4/runtime/src/main/kotlin/kotlin/Exceptions.kt:23:44)
at 2 CompanyCommon 0x0000000105c2e5eb kfun:kotlin.RuntimeException#<init>(kotlin.String?){} + 91 (/Users/teamcity/buildAgent/work/cae0e6559deed4c4/runtime/src/main/kotlin/kotlin/Exceptions.kt:34:44)
at 3 CompanyCommon 0x0000000105c6578b kfun:kotlin.native.concurrent.InvalidMutabilityException#<init>(kotlin.String){} + 91 (/Users/teamcity/buildAgent/work/cae0e6559deed4c4/runtime/src/main/kotlin/kotlin/native/concurrent/Freezing.kt:22:60)
at 4 CompanyCommon 0x0000000105c67042 ThrowInvalidMutabilityException + 690 (/Users/teamcity/buildAgent/work/cae0e6559deed4c4/runtime/src/main/kotlin/kotlin/native/concurrent/Internal.kt:92:11)
at 5 CompanyCommon 0x0000000105d64ddc MutationCheck + 108
at 6 CompanyCommon 0x0000000105c483e0 kfun:kotlin.collections.HashMap.<set-length>#internal + 80 (/Users/teamcity/buildAgent/work/cae0e6559deed4c4/runtime/src/main/kotlin/kotlin/collections/HashMap.kt:16:17)
at 7 CompanyCommon 0x0000000105c4cf7f kfun:kotlin.collections.HashMap#addKey(1:0){}kotlin.Int + 1231 (/Users/teamcity/buildAgent/work/cae0e6559deed4c4/runtime/src/main/kotlin/kotlin/collections/HashMap.kt:292:36)
at 8 CompanyCommon 0x0000000105c49483 kfun:kotlin.collections.HashMap#put(1:0;1:1){}1:1? + 355 (/Users/teamcity/buildAgent/work/cae0e6559deed4c4/runtime/src/main/kotlin/kotlin/collections/HashMap.kt:68:21)
at 9 CompanyCommon 0x0000000105ec1af7 kfun:org.kodein.di.bindings.StandardScopeRegistry#getOrCreate(kotlin.Any;kotlin.Boolean;kotlin.Function0<org.kodein.di.bindings.Reference.Local<kotlin.Any,org.kodein.di.bindings.Reference<kotlin.Any>>>){}kotlin.Any + 1447 (/Users/runner/work/Kodein-DI/Kodein-DI/kodein-di/src/commonMain/kotlin/org/kodein/di/bindings/scopes.kt:65:27)
at 10 CompanyCommon 0x0000000105ec77f2 kfun:org.kodein.di.bindings.Singleton.getFactory$lambda-3#internal + 546 (/Users/runner/work/Kodein-DI/Kodein-DI/kodein-di/src/commonMain/kotlin/org/kodein/di/bindings/standardBindings.kt:127:22)
at 11 CompanyCommon 0x0000000105ec7ca4 kfun:org.kodein.di.bindings.Singleton.$getFactory$lambda-3$FUNCTION_REFERENCE$83.invoke#internal + 212 (/Users/runner/work/Kodein-DI/Kodein-DI/kodein-di/src/commonMain/kotlin/org/kodein/di/bindings/standardBindings.kt:125:16)
at 12 CompanyCommon 0x0000000105ed9ab1 kfun:org.kodein.di.internal.DIContainerImpl.factory$lambda-2#internal + 241 (/Users/runner/work/Kodein-DI/Kodein-DI/kodein-di/src/commonMain/kotlin/org/kodein/di/internal/DIContainerImpl.kt:160:22)
at 13 CompanyCommon 0x0000000105eda5fc kfun:org.kodein.di.internal.DIContainerImpl.$factory$lambda-2$FUNCTION_REFERENCE$98.invoke#internal + 204 (/Users/runner/work/Kodein-DI/Kodein-DI/kodein-di/src/commonMain/kotlin/org/kodein/di/internal/DIContainerImpl.kt:160:20)
at 14 CompanyCommon 0x0000000105eb83d2 kfun:org.kodein.di.DIContainer.provider$<anonymous>_1#internal + 194 (/Users/runner/work/Kodein-DI/Kodein-DI/kodein-di/src/commonMain/kotlin/org/kodein/di/DIContainer.kt:23:1)
at 15 CompanyCommon 0x0000000105eb87dd kfun:org.kodein.di.DIContainer.$provider$<anonymous>_1$FUNCTION_REFERENCE$25.invoke#internal + 157 (/Users/runner/work/Kodein-DI/Kodein-DI/kodein-di/src/commonMain/kotlin/org/kodein/di/DIContainer.kt:22:37)
at 16 CompanyCommon 0x0000000105eec458 kfun:org.kodein.di.internal.DirectDIBaseImpl#Instance(org.kodein.type.TypeToken<0:0>;kotlin.Any?){0§<kotlin.Any>}0:0 + 984 (/Users/runner/work/Kodein-DI/Kodein-DI/kodein-di/src/commonMain/kotlin/org/kodein/di/internal/DirectDIImpl.kt:30:153)
at 17 CompanyCommon 0x0000000105815063 kfun:com.Company.data.di.deviceConnectionModule$lambda-35$lambda-0#internal + 963 (/Users/mateuszkrawczuk/android-Company-client/Company-mobile-multiplatform/data/src/commonMain/kotlin/com/Company/data/di/deviceConnectionModule.kt:64:52)
at 18 CompanyCommon 0x000000010582ec83 kfun:com.Company.data.di.$deviceConnectionModule$lambda-35$lambda-0$FUNCTION_REFERENCE$358.invoke#internal + 179 (/Users/mateuszkrawczuk/android-Company-client/Company-mobile-multiplatform/data/src/commonMain/kotlin/com/Company/data/di/deviceConnectionModule.kt:64:52)
at 19 CompanyCommon 0x0000000105ec7332 kfun:org.kodein.di.bindings.Singleton.getFactory$lambda-3$lambda-2$lambda-1#internal + 370 (/Users/runner/work/Kodein-DI/Kodein-DI/kodein-di/src/commonMain/kotlin/org/kodein/di/bindings/standardBindings.kt:127:96)
at 20 CompanyCommon 0x0000000105ec7eb1 kfun:org.kodein.di.bindings.Singleton.$getFactory$lambda-3$lambda-2$lambda-1$FUNCTION_REFERENCE$84.invoke#internal + 161 (/Users/runner/work/Kodein-DI/Kodein-DI/kodein-di/src/commonMain/kotlin/org/kodein/di/bindings/standardBindings.kt:127:67)
at 21 CompanyCommon 0x0000000105ebfd37 kfun:org.kodein.di.bindings.Reference.Local.Companion#invoke(kotlin.Function0<0:0>;kotlin.Function1<0:0,0:1>){0§<kotlin.Any>;1§<org.kodein.di.bindings.Reference<0:0>>}org.kodein.di.bindings.Reference.Local<0:0,0:1> + 343 (/Users/runner/work/Kodein-DI/Kodein-DI/kodein-di/src/commonMain/kotlin/org/kodein/di/bindings/references.kt:16:127)
at 22 CompanyCommon 0x0000000105ec0c4a kfun:org.kodein.di.bindings.Strong.Companion#make(kotlin.Function0<0:0>){0§<kotlin.Any>}org.kodein.di.bindings.Reference.Local<0:0,org.kodein.di.bindings.Strong<0:0>> + 330 (/Users/runner/work/Kodein-DI/Kodein-DI/kodein-di/src/commonMain/kotlin/org/kodein/di/bindings/references.kt:31:97)
at 23 CompanyCommon 0x0000000105ec7547 kfun:org.kodein.di.bindings.Singleton.getFactory$lambda-3$lambda-2#internal + 391 (/Users/runner/work/Kodein-DI/Kodein-DI/kodein-di/src/commonMain/kotlin/org/kodein/di/bindings/standardBindings.kt:127:62)
at 24 CompanyCommon 0x0000000105ec80b1 kfun:org.kodein.di.bindings.Singleton.$getFactory$lambda-3$lambda-2$FUNCTION_REFERENCE$85.invoke#internal + 161 (/Users/runner/work/Kodein-DI/Kodein-DI/kodein-di/src/commonMain/kotlin/org/kodein/di/bindings/standardBindings.kt:127:51)
at 25 CompanyCommon 0x0000000105ec19ee kfun:org.kodein.di.bindings.StandardScopeRegistry#getOrCreate(kotlin.Any;kotlin.Boolean;kotlin.Function0<org.kodein.di.bindings.Reference.Local<kotlin.Any,org.kodein.di.bindings.Reference<kotlin.Any>>>){}kotlin.Any + 1182 (/Users/runner/work/Kodein-DI/Kodein-DI/kodein-di/src/commonMain/kotlin/org/kodein/di/bindings/scopes.kt:64:43)
at 26 CompanyCommon 0x0000000105ec77f2 kfun:org.kodein.di.bindings.Singleton.getFactory$lambda-3#internal + 546 (/Users/runner/work/Kodein-DI/Kodein-DI/kodein-di/src/commonMain/kotlin/org/kodein/di/bindings/standardBindings.kt:127:22)
at 27 CompanyCommon 0x0000000105ec7ca4 kfun:org.kodein.di.bindings.Singleton.$getFactory$lambda-3$FUNCTION_REFERENCE$83.invoke#internal + 212 (/Users/runner/work/Kodein-DI/Kodein-DI/kodein-di/src/commonMain/kotlin/org/kodein/di/bindings/standardBindings.kt:125:16)
at 28 CompanyCommon 0x0000000105ed9ab1 kfun:org.kodein.di.internal.DIContainerImpl.factory$lambda-2#internal + 241 (/Users/runner/work/Kodein-DI/Kodein-DI/kodein-di/src/commonMain/kotlin/org/kodein/di/internal/DIContainerImpl.kt:160:22)
at 29 CompanyCommon 0x0000000105eda5fc kfun:org.kodein.di.internal.DIContainerImpl.$factory$lambda-2$FUNCTION_REFERENCE$98.invoke#internal + 204 (/Users/runner/work/Kodein-DI/Kodein-DI/kodein-di/src/commonMain/kotlin/org/kodein/di/internal/DIContainerImpl.kt:160:20)
CoreSimulator 732.17 - Device: iPhone 8 (777479B4-8C83-494D-92DA-6EA9D0CE3133) - Runtime: iOS 14.1 (18A8394) - DeviceType: iPhone 8
About this issue
- Original URL
- State: closed
- Created 4 years ago
- Comments: 17 (10 by maintainers)
Hi, Kodein-DI is working on Kotlin/Native and iOS, in fact we are using it in production.
What’s important here, is that it’s not compatible with the actual multithread memory model. This means, that it might ends badly if you try to share the same DI container across multiple threads. Otherwise, you should be fine.
Also, JetBrains is working hard to change that memory model for Kotlin/Native. It should land soon enough, so it might not worth the pain to make DI compatible anymore. We’d rather wait for the new memory model.