Skip to content

Commit b36b92b

Browse files
UOE from ModelAccessNoLimit.runWriteAction due to stale FileDataSource listeners of modules still registered with ModuleLoader's repository
1 parent 683f3c5 commit b36b92b

File tree

6 files changed

+337
-196
lines changed

6 files changed

+337
-196
lines changed

plugins/mps-build/languages/build.mps/source_gen.caches/jetbrains/mps/build/mps/util/dependencies

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@
173173
<classNode dependClassName="java.lang.UnsupportedOperationException" />
174174
<classNode dependClassName="java.util.ArrayList" />
175175
<classNode dependClassName="java.util.HashMap" />
176+
<classNode dependClassName="java.util.List" />
176177
<classNode dependClassName="java.util.Map" />
177178
<classNode dependClassName="java.util.Objects" />
178179
<classNode dependClassName="jetbrains.mps.build.behavior.BuildSourcePath__BehaviorDescriptor" />
@@ -181,11 +182,13 @@
181182
<classNode dependClassName="jetbrains.mps.build.mps.util.PathConverter" />
182183
<classNode dependClassName="jetbrains.mps.build.mps.util.VisibleModules" />
183184
<classNode dependClassName="jetbrains.mps.build.util.Context" />
185+
<classNode dependClassName="jetbrains.mps.extapi.module.SModuleBase" />
184186
<classNode dependClassName="jetbrains.mps.extapi.module.SRepositoryBase" />
185187
<classNode dependClassName="jetbrains.mps.extapi.module.SRepositoryExt" />
186188
<classNode dependClassName="jetbrains.mps.generator.template.TemplateQueryContext" />
187189
<classNode dependClassName="jetbrains.mps.internal.collections.runtime.IVisitor" />
188190
<classNode dependClassName="jetbrains.mps.internal.collections.runtime.IWhereFilter" />
191+
<classNode dependClassName="jetbrains.mps.internal.collections.runtime.ListSequence" />
189192
<classNode dependClassName="jetbrains.mps.internal.collections.runtime.Sequence" />
190193
<classNode dependClassName="jetbrains.mps.lang.smodel.generator.smodelAdapter.SLinkOperations" />
191194
<classNode dependClassName="jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations" />
@@ -202,6 +205,7 @@
202205
<classNode dependClassName="jetbrains.mps.smodel.MPSModuleOwner" />
203206
<classNode dependClassName="jetbrains.mps.smodel.ModuleRepositoryFacade" />
204207
<classNode dependClassName="jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory" />
208+
<classNode dependClassName="jetbrains.mps.util.IterableUtil" />
205209
<classNode dependClassName="jetbrains.mps.util.MacroHelper" />
206210
<classNode dependClassName="jetbrains.mps.vfs.FileSystem" />
207211
<classNode dependClassName="jetbrains.mps.vfs.IFile" />
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<?xml version="1.0" encoding="UTF-8"?>
2-
<product version="3" modelHash="coeljdt38uk7a6b10d23tttlq4l8z1h">
2+
<product version="3" modelHash="-42ewhpzdf120o23qxq5uyy5mwxa925">
33
<files names="ArtifactsRelativePathHelper.java:MPSModulesClosure.java:MPSModulesPartitioner.java:ModuleChecker.java:ModuleFinder.java:ModuleLoader.java:ModuleLoaderException.java:ModuleLoaderUtils.java:ModulePlugins.java:PathBuilder.java:PathConverter.java:RequiredPlugins.java:VisibleModules.java" />
44
</product>
55

plugins/mps-build/languages/build.mps/source_gen/jetbrains/mps/build/mps/util/ModuleChecker.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ public void check(ModuleChecker.CheckType type) {
118118
checkModule(type);
119119
}
120120
if (myRepository != null && myLoadedModule != null) {
121-
// XXX in case myMudyle is _Language, there' might be another _Generator that references it, and we need to keep module registered.
121+
// XXX in case myModule is _Language, there' might be another _Generator that references it, and we need to keep module registered.
122122
// Don't want to deal with different module kinds right now (i.e. can drop _Solution and _Generator here)
123123
myLoadedModule = null;
124124
}

plugins/mps-build/languages/build.mps/source_gen/jetbrains/mps/build/mps/util/ModuleLoader.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@
1919
import jetbrains.mps.internal.collections.runtime.Sequence;
2020
import jetbrains.mps.internal.collections.runtime.IWhereFilter;
2121
import jetbrains.mps.internal.collections.runtime.IVisitor;
22+
import java.util.List;
23+
import org.jetbrains.mps.openapi.module.SModule;
24+
import jetbrains.mps.util.IterableUtil;
25+
import jetbrains.mps.internal.collections.runtime.ListSequence;
26+
import jetbrains.mps.extapi.module.SModuleBase;
2227
import jetbrains.mps.build.behavior.BuildSourcePath__BehaviorDescriptor;
2328
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SPropertyOperations;
2429
import java.io.File;
@@ -34,7 +39,6 @@
3439
import org.jetbrains.mps.openapi.module.ModelAccess;
3540
import java.util.Map;
3641
import org.jetbrains.mps.openapi.module.SModuleId;
37-
import org.jetbrains.mps.openapi.module.SModule;
3842
import java.util.HashMap;
3943
import jetbrains.mps.smodel.MPSModuleOwner;
4044
import jetbrains.mps.project.AbstractModule;
@@ -98,7 +102,20 @@ public void visit(SNode it) {
98102
});
99103

100104
// XXX would be great to unregister all modules here, to dispose them explicitly, but as long as its our private repo, does it matter?
105+
// We have to dispose modules as their models/datasources attach e.g. file listeners that get notified long time after generation of a build project is over.
101106
// BEWARE, don't ever try to do myRepository.dispose(). MRF is CoreComponent AND singleton, dispose just makes subsequent MRF.getInstance() (yes, there are still few out there) to fail with NPE
107+
if (myRepository != null) {
108+
// MRF has distinction between 'true' repo and a global one it looks into at certain moments, beware to use proper one
109+
List<SModule> modules = IterableUtil.copyToList(myRepository.getRepository().getModules());
110+
for (SModule m : ListSequence.fromList(modules)) {
111+
// would be great to myRepository.unregisterModule(m) here, but there are 2 obstacles:
112+
// first, MRF doesn't use true repo; second, we need to know module owner which is internal class in ModuleChecker now
113+
// As I'm about to throw myRepository away, I don't care that much it is to hold information about disposed modules
114+
if (m instanceof SModuleBase) {
115+
((SModuleBase) m).dispose();
116+
}
117+
}
118+
}
102119
}
103120

104121
public ModuleChecker createModuleChecker(SNode module) {

0 commit comments

Comments
 (0)