From eba184ec6947b998170e3784e2ebeb5bbb1f9180 Mon Sep 17 00:00:00 2001 From: Florian Hotze Date: Wed, 2 Oct 2024 22:53:49 +0200 Subject: [PATCH] [jsscripting] Synchronize context access in logger initialization (#17496) * [jsscripting] Synchronize context access in logger initialisation to avoid illegal multi-thread access Fixes #17494. Signed-off-by: Florian Hotze --- .../internal/DebuggingGraalScriptEngine.java | 17 +++++++-- .../internal/OpenhabGraalJSScriptEngine.java | 35 ++++++++++++++++++- 2 files changed, 48 insertions(+), 4 deletions(-) diff --git a/bundles/org.openhab.automation.jsscripting/src/main/java/org/openhab/automation/jsscripting/internal/DebuggingGraalScriptEngine.java b/bundles/org.openhab.automation.jsscripting/src/main/java/org/openhab/automation/jsscripting/internal/DebuggingGraalScriptEngine.java index 76f1afb2dd5..8c71899a688 100644 --- a/bundles/org.openhab.automation.jsscripting/src/main/java/org/openhab/automation/jsscripting/internal/DebuggingGraalScriptEngine.java +++ b/bundles/org.openhab.automation.jsscripting/src/main/java/org/openhab/automation/jsscripting/internal/DebuggingGraalScriptEngine.java @@ -15,6 +15,7 @@ package org.openhab.automation.jsscripting.internal; import static org.openhab.core.automation.module.script.ScriptTransformationService.OPENHAB_TRANSFORMATION_SCRIPT; import java.util.Arrays; +import java.util.concurrent.locks.Lock; import java.util.stream.Collectors; import javax.script.Compilable; @@ -34,7 +35,7 @@ import org.slf4j.LoggerFactory; * @author Jonathan Gilbert - Initial contribution * @author Florian Hotze - Improve logger name, Fix memory leak caused by exception logging */ -class DebuggingGraalScriptEngine +class DebuggingGraalScriptEngine extends InvocationInterceptingScriptEngineWithInvocableAndCompilableAndAutoCloseable { private static final int STACK_TRACE_LENGTH = 5; @@ -48,8 +49,18 @@ class DebuggingGraalScriptEngine { + extends InvocationInterceptingScriptEngineWithInvocableAndCompilableAndAutoCloseable + implements Lock { private static final Logger LOGGER = LoggerFactory.getLogger(OpenhabGraalJSScriptEngine.class); private static final Source GLOBAL_SOURCE; @@ -346,4 +349,34 @@ public class OpenhabGraalJSScriptEngine return new InputStreamReader(ioStream); } + + @Override + public void lock() { + lock.lock(); + } + + @Override + public void lockInterruptibly() throws InterruptedException { + lock.lockInterruptibly(); + } + + @Override + public boolean tryLock() { + return lock.tryLock(); + } + + @Override + public boolean tryLock(long l, TimeUnit timeUnit) throws InterruptedException { + return lock.tryLock(l, timeUnit); + } + + @Override + public void unlock() { + lock.unlock(); + } + + @Override + public Condition newCondition() { + return lock.newCondition(); + } }