From decf1920b447706699c8b042f725b9443a95b37b Mon Sep 17 00:00:00 2001 From: Him188 Date: Wed, 2 Sep 2020 20:20:26 +0800 Subject: [PATCH] Expose CoroutineScopeUtils to public --- .../internal/plugin/JvmPluginInternal.kt | 11 +--- .../internal/util/JavaPluginSchedulerImpl.kt | 4 +- .../mirai/console/util/CoroutineScopeUtils.kt | 52 ++++++++++++------- .../pure/MiraiConsoleImplementationPure.kt | 13 ++--- .../console/pure/MiraiConsolePureLoader.kt | 15 +++++- 5 files changed, 58 insertions(+), 37 deletions(-) diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/internal/plugin/JvmPluginInternal.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/internal/plugin/JvmPluginInternal.kt index 5b0d7ef4b..43fabd034 100644 --- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/internal/plugin/JvmPluginInternal.kt +++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/internal/plugin/JvmPluginInternal.kt @@ -20,6 +20,7 @@ import net.mamoe.mirai.console.plugin.PluginManager import net.mamoe.mirai.console.plugin.PluginManager.INSTANCE.safeLoader import net.mamoe.mirai.console.plugin.ResourceContainer.Companion.asResourceContainer import net.mamoe.mirai.console.plugin.jvm.JvmPlugin +import net.mamoe.mirai.console.util.NamedSupervisorJob import net.mamoe.mirai.utils.MiraiLogger import java.io.File import java.io.InputStream @@ -159,16 +160,6 @@ internal abstract class JvmPluginInternal( // endregion } -@Suppress("FunctionName") -internal class NamedSupervisorJob( - private val name: String, - parent: Job? = null -) : CompletableJob by SupervisorJob(parent) { - override fun toString(): String { - return "NamedSupervisorJob($name)" - } -} - internal inline fun AtomicLong.updateWhen(condition: (Long) -> Boolean, update: (Long) -> Long): Boolean { while (true) { val current = value diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/internal/util/JavaPluginSchedulerImpl.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/internal/util/JavaPluginSchedulerImpl.kt index fcb9ebde0..23af98223 100644 --- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/internal/util/JavaPluginSchedulerImpl.kt +++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/internal/util/JavaPluginSchedulerImpl.kt @@ -11,8 +11,8 @@ package net.mamoe.mirai.console.internal.util import kotlinx.coroutines.* import kotlinx.coroutines.future.future -import net.mamoe.mirai.console.internal.plugin.NamedSupervisorJob import net.mamoe.mirai.console.plugin.jvm.JavaPluginScheduler +import net.mamoe.mirai.console.util.CoroutineScopeUtils.overrideWithSupervisorJob import java.util.concurrent.Callable import java.util.concurrent.CompletableFuture import java.util.concurrent.Future @@ -21,7 +21,7 @@ import kotlin.coroutines.CoroutineContext internal class JavaPluginSchedulerImpl internal constructor(parentCoroutineContext: CoroutineContext) : CoroutineScope, JavaPluginScheduler { override val coroutineContext: CoroutineContext = - parentCoroutineContext + NamedSupervisorJob(this.toString(), parentCoroutineContext[Job]) + parentCoroutineContext.overrideWithSupervisorJob(this.toString()) override fun repeating(intervalMs: Long, runnable: Runnable): Future { return this.future { diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/util/CoroutineScopeUtils.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/util/CoroutineScopeUtils.kt index a5e6360b6..647ca62e4 100644 --- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/util/CoroutineScopeUtils.kt +++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/util/CoroutineScopeUtils.kt @@ -11,27 +11,43 @@ package net.mamoe.mirai.console.util -import kotlinx.coroutines.CoroutineName -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Job -import net.mamoe.mirai.console.internal.plugin.NamedSupervisorJob +import kotlinx.coroutines.* import kotlin.coroutines.CoroutineContext import kotlin.coroutines.EmptyCoroutineContext -internal fun CoroutineContext.overrideWithSupervisorJob(name: String? = null): CoroutineContext = - this + NamedSupervisorJob(name ?: "", this[Job]) +@ConsoleExperimentalAPI +public object CoroutineScopeUtils { + @JvmStatic + @ConsoleExperimentalAPI + public fun CoroutineContext.overrideWithSupervisorJob(name: String? = null): CoroutineContext = + this + NamedSupervisorJob(name ?: "", this[Job]) -internal fun CoroutineScope.childScope( - name: String? = null, - context: CoroutineContext = EmptyCoroutineContext -): CoroutineScope = - CoroutineScope(this.childScopeContext(name, context)) + @JvmStatic + @ConsoleExperimentalAPI + public fun CoroutineScope.childScope( + name: String? = null, + context: CoroutineContext = EmptyCoroutineContext + ): CoroutineScope = + CoroutineScope(this.childScopeContext(name, context)) -internal fun CoroutineScope.childScopeContext( - name: String? = null, - context: CoroutineContext = EmptyCoroutineContext -): CoroutineContext = - this.coroutineContext.overrideWithSupervisorJob(name) + context.let { - if (name != null) it + CoroutineName(name) - else it + @JvmStatic + @ConsoleExperimentalAPI + public fun CoroutineScope.childScopeContext( + name: String? = null, + context: CoroutineContext = EmptyCoroutineContext + ): CoroutineContext = + this.coroutineContext.overrideWithSupervisorJob(name) + context.let { + if (name != null) it + CoroutineName(name) + else it + } +} + +@ConsoleExperimentalAPI +public class NamedSupervisorJob @JvmOverloads constructor( + private val name: String, + parent: Job? = null +) : CompletableJob by SupervisorJob(parent) { + override fun toString(): String { + return "NamedSupervisorJob($name)" } +} diff --git a/frontend/mirai-console-pure/src/main/kotlin/net/mamoe/mirai/console/pure/MiraiConsoleImplementationPure.kt b/frontend/mirai-console-pure/src/main/kotlin/net/mamoe/mirai/console/pure/MiraiConsoleImplementationPure.kt index cdbdbb898..0d6abc78f 100644 --- a/frontend/mirai-console-pure/src/main/kotlin/net/mamoe/mirai/console/pure/MiraiConsoleImplementationPure.kt +++ b/frontend/mirai-console-pure/src/main/kotlin/net/mamoe/mirai/console/pure/MiraiConsoleImplementationPure.kt @@ -30,7 +30,6 @@ import net.mamoe.mirai.console.MiraiConsoleFrontEndDescription import net.mamoe.mirai.console.MiraiConsoleImplementation import net.mamoe.mirai.console.data.MultiFilePluginDataStorage import net.mamoe.mirai.console.data.PluginDataStorage -import net.mamoe.mirai.console.internal.plugin.NamedSupervisorJob import net.mamoe.mirai.console.plugin.DeferredPluginLoader import net.mamoe.mirai.console.plugin.PluginLoader import net.mamoe.mirai.console.plugin.jvm.JarPluginLoader @@ -38,6 +37,7 @@ import net.mamoe.mirai.console.pure.ConsoleInputImpl.requestInput import net.mamoe.mirai.console.util.ConsoleExperimentalAPI import net.mamoe.mirai.console.util.ConsoleInput import net.mamoe.mirai.console.util.ConsoleInternalAPI +import net.mamoe.mirai.console.util.NamedSupervisorJob import net.mamoe.mirai.utils.* import org.fusesource.jansi.Ansi import org.jline.reader.LineReader @@ -71,11 +71,12 @@ class MiraiConsoleImplementationPure override val dataStorageForBuiltIns: PluginDataStorage = MultiFilePluginDataStorage(rootPath.resolve("data")), override val configStorageForJarPluginLoader: PluginDataStorage = MultiFilePluginDataStorage(rootPath.resolve("config")), override val configStorageForBuiltIns: PluginDataStorage = MultiFilePluginDataStorage(rootPath.resolve("config")) -) : MiraiConsoleImplementation, CoroutineScope by CoroutineScope(NamedSupervisorJob("MiraiConsoleImplementationPure") + - CoroutineExceptionHandler { coroutineContext, throwable -> - val coroutineName = coroutineContext[CoroutineName]?.name ?: "" - MiraiConsole.mainLogger.error("Exception in coroutine $coroutineName", throwable) - }) { +) : MiraiConsoleImplementation, CoroutineScope by CoroutineScope( + NamedSupervisorJob("MiraiConsoleImplementationPure") + + CoroutineExceptionHandler { coroutineContext, throwable -> + val coroutineName = coroutineContext[CoroutineName]?.name ?: "" + MiraiConsole.mainLogger.error("Exception in coroutine $coroutineName", throwable) + }) { override val consoleInput: ConsoleInput get() = ConsoleInputImpl override fun createLoginSolver(requesterBot: Long, configuration: BotConfiguration): LoginSolver { diff --git a/frontend/mirai-console-pure/src/main/kotlin/net/mamoe/mirai/console/pure/MiraiConsolePureLoader.kt b/frontend/mirai-console-pure/src/main/kotlin/net/mamoe/mirai/console/pure/MiraiConsolePureLoader.kt index 06465154f..7f9686b6c 100644 --- a/frontend/mirai-console-pure/src/main/kotlin/net/mamoe/mirai/console/pure/MiraiConsolePureLoader.kt +++ b/frontend/mirai-console-pure/src/main/kotlin/net/mamoe/mirai/console/pure/MiraiConsolePureLoader.kt @@ -14,21 +14,24 @@ "INVISIBLE_SETTER", "INVISIBLE_GETTER", "INVISIBLE_ABSTRACT_MEMBER_FROM_SUPER", - "INVISIBLE_ABSTRACT_MEMBER_FROM_SUPE_WARNING" ) @file:OptIn(ConsoleInternalAPI::class) package net.mamoe.mirai.console.pure import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.runBlocking import net.mamoe.mirai.console.MiraiConsole import net.mamoe.mirai.console.MiraiConsoleImplementation import net.mamoe.mirai.console.MiraiConsoleImplementation.Companion.start +import net.mamoe.mirai.console.data.AutoSavePluginDataHolder import net.mamoe.mirai.console.util.ConsoleExperimentalAPI import net.mamoe.mirai.console.util.ConsoleInternalAPI +import net.mamoe.mirai.console.util.CoroutineScopeUtils.childScope import net.mamoe.mirai.message.data.Message import net.mamoe.mirai.utils.DefaultLogger +import net.mamoe.mirai.utils.minutesToMillis import java.io.PrintStream /** @@ -56,6 +59,16 @@ object MiraiConsolePureLoader { } } +internal object ConsoleDataHolder : AutoSavePluginDataHolder, + CoroutineScope by MiraiConsole.childScope("ConsoleDataHolder") { + @ConsoleExperimentalAPI + override val autoSaveIntervalMillis: LongRange = 1.minutesToMillis..10.minutesToMillis + + @ConsoleExperimentalAPI + override val dataHolderName: String + get() = "Pure" +} + internal fun overrideSTD() { System.setOut( PrintStream(