From 26ea9a48f63b72d72982aac1b3f86e6169307041 Mon Sep 17 00:00:00 2001 From: Edwin Jakobs Date: Sat, 8 Feb 2020 13:55:10 +0100 Subject: [PATCH] Add threaded script loading to orx-olive --- orx-olive/src/main/kotlin/Olive.kt | 36 ++++++++++++++----- ...tLoader.kt => ScriptObjectLoaderJSR233.kt} | 12 ++++++- 2 files changed, 39 insertions(+), 9 deletions(-) rename orx-olive/src/main/kotlin/{ScriptObjectLoader.kt => ScriptObjectLoaderJSR233.kt} (83%) diff --git a/orx-olive/src/main/kotlin/Olive.kt b/orx-olive/src/main/kotlin/Olive.kt index 79a8d978..a39eb50d 100644 --- a/orx-olive/src/main/kotlin/Olive.kt +++ b/orx-olive/src/main/kotlin/Olive.kt @@ -1,14 +1,21 @@ package org.openrndr.extra.olive +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.async +import mu.KotlinLogging import org.openrndr.Extension import org.openrndr.Program import org.openrndr.draw.Session import org.openrndr.events.Event +import org.openrndr.launch import org.operndr.extras.filewatcher.stop import org.operndr.extras.filewatcher.triggerChange import org.operndr.extras.filewatcher.watchFile import java.io.File +private val logger = KotlinLogging.logger {} + + private fun Event.saveListeners(store: MutableMap, List<(Any) -> Unit>>) { @Suppress("UNCHECKED_CAST") store[this] = listeners.map { it } as List<(Any) -> Unit> @@ -89,17 +96,30 @@ class Olive

(val resources: Resources? = null) : Extension { watcher = program.watchFile(File(script)) { try { - val func = loadFromScriptUnit>(it) + val futureFunc = GlobalScope.async { + val start = System.currentTimeMillis() + val f = loadFromScript Unit>(it) + val end = System.currentTimeMillis() + logger.info { "loading script took ${end - start}ms" } + f + } - program.extensions.clear() - program.extensions.addAll(originalExtensions) + program.launch { + val func = futureFunc.await() + program.extensions.clear() + program.extensions.addAll(originalExtensions) - trackedListeners.forEach { l -> l.restoreListeners(store) } - session?.end() - session = Session.root.fork() + trackedListeners.forEach { l -> l.restoreListeners(store) } + session?.end() + session = Session.root.fork() + + @Suppress("UNCHECKED_CAST") + func(program as P) + + Unit + } + Unit - @Suppress("UNCHECKED_CAST") - func(program as P) } catch (e: Throwable) { e.printStackTrace() } diff --git a/orx-olive/src/main/kotlin/ScriptObjectLoader.kt b/orx-olive/src/main/kotlin/ScriptObjectLoaderJSR233.kt similarity index 83% rename from orx-olive/src/main/kotlin/ScriptObjectLoader.kt rename to orx-olive/src/main/kotlin/ScriptObjectLoaderJSR233.kt index 1612e0ca..f260c98a 100644 --- a/orx-olive/src/main/kotlin/ScriptObjectLoader.kt +++ b/orx-olive/src/main/kotlin/ScriptObjectLoaderJSR233.kt @@ -1,5 +1,6 @@ package org.openrndr.extra.olive +import mu.KotlinLogging import java.io.File import java.io.InputStream import java.io.Reader @@ -7,10 +8,18 @@ import java.net.MalformedURLException import java.net.URL import javax.script.ScriptEngineManager +private val logger = KotlinLogging.logger {} + class LoadException(message: String? = null, cause: Throwable? = null) : RuntimeException(message, cause) class ScriptObjectLoader(classLoader: ClassLoader? = Thread.currentThread().contextClassLoader) { - val engine = ScriptEngineManager(classLoader).getEngineByExtension("kts") + val engine = run { + val start = System.currentTimeMillis() + val engine = ScriptEngineManager(classLoader).getEngineByExtension("kts") + val end = System.currentTimeMillis() + logger.info { "creating scripting engine took ${end-start}ms" } + engine + } init { require(engine != null) { "could not create scripting engine" } @@ -34,6 +43,7 @@ class ScriptObjectLoader(classLoader: ClassLoader? = Thread.currentThread().cont inline fun loadAll(vararg inputStream: InputStream): List = inputStream.map(::load) } + /** * Load an object from script. */