nordiauwu
06/28/2021, 6:31 PMval mutex = Mutex()
runBlocking {
mutex.withLock {
...
}
}
as a workaround, but not sure if it's a good practice.Dominaezzz
06/28/2021, 6:39 PMArkadii Ivanov
06/28/2021, 6:41 PMnordiauwu
06/28/2021, 6:51 PMArkadii Ivanov
06/28/2021, 6:55 PMDominaezzz
06/28/2021, 7:01 PMtryAcquire
looks very dangerous.Dominaezzz
06/28/2021, 7:01 PMMutex
. You already have atomics.nordiauwu
06/28/2021, 7:05 PMMutex
Dominaezzz
06/28/2021, 7:08 PMDominaezzz
06/28/2021, 7:08 PMnordiauwu
06/28/2021, 7:10 PMoverride fun tryAcquire(): Boolean {
val isAcquired = permitsLeft.getAndDecrement() >= 1
if (!isAcquired && isTimeToReset()) {
if (isTimeToReset()) {
resetAndAcquire(); return true
} else {
tryAcquire()
}
}
if (isAcquired) {
timeFirstPermitAcquired.compareAndSet(null, timeSource.markNow())
}
return isAcquired
}
if that's what you meannordiauwu
06/28/2021, 7:11 PMnordiauwu
06/28/2021, 7:12 PMDominaezzz
06/28/2021, 7:13 PMnordiauwu
06/28/2021, 7:19 PMDominaezzz
06/28/2021, 7:22 PM@ExperimentalTime
@ExperimentalCoroutinesApi
private class RateLimiterImpl(val permitsPerSecond: Int, val timeSource: TimeSource) {
init {
require(permitsPerSecond > 0) { "Rate must be > 0" }
}
private val lastPermitTime = AtomicReference<TimeMark?>(null)
private val timeBetweenPermits = Duration.seconds(1.0 / permitsPerSecond)
suspend fun acquire() {
while (true) {
val lastMark = lastPermitTime.get()
if (lastMark == null || lastMark.elapsedNow() > timeBetweenPermits) {
if (lastPermitTime.weakCompareAndSetVolatile(lastMark, timeSource.markNow())) {
break
}
} else {
delay(timeBetweenPermits - lastMark.elapsedNow())
}
}
}
fun tryAcquire(): Boolean {
while (true) {
val lastMark = lastPermitTime.get()
if (lastMark == null || lastMark.elapsedNow() > timeBetweenPermits) {
if (lastPermitTime.weakCompareAndSetVolatile(lastMark, timeSource.markNow())) {
return true
}
} else {
return false
}
}
}
}
nordiauwu
06/28/2021, 7:37 PMtimeBetweenPermits
delay between acquire
calls.nordiauwu
06/28/2021, 7:38 PMDominaezzz
06/28/2021, 7:39 PMDominaezzz
06/28/2021, 7:40 PMnordiauwu
06/28/2021, 7:40 PMDominaezzz
06/28/2021, 7:42 PMnordiauwu
06/28/2021, 7:43 PM