Skip to content
This repository was archived by the owner on Jun 7, 2020. It is now read-only.

Commit

Permalink
Merge pull request #2121 from RocketChat/revert-2013-enhancement/coro…
Browse files Browse the repository at this point in the history
…utine-yield

[FIX][CI] Revert "[REFACTOR] Coroutines yield"
  • Loading branch information
philipbrito authored Mar 11, 2019
2 parents c452c7b + 1437955 commit 1130fd0
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,14 @@ import com.shopify.livedataktx.map
import com.shopify.livedataktx.nonNull
import kotlinx.coroutines.experimental.android.UI
import kotlinx.coroutines.experimental.delay
import kotlinx.coroutines.experimental.isActive
import kotlinx.coroutines.experimental.launch
import kotlinx.coroutines.experimental.newSingleThreadContext
import kotlinx.coroutines.experimental.withContext
import kotlinx.coroutines.experimental.yield
import timber.log.Timber
import java.lang.IllegalArgumentException
import kotlin.coroutines.experimental.coroutineContext


class ChatRoomsViewModel(
private val connectionManager: ConnectionManager,
Expand All @@ -50,11 +53,18 @@ class ChatRoomsViewModel(

// debounce, to not query while the user is writing
delay(200)
// TODO - find a better way for cancellation checking
if (!coroutineContext.isActive) return@wrap

val rooms = repository.search(string).let { mapper.map(it, showLastMessage = this.showLastMessage) }
data.postValue(rooms.toMutableList() + LoadingItemHolder())
yield()


if (!coroutineContext.isActive) return@wrap

val spotlight = spotlight(query.query)?.let { mapper.map(it, showLastMessage = this.showLastMessage) }
yield()
if (!coroutineContext.isActive) return@wrap

spotlight?.let {
data.postValue(rooms.toMutableList() + spotlight)
}.ifNull {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -295,7 +295,7 @@ class ConnectionManager(
val batch = ArrayList<T>(maxSize)
var deadline = 0L // deadline for sending this batch to callback block

while(isActive) {
while(true) {
// when deadline is reached or size is exceeded, pass the batch to the callback block
val remainingTime = deadline - System.currentTimeMillis()
if (batch.isNotEmpty() && remainingTime <= 0 || batch.size >= maxSize) {
Expand All @@ -317,6 +317,8 @@ class ConnectionManager(
// when timeout is reached just finish select, note: no timeout when batch is empty
if (batch.isNotEmpty()) onTimeout(remainingTime.orZero()) {}
}

if (!isActive) break
}
}
}
Expand Down
14 changes: 10 additions & 4 deletions app/src/main/java/chat/rocket/android/util/IO.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import chat.rocket.common.RocketChatNetworkErrorException
import kotlinx.coroutines.experimental.TimeoutCancellationException
import kotlinx.coroutines.experimental.delay
import kotlinx.coroutines.experimental.isActive
import kotlinx.coroutines.experimental.yield
import timber.log.Timber
import kotlin.coroutines.experimental.coroutineContext

Expand All @@ -22,17 +21,20 @@ suspend fun <T> retryIO(
{
var currentDelay = initialDelay
repeat(times - 1) { currentTry ->
yield()
if (!coroutineContext.isActive) throw TimeoutCancellationException("job canceled")
try {
return block()
} catch (e: RocketChatNetworkErrorException) {
Timber.d(e, "failed call($currentTry): $description")
e.printStackTrace()
}

if (!coroutineContext.isActive) throw TimeoutCancellationException("job canceled")
delay(currentDelay)
currentDelay = (currentDelay * factor).toLong().coerceAtMost(maxDelay)
}
yield()

if (!coroutineContext.isActive) throw TimeoutCancellationException("job canceled")
return block() // last attempt
}

Expand All @@ -46,15 +48,19 @@ suspend fun <T> retryDB(
{
var currentDelay = initialDelay
repeat(times - 1) { currentTry ->
if (!coroutineContext.isActive) throw TimeoutCancellationException("job canceled")
try {
return block()
} catch (e: SQLiteDatabaseLockedException) {
Timber.d(e, "failed call($currentTry): $description")
e.printStackTrace()
}

if (!coroutineContext.isActive) throw TimeoutCancellationException("job canceled")
delay(currentDelay)
currentDelay = (currentDelay * factor).toLong().coerceAtMost(maxDelay)
}
yield()

if (!coroutineContext.isActive) throw TimeoutCancellationException("job canceled")
return block() // last attempt
}

0 comments on commit 1130fd0

Please sign in to comment.