Skip to content

Commit ad43ef9

Browse files
committed
[GR-32219] Fix delay configuration of engine logger cache until engine is created.
PullRequest: graal/9522
2 parents cd2f54b + e4b4f63 commit ad43ef9

File tree

6 files changed

+89
-73
lines changed

6 files changed

+89
-73
lines changed

truffle/src/com.oracle.truffle.api/src/com/oracle/truffle/api/LanguageAccessor.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
import com.oracle.truffle.api.TruffleLanguage.ContextLocalFactory;
6363
import com.oracle.truffle.api.TruffleLanguage.ContextThreadLocalFactory;
6464
import com.oracle.truffle.api.TruffleLanguage.Env;
65+
import com.oracle.truffle.api.TruffleLogger.LoggerCache;
6566
import com.oracle.truffle.api.frame.Frame;
6667
import com.oracle.truffle.api.frame.MaterializedFrame;
6768
import com.oracle.truffle.api.impl.Accessor;
@@ -519,12 +520,12 @@ public Charset detectEncoding(TruffleFile file, String mimeType) {
519520
}
520521

521522
@Override
522-
public void configureLoggers(Object polyglotContext, Map<String, Level> logLevels, Object... loggers) {
523+
public void configureLoggers(Object vmObject, Map<String, Level> logLevels, Object... loggers) {
523524
for (Object loggerCache : loggers) {
524525
if (logLevels == null) {
525-
((TruffleLogger.LoggerCache) loggerCache).removeLogLevelsForContext(polyglotContext);
526+
((TruffleLogger.LoggerCache) loggerCache).removeLogLevelsForVMObject(vmObject);
526527
} else {
527-
((TruffleLogger.LoggerCache) loggerCache).addLogLevelsForContext(polyglotContext, logLevels);
528+
((TruffleLogger.LoggerCache) loggerCache).addLogLevelsForVMObject(vmObject, logLevels);
528529
}
529530
}
530531
}
@@ -572,8 +573,8 @@ public Object getDefaultLoggers() {
572573
}
573574

574575
@Override
575-
public Object createEngineLoggers(Object spi, Map<String, Level> logLevels) {
576-
return TruffleLogger.createLoggerCache(spi, logLevels);
576+
public Object createEngineLoggers(Object spi) {
577+
return new LoggerCache(spi);
577578
}
578579

579580
@Override
@@ -591,6 +592,11 @@ public TruffleLogger getLogger(String id, String loggerName, Object loggers) {
591592
return TruffleLogger.getLogger(id, loggerName, (TruffleLogger.LoggerCache) loggers);
592593
}
593594

595+
@Override
596+
public Object getLoggerCache(TruffleLogger logger) {
597+
return logger.getLoggerCache();
598+
}
599+
594600
@Override
595601
public FileSystem getFileSystem(TruffleFile truffleFile) {
596602
return truffleFile.getSPIFileSystem();

truffle/src/com.oracle.truffle.api/src/com/oracle/truffle/api/TruffleLogger.java

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -159,14 +159,8 @@ static TruffleLogger getLogger(String id, String loggerName, LoggerCache loggerC
159159
return loggerCache.getOrCreateLogger(id, loggerName);
160160
}
161161

162-
static LoggerCache createLoggerCache(Object loggerCache, Map<String, Level> logLevels) {
163-
LoggerCache cache = new LoggerCache(loggerCache);
164-
if (!logLevels.isEmpty()) {
165-
Object vmObject = LanguageAccessor.engineAccess().getLoggerOwner(loggerCache);
166-
assert vmObject != null;
167-
cache.addLogLevelsForContext(vmObject, logLevels);
168-
}
169-
return cache;
162+
LoggerCache getLoggerCache() {
163+
return this.loggerCache;
170164
}
171165

172166
/**
@@ -964,7 +958,7 @@ static final class LoggerCache {
964958
private Map<String, Level> effectiveLevels;
965959
private volatile Set<String> knownIds;
966960

967-
private LoggerCache(Object loggerCacheSpi) {
961+
LoggerCache(Object loggerCacheSpi) {
968962
Objects.requireNonNull(loggerCacheSpi);
969963
this.loggerCache = loggerCacheSpi;
970964
this.polyglotRootLogger = new TruffleLogger(this);
@@ -975,14 +969,14 @@ private LoggerCache(Object loggerCacheSpi) {
975969
this.effectiveLevels = Collections.emptyMap();
976970
}
977971

978-
synchronized void addLogLevelsForContext(final Object spi, final Map<String, Level> addedLevels) {
979-
activeContexts.add(new ContextWeakReference(spi, contextsRefQueue, addedLevels));
972+
synchronized void addLogLevelsForVMObject(final Object vmObject, final Map<String, Level> addedLevels) {
973+
activeContexts.add(new ContextWeakReference(vmObject, contextsRefQueue, addedLevels));
980974
final Set<String> toRemove = collectRemovedLevels();
981975
reconfigure(addedLevels, toRemove);
982976
}
983977

984-
synchronized void removeLogLevelsForContext(final Object context) {
985-
Set<String> toRemove = removeContext(context);
978+
synchronized void removeLogLevelsForVMObject(final Object vmObject) {
979+
Set<String> toRemove = removeContext(vmObject);
986980
reconfigure(Collections.emptyMap(), toRemove);
987981
}
988982

truffle/src/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/Accessor.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -715,14 +715,16 @@ public abstract Env createEnv(Object polyglotLanguageContext, TruffleLanguage<?>
715715

716716
public abstract Object getDefaultLoggers();
717717

718-
public abstract Object createEngineLoggers(Object spi, Map<String, Level> logLevels);
718+
public abstract Object createEngineLoggers(Object spi);
719719

720720
public abstract Object getLoggersSPI(Object loggerCache);
721721

722722
public abstract void closeEngineLoggers(Object loggers);
723723

724724
public abstract TruffleLogger getLogger(String id, String loggerName, Object loggers);
725725

726+
public abstract Object getLoggerCache(TruffleLogger logger);
727+
726728
public abstract TruffleLanguage<?> getLanguage(Env env);
727729

728730
public abstract Object createFileSystemContext(Object engineObject, FileSystem fileSystem);
@@ -764,6 +766,7 @@ public abstract Env createEnv(Object polyglotLanguageContext, TruffleLanguage<?>
764766
public abstract boolean isSideEffectingTLAction(ThreadLocalAction action);
765767

766768
public abstract void performTLAction(ThreadLocalAction action, ThreadLocalAction.Access access);
769+
767770
}
768771

769772
public abstract static class InstrumentSupport extends Support {

truffle/src/com.oracle.truffle.polyglot/src/com/oracle/truffle/polyglot/PolyglotContextImpl.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2601,7 +2601,10 @@ Object getOrCreateContextLoggers() {
26012601
synchronized (this) {
26022602
res = contextBoundLoggers;
26032603
if (res == null) {
2604-
res = LANGUAGE.createEngineLoggers(PolyglotLoggers.LoggerCache.newContextLoggerCache(this), config.logLevels);
2604+
res = LANGUAGE.createEngineLoggers(PolyglotLoggers.LoggerCache.newContextLoggerCache(this));
2605+
if (!this.config.logLevels.isEmpty()) {
2606+
EngineAccessor.LANGUAGE.configureLoggers(this, this.config.logLevels, res);
2607+
}
26052608
contextBoundLoggers = res;
26062609
}
26072610
}

truffle/src/com.oracle.truffle.polyglot/src/com/oracle/truffle/polyglot/PolyglotEngineImpl.java

Lines changed: 34 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@
127127
import com.oracle.truffle.polyglot.PolyglotLocals.AbstractContextThreadLocal;
128128
import com.oracle.truffle.polyglot.PolyglotLocals.LocalLocation;
129129
import com.oracle.truffle.polyglot.PolyglotLoggers.EngineLoggerProvider;
130+
import com.oracle.truffle.polyglot.PolyglotLoggers.LoggerCache;
130131

131132
final class PolyglotEngineImpl implements com.oracle.truffle.polyglot.PolyglotImpl.VMObject {
132133

@@ -255,7 +256,6 @@ final class PolyglotEngineImpl implements com.oracle.truffle.polyglot.PolyglotIm
255256
Map<String, InstrumentInfo> instrumentInfos = new LinkedHashMap<>();
256257
this.idToInstrument = Collections.unmodifiableMap(initializeInstruments(instrumentInfos));
257258
this.idToInternalInstrumentInfo = Collections.unmodifiableMap(instrumentInfos);
258-
engineLogger.setEngine(this);
259259
this.runtimeData = RUNTIME.createRuntimeData(engineOptions, engineLogger);
260260

261261
this.classToLanguage = new HashMap<>();
@@ -476,13 +476,45 @@ TruffleLogger getEngineLogger() {
476476
synchronized (this.lock) {
477477
result = this.engineLogger;
478478
if (result == null) {
479-
this.engineLogger = result = this.engineLoggerSupplier.apply(OPTION_GROUP_ENGINE);
479+
result = this.engineLoggerSupplier.apply(OPTION_GROUP_ENGINE);
480+
Object logger = EngineAccessor.LANGUAGE.getLoggerCache(result);
481+
LoggerCache loggerCache = (LoggerCache) EngineAccessor.LANGUAGE.getLoggersSPI(logger);
482+
loggerCache.setOwner(this);
483+
if (!logLevels.isEmpty()) {
484+
EngineAccessor.LANGUAGE.configureLoggers(this, logLevels, logger);
485+
}
486+
this.engineLogger = result;
480487
}
481488
}
482489
}
483490
return result;
484491
}
485492

493+
Object getOrCreateEngineLoggers() {
494+
Object res = engineLoggers;
495+
if (res == null) {
496+
synchronized (this.lock) {
497+
res = engineLoggers;
498+
if (res == null) {
499+
LoggerCache loggerCache = PolyglotLoggers.LoggerCache.newEngineLoggerCache(this);
500+
loggerCache.setOwner(this);
501+
res = LANGUAGE.createEngineLoggers(loggerCache);
502+
if (!logLevels.isEmpty()) {
503+
EngineAccessor.LANGUAGE.configureLoggers(this, logLevels, res);
504+
}
505+
for (ContextWeakReference contextRef : contexts) {
506+
PolyglotContextImpl context = contextRef.get();
507+
if (context != null && !context.config.logLevels.isEmpty()) {
508+
LANGUAGE.configureLoggers(context, context.config.logLevels, res);
509+
}
510+
}
511+
engineLoggers = res;
512+
}
513+
}
514+
}
515+
return res;
516+
}
517+
486518
static OptionDescriptors createEngineOptionDescriptors() {
487519
OptionDescriptors engineOptionDescriptors = new PolyglotEngineOptionsOptionDescriptors();
488520
OptionDescriptors compilerOptionDescriptors = EngineAccessor.RUNTIME.getEngineOptionDescriptors();
@@ -521,7 +553,6 @@ void patch(DispatchOutputStream newOut,
521553
this.storeEngine = RUNTIME.isStoreEnabled(engineOptions);
522554
this.engineLoggerSupplier = logSupplier;
523555
this.engineLogger = null;
524-
logSupplier.setEngine(this);
525556

526557
intitializeStore(wasStore, storeEngine);
527558

@@ -1746,26 +1777,6 @@ OptionValuesImpl getEngineOptionValues() {
17461777
return engineOptionValues;
17471778
}
17481779

1749-
Object getOrCreateEngineLoggers() {
1750-
Object res = engineLoggers;
1751-
if (res == null) {
1752-
synchronized (this.lock) {
1753-
res = engineLoggers;
1754-
if (res == null) {
1755-
res = LANGUAGE.createEngineLoggers(PolyglotLoggers.LoggerCache.newEngineLoggerCache(this), logLevels);
1756-
for (ContextWeakReference contextRef : contexts) {
1757-
PolyglotContextImpl context = contextRef.get();
1758-
if (context != null && !context.config.logLevels.isEmpty()) {
1759-
LANGUAGE.configureLoggers(context, context.config.logLevels, res);
1760-
}
1761-
}
1762-
engineLoggers = res;
1763-
}
1764-
}
1765-
}
1766-
return res;
1767-
}
1768-
17691780
Object getEngineLoggers() {
17701781
return engineLoggers;
17711782
}

truffle/src/com.oracle.truffle.polyglot/src/com/oracle/truffle/polyglot/PolyglotLoggers.java

Lines changed: 29 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,7 @@
4040
*/
4141
package com.oracle.truffle.polyglot;
4242

43-
import com.oracle.truffle.api.TruffleLogger;
44-
import com.oracle.truffle.api.interop.InteropLibrary;
45-
import com.oracle.truffle.api.interop.UnsupportedMessageException;
46-
import com.oracle.truffle.polyglot.PolyglotImpl.VMObject;
43+
import static com.oracle.truffle.api.CompilerDirectives.shouldNotReachHere;
4744

4845
import java.io.FileOutputStream;
4946
import java.io.IOException;
@@ -68,7 +65,10 @@
6865
import java.util.logging.LogRecord;
6966
import java.util.logging.StreamHandler;
7067

71-
import static com.oracle.truffle.api.CompilerDirectives.shouldNotReachHere;
68+
import com.oracle.truffle.api.TruffleLogger;
69+
import com.oracle.truffle.api.interop.InteropLibrary;
70+
import com.oracle.truffle.api.interop.UnsupportedMessageException;
71+
import com.oracle.truffle.polyglot.PolyglotImpl.VMObject;
7272

7373
final class PolyglotLoggers {
7474

@@ -193,21 +193,20 @@ static boolean isDefaultHandler(Handler handler) {
193193

194194
static final class LoggerCache {
195195

196-
static final LoggerCache DEFAULT = new LoggerCache(PolyglotLogHandler.INSTANCE, null, true, null, Collections.emptySet());
196+
static final LoggerCache DEFAULT = new LoggerCache(PolyglotLogHandler.INSTANCE, true, null, Collections.emptySet());
197197

198198
private final Handler handler;
199199
private final boolean useCurrentContext;
200200
private final Map<String, Level> ownerLogLevels;
201201
private final Set<String> rawLoggerIds;
202202
private final Set<Level> implicitLevels;
203-
private final WeakReference<VMObject> ownerRef;
203+
private volatile WeakReference<VMObject> ownerRef;
204204

205-
private LoggerCache(Handler handler, VMObject owner, boolean useCurrentContext, Map<String, Level> ownerLogLevels,
205+
private LoggerCache(Handler handler, boolean useCurrentContext, Map<String, Level> ownerLogLevels,
206206
Set<String> rawLoggerIds, Level... implicitLevels) {
207207
Objects.requireNonNull(handler);
208208
this.handler = handler;
209209
this.useCurrentContext = useCurrentContext;
210-
this.ownerRef = owner == null ? null : new WeakReference<>(owner);
211210
this.ownerLogLevels = ownerLogLevels;
212211
this.rawLoggerIds = rawLoggerIds;
213212
if (implicitLevels.length == 0) {
@@ -218,17 +217,27 @@ private LoggerCache(Handler handler, VMObject owner, boolean useCurrentContext,
218217
}
219218
}
220219

220+
void setOwner(VMObject owner) {
221+
if (ownerRef != null) {
222+
throw new IllegalStateException("owner can only be set once");
223+
}
224+
ownerRef = new WeakReference<>(owner);
225+
}
226+
221227
static LoggerCache newEngineLoggerCache(PolyglotEngineImpl engine) {
222-
return newEngineLoggerCache(new PolyglotLogHandler(engine), engine, true, Collections.emptySet());
228+
return newEngineLoggerCache(new PolyglotLogHandler(engine.logHandler), engine.logLevels, true, Collections.emptySet());
223229
}
224230

225-
static LoggerCache newEngineLoggerCache(Handler handler, PolyglotEngineImpl engine, boolean useCurrentContext,
231+
static LoggerCache newEngineLoggerCache(Handler handler, Map<String, Level> logLevels, boolean useCurrentContext,
226232
Set<String> rawLoggerIds, Level... implicitLevels) {
227-
return new LoggerCache(handler, Objects.requireNonNull(engine), useCurrentContext, engine.logLevels, rawLoggerIds, implicitLevels);
233+
return new LoggerCache(handler, useCurrentContext, logLevels, rawLoggerIds, implicitLevels);
228234
}
229235

230236
static LoggerCache newContextLoggerCache(PolyglotContextImpl context) {
231-
return new LoggerCache(new ContextLogHandler(context), Objects.requireNonNull(context), false, context.config.logLevels, Collections.emptySet());
237+
Objects.requireNonNull(context);
238+
LoggerCache cache = new LoggerCache(new ContextLogHandler(context), false, context.config.logLevels, Collections.emptySet());
239+
cache.setOwner(context);
240+
return cache;
232241
}
233242

234243
public VMObject getOwner() {
@@ -247,7 +256,9 @@ public Map<String, Level> getLogLevels() {
247256
}
248257
}
249258
if (ownerLogLevels != null) {
250-
if (getOwner() == null) {
259+
if (ownerRef != null && ownerRef.get() == null) {
260+
// if the owner was initialized and owner was collected we shared the truffle
261+
// logger too far.
251262
throw ContextLogHandler.invalidSharing();
252263
}
253264
return ownerLogLevels;
@@ -278,8 +289,8 @@ private static final class PolyglotLogHandler extends Handler {
278289
this.fallBackHandler = null;
279290
}
280291

281-
PolyglotLogHandler(PolyglotEngineImpl engine) {
282-
fallBackHandler = engine.logHandler;
292+
PolyglotLogHandler(Handler fallbackHandler) {
293+
this.fallBackHandler = fallbackHandler;
283294
}
284295

285296
@Override
@@ -576,7 +587,6 @@ private static String possibleSimpleName(final String loggerName) {
576587
static final class EngineLoggerProvider implements Function<String, TruffleLogger> {
577588

578589
private volatile Object loggers;
579-
private volatile PolyglotEngineImpl engine;
580590
private final Handler logHandler;
581591
private final Map<String, Level> logLevels;
582592

@@ -592,26 +602,15 @@ public TruffleLogger apply(String loggerId) {
592602
synchronized (this) {
593603
loggersCache = loggers;
594604
if (loggersCache == null) {
595-
LoggerCache spi;
596-
Map<String, Level> levels;
597-
if (engine == null) {
598-
throw new IllegalStateException("Engine must be set.");
599-
}
600605
Handler useHandler = resolveHandler(logHandler);
601-
spi = LoggerCache.newEngineLoggerCache(useHandler, engine, false, Collections.singleton(GRAAL_COMPILER_LOG_ID), Level.INFO);
602-
levels = logLevels;
603-
loggersCache = EngineAccessor.LANGUAGE.createEngineLoggers(spi, levels);
604-
loggers = loggersCache;
606+
LoggerCache spi = LoggerCache.newEngineLoggerCache(useHandler, logLevels, false, Collections.singleton(GRAAL_COMPILER_LOG_ID), Level.INFO);
607+
loggers = loggersCache = EngineAccessor.LANGUAGE.createEngineLoggers(spi);
605608
}
606609
}
607610
}
608611
return EngineAccessor.LANGUAGE.getLogger(loggerId, null, loggersCache);
609612
}
610613

611-
void setEngine(PolyglotEngineImpl engine) {
612-
this.engine = engine;
613-
}
614-
615614
private static Handler resolveHandler(Handler handler) {
616615
if (isDefaultHandler(handler)) {
617616
return handler;

0 commit comments

Comments
 (0)