Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Kotlin/Native immutability annotations missing #699

Closed
Alex009 opened this issue Oct 11, 2018 · 1 comment
Closed

Kotlin/Native immutability annotations missing #699

Alex009 opened this issue Oct 11, 2018 · 1 comment

Comments

@Alex009
Copy link

Alex009 commented Oct 11, 2018

with run coroutine on background thread i get:

#2	0x000000010388273a in ThrowIncorrectDereferenceException at /Users/builduser/buildAgent/work/4d622a065c544371/runtime/src/main/kotlin/kotlin/native/internal/RuntimeUtils.kt:75
#3	0x000000010389e3ba in CheckIsMainThread ()
#4	0x00000001038db74f in kfun:kotlinx.coroutines.<get-EMPTY_ACTIVE>#internal at /opt/teamcity-agent/work/44ec6e850d5c63f0/common/kotlinx-coroutines-core-common/src/JobSupport.kt:1170
#5	0x00000001038e7a27 in kfun:kotlinx.coroutines.JobSupport.<init>(kotlin.Boolean)kotlinx.coroutines.JobSupport at /opt/teamcity-agent/work/44ec6e850d5c63f0/common/kotlinx-coroutines-core-common/src/JobSupport.kt:124
#6	0x00000001038f2fe8 in kfun:kotlinx.coroutines.CompletableDeferredImpl.<init>#internal at /opt/teamcity-agent/work/44ec6e850d5c63f0/common/kotlinx-coroutines-core-common/src/CompletableDeferred.kt:64
#7	0x00000001038f2f4a in kfun:kotlinx.coroutines.CompletableDeferred(kotlinx.coroutines.Job?)Generic at /opt/teamcity-agent/work/44ec6e850d5c63f0/common/kotlinx-coroutines-core-common/src/CompletableDeferred.kt:45
#8	0x00000001038f38b0 in kfun:kotlinx.coroutines.CompletableDeferred$default(kotlinx.coroutines.Job?;kotlin.Int)Generic at /opt/teamcity-agent/work/44ec6e850d5c63f0/common/kotlinx-coroutines-core-common/src/CompletableDeferred.kt:40
#9	0x000000010395672f in kfun:io.ktor.client.request.HttpRequestBuilder.<init>()io.ktor.client.request.HttpRequestBuilder at /opt/teamcity-agent/work/a85294440dc5c6e/ktor-client/ktor-client-core/src/io/ktor/client/request/HttpRequest.kt:97
#10	0x00000001037c6c03 in kfun:com.mirbega.russiarunning.network.LiveEventsApi.$liveEventsList$COROUTINE$5.invokeSuspend(kotlin.Result<kotlin.Any?>)kotlin.Any? at /Users/alekseymikhailovwork/Documents/development/icerockdev_workspace/russia-running/russia-running-ios:1
#11	0x00000001037c6781 in kfun:com.mirbega.russiarunning.network.LiveEventsApi.liveEventsList$MultiPlatformLibrary()kotlin.collections.List<com.mirbega.russiarunning.model.entity.LiveEventWithWeather> at /Users/alekseymikhailovwork/Documents/development/icerockdev_workspace/russia-running/russia-running-ios/mpp-library/common/src/main/kotlin/com/mirbega/russiarunning/network/LiveEventsApi.kt:41
#12	0x00000001037cc3b5 in kfun:com.mirbega.russiarunning.model.repository.LiveEventsRepository.object-1.load#internal at /Users/alekseymikhailovwork/Documents/development/icerockdev_workspace/russia-running/russia-running-ios/mpp-library/common/src/main/kotlin/com/mirbega/russiarunning/model/repository/LiveEventsRepository.kt:78
#13	0x00000001037be6c4 in kfun:com.mirbega.russiarunning.model.repository.LiveEventsRepository.DataUpdater.$update$lambda-1$COROUTINE$0.invokeSuspend#internal at /Users/alekseymikhailovwork/Documents/development/icerockdev_workspace/russia-running/russia-running-ios/mpp-library/common/src/main/kotlin/com/mirbega/russiarunning/model/repository/LiveEventsRepository.kt:92
#14	0x000000010380cbb1 in kfun:kotlin.coroutines.native.internal.BaseContinuationImpl.resumeWith(kotlin.Result<kotlin.Any?>) at /Users/builduser/buildAgent/work/4d622a065c544371/runtime/src/main/kotlin/kotlin/coroutines/ContinuationImpl.kt:32
#15	0x0000000103979b6f in kfun:com.icerockdev.mpp.coroutines.AsyncDispatcher.dispatchResume$lambda-2#internal at /Users/alekseymikhailovwork/Documents/development/icerockdev_workspace/russia-running/russia-running-ios/mpp-library/ios:1

reason is

private val EMPTY_ACTIVE = Empty(true)
- this global vals not marked by Immutability annotations

my versions:

ext {
    kotlin_version = '1.3.0-rc-131'
    kotlin_native_version = '1.3.0-rc-131'
    coroutines_version = '0.30.2-eap13'
    ktor_version = '1.0.0-alpha-2'
}

code:

GlobalScope.launch(CommonPool) {
  try {
    val result = suspendFunction()
    launch(UI) {
      showResult(result)
    }
  } catch (error: Throwable) {
    showError(error)
  }
}

dispatchers:

@kotlin.native.SharedImmutable
actual val UI: CoroutineContext = MainQueueDispatcher()
@kotlin.native.SharedImmutable
actual val CommonPool: CoroutineContext = AsyncDispatcher()

abstract class ContinuationDispatcher :
        AbstractCoroutineContextElement(ContinuationInterceptor), ContinuationInterceptor {

    abstract fun <T> dispatchResume(value: T, continuation: Continuation<T>): Boolean
    abstract fun dispatchResumeWithException(exception: Throwable, continuation: Continuation<*>): Boolean

    override fun <T> interceptContinuation(continuation: Continuation<T>): Continuation<T> {
        return DispatchedContinuation(this, continuation)
    }
}

internal class DispatchedContinuation<T>(
        private val dispatcher: ContinuationDispatcher,
        private val continuation: Continuation<T>
) : Continuation<T> {

    override val context: CoroutineContext = continuation.context

    override fun resumeWith(result: Result<T>) {
        val value = result.getOrNull()
        if(value != null) {
            if (dispatcher.dispatchResume(value, continuation).not()) {
                continuation.resume(value)
            }
        }
        val exception = result.exceptionOrNull()
        if(exception != null) {
            if (dispatcher.dispatchResumeWithException(exception, continuation).not()) {
                continuation.resumeWithException(exception)
            }
        }
    }
}

class MainQueueDispatcher : ContinuationDispatcher() {
    private val mQueue = dispatch_get_main_queue()

    override fun <T> dispatchResume(value: T, continuation: Continuation<T>): Boolean {
        dispatch_async(mQueue) {
            continuation.resume(value)
        }
        return true
    }

    override fun dispatchResumeWithException(exception: Throwable, continuation: Continuation<*>): Boolean {
        dispatch_async(mQueue) {
            continuation.resumeWithException(exception)
        }
        return true
    }
}

class DataObject<T>(val value: T, val continuation: Continuation<T>)
class ErrorObject<T>(val exception: Throwable, val continuation: Continuation<T>)

class AsyncDispatcher : ContinuationDispatcher() {
    private val mWorker by lazy {
        Worker.start()
    }

    override fun <T> dispatchResume(value: T, continuation: Continuation<T>): Boolean {
        mWorker.execute(TransferMode.UNSAFE, {DataObject(value, continuation)}) {
            it.continuation.resume(it.value)
        }
        return true
    }

    override fun dispatchResumeWithException(exception: Throwable, continuation: Continuation<*>): Boolean {
        mWorker.execute(TransferMode.UNSAFE, {ErrorObject(exception, continuation)}) {
            it.continuation.resumeWithException(it.exception)
        }
        return true
    }
}
@elizarov
Copy link
Contributor

We'll cover that as a part of effort to bring multi-threaded coroutines on K/N. See #462. For now, coroutines are only supported on the main thread.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants