diff --git a/truffle/src/com.oracle.truffle.polyglot/src/com/oracle/truffle/polyglot/PolyglotEngineImpl.java b/truffle/src/com.oracle.truffle.polyglot/src/com/oracle/truffle/polyglot/PolyglotEngineImpl.java index 29af364b69d9..e06a5071c905 100644 --- a/truffle/src/com.oracle.truffle.polyglot/src/com/oracle/truffle/polyglot/PolyglotEngineImpl.java +++ b/truffle/src/com.oracle.truffle.polyglot/src/com/oracle/truffle/polyglot/PolyglotEngineImpl.java @@ -1467,7 +1467,12 @@ void finalizeStore() { this.out = null; this.err = null; this.in = null; - this.logHandler = null; + /* + * Note: The 'logHandler' field must not be cleaned until the image persists to facilitate + * the detection and cleanup of all references to the 'logHandler' instance in the image + * heap. The cleanup process is handled by the 'AuxiliaryImageObjectReplacer' registered in + * the 'AuxiliaryEngineCacheSupport'. + */ AbstractHostLanguageService hostLanguageService = this.host; if (hostLanguageService != null) { hostLanguageService.release(); diff --git a/truffle/src/com.oracle.truffle.polyglot/src/com/oracle/truffle/polyglot/PolyglotLoggers.java b/truffle/src/com.oracle.truffle.polyglot/src/com/oracle/truffle/polyglot/PolyglotLoggers.java index 2d537c00b0bd..17879c4aa00e 100644 --- a/truffle/src/com.oracle.truffle.polyglot/src/com/oracle/truffle/polyglot/PolyglotLoggers.java +++ b/truffle/src/com.oracle.truffle.polyglot/src/com/oracle/truffle/polyglot/PolyglotLoggers.java @@ -136,7 +136,6 @@ static LogHandler asLogHandler(Object logHandlerOrStream) { /** * Creates a default {@link Handler} for an engine when a {@link Handler} was not specified. * - * @param polyglot the polyglot owning the handler * @param out the {@link OutputStream} to print log messages into * @param sandboxPolicy the engine's sandbox policy */ @@ -230,7 +229,7 @@ void setOwner(VMObject owner) { } static LoggerCache newEngineLoggerCache(PolyglotEngineImpl engine) { - return newEngineLoggerCache(new PolyglotLogHandler(engine.logHandler), engine.logLevels, true, Collections.emptySet()); + return newEngineLoggerCache(new PolyglotLogHandler(engine), engine.logLevels, true, Collections.emptySet()); } static LoggerCache newEngineLoggerCache(LogHandler handler, Map logLevels, boolean useCurrentContext, @@ -554,21 +553,22 @@ private static final class PolyglotLogHandler extends LogHandler { private static final LogHandler INSTANCE = new PolyglotLogHandler(); - private final LogHandler fallBackHandler; + private final WeakReference engineRef; PolyglotLogHandler() { - this.fallBackHandler = null; + this.engineRef = null; } - PolyglotLogHandler(LogHandler fallbackHandler) { - this.fallBackHandler = fallbackHandler; + PolyglotLogHandler(PolyglotEngineImpl engine) { + this.engineRef = new WeakReference<>(engine); } @Override public void publish(final LogRecord record) { LogHandler handler = findDelegate(); if (handler == null) { - handler = fallBackHandler; + PolyglotEngineImpl engine = engineRef != null ? engineRef.get() : null; + handler = engine != null ? engine.logHandler : null; } if (handler != null) { handler.publish(record); diff --git a/truffle/src/com.oracle.truffle.runtime/src/com/oracle/truffle/runtime/EngineData.java b/truffle/src/com.oracle.truffle.runtime/src/com/oracle/truffle/runtime/EngineData.java index bacdcc57a3a1..e406919c626d 100644 --- a/truffle/src/com.oracle.truffle.runtime/src/com/oracle/truffle/runtime/EngineData.java +++ b/truffle/src/com.oracle.truffle.runtime/src/com/oracle/truffle/runtime/EngineData.java @@ -200,6 +200,10 @@ public Object getEngineLock() { return OptimizedRuntimeAccessor.ENGINE.getEngineLock(this.polyglotEngine); } + public Object getEngineLogHandler() { + return OptimizedRuntimeAccessor.ENGINE.getEngineLogHandler(this.polyglotEngine); + } + @SuppressWarnings("unchecked") public T getEngineLocal(Class symbol) { Map, Object> data = this.engineLocals;