From 440122d4f9f85a2fbffa08f2016e8be980d139dd Mon Sep 17 00:00:00 2001
From: Him188 <Him188@mamoe.net>
Date: Sat, 29 Oct 2022 13:14:35 +0100
Subject: [PATCH] [console] Enable atomicfu compiler

---
 mirai-console/backend/mirai-console/build.gradle.kts      | 2 +-
 .../backend/mirai-console/src/util/CoroutineScopeUtils.kt | 8 +++++---
 2 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/mirai-console/backend/mirai-console/build.gradle.kts b/mirai-console/backend/mirai-console/build.gradle.kts
index 6bf4ed0e1..7f3bd418d 100644
--- a/mirai-console/backend/mirai-console/build.gradle.kts
+++ b/mirai-console/backend/mirai-console/build.gradle.kts
@@ -21,6 +21,7 @@ plugins {
     `maven-publish`
     id("me.him188.kotlin-jvm-blocking-bridge")
     id("me.him188.kotlin-dynamic-delegation")
+    id("kotlinx-atomicfu")
 }
 
 version = Versions.console
@@ -45,7 +46,6 @@ dependencies {
     compileAndTestRuntime(project(":mirai-core-utils"))
     compileAndTestRuntime(`kotlin-stdlib-jdk8`)
 
-    compileAndTestRuntime(`kotlinx-atomicfu`)
     compileAndTestRuntime(`kotlinx-coroutines-core`)
     compileAndTestRuntime(`kotlinx-serialization-core`)
     compileAndTestRuntime(`kotlinx-serialization-json`)
diff --git a/mirai-console/backend/mirai-console/src/util/CoroutineScopeUtils.kt b/mirai-console/backend/mirai-console/src/util/CoroutineScopeUtils.kt
index e61108f1b..bb9983178 100644
--- a/mirai-console/backend/mirai-console/src/util/CoroutineScopeUtils.kt
+++ b/mirai-console/backend/mirai-console/src/util/CoroutineScopeUtils.kt
@@ -10,7 +10,6 @@
 package net.mamoe.mirai.console.util
 
 import kotlinx.atomicfu.atomic
-import kotlinx.atomicfu.loop
 import kotlinx.coroutines.*
 import net.mamoe.mirai.console.internal.util.runIgnoreException
 import net.mamoe.mirai.utils.currentTimeMillis
@@ -38,7 +37,8 @@ internal class TimedTask(
 
     val job: Job = scope.launch(coroutineContext) {
         // `delay` always checks for cancellation
-        lastChangedTime.loop { last ->
+        while (true) {
+            val last = lastChangedTime.value
             val current = currentTimeMillis()
             if (last == UNCHANGED) {
                 runIgnoreException<CancellationException> {
@@ -46,7 +46,7 @@ internal class TimedTask(
                 } ?: return@launch
             } else {
                 if (current - last > intervalMillis) {
-                    if (!lastChangedTime.compareAndSet(last, UNCHANGED)) return@loop
+                    if (!casLastChangedToUnchanged(last)) continue
                     action()
                 }
                 runIgnoreException<CancellationException> {
@@ -55,6 +55,8 @@ internal class TimedTask(
             }
         }
     }
+
+    private fun casLastChangedToUnchanged(last: Long) = lastChangedTime.compareAndSet(last, UNCHANGED)
 }
 
 internal fun CoroutineScope.launchTimedTask(