Skip to content

Commit 61ea44a

Browse files
committed
track model usage, and only dispose when not used
1 parent 2f253eb commit 61ea44a

File tree

3 files changed

+47
-6
lines changed

3 files changed

+47
-6
lines changed

src/Editor/Editor.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import MonacoContainer from '../MonacoContainer';
66
import useMount from '../hooks/useMount';
77
import useUpdate from '../hooks/useUpdate';
88
import usePrevious from '../hooks/usePrevious';
9-
import { noop, getOrCreateModel, isUndefined } from '../utils';
9+
import { noop, getOrCreateModel, isUndefined, disposeModel } from '../utils';
1010

1111
const viewStates = new Map();
1212

@@ -69,6 +69,9 @@ function Editor({
6969

7070
if (model !== editorRef.current.getModel()) {
7171
saveViewState && viewStates.set(previousPath, editorRef.current.saveViewState());
72+
if (!keepCurrentModel) {
73+
disposeModel(editorRef.current.getModel())
74+
}
7275
editorRef.current.setModel(model);
7376
saveViewState && editorRef.current.restoreViewState(viewStates.get(path));
7477
}
@@ -201,7 +204,7 @@ function Editor({
201204
if (keepCurrentModel) {
202205
saveViewState && viewStates.set(path, editorRef.current.saveViewState());
203206
} else {
204-
editorRef.current.getModel()?.dispose();
207+
disposeModel(editorRef.current.getModel());
205208
}
206209

207210
editorRef.current.dispose();

src/utils/index.js

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,19 @@
1+
import { decrementModelUsage, incrementModelUsage, shouldDisposeModel } from "./track-model-usage";
2+
13
function noop() {}
24

35
function getOrCreateModel(monaco, value, language, path) {
4-
return getModel(monaco, path) || createModel(monaco, value, language, path);
6+
const uri = path && createModelUri(monaco, path);
7+
const model = getModel(monaco, uri) || createModel(monaco, value, language, uri);
8+
incrementModelUsage(model);
9+
10+
return model;
511
}
612

7-
function getModel(monaco, path) {
13+
function getModel(monaco, uri) {
814
return monaco
915
.editor
10-
.getModel(createModelUri(monaco, path));
16+
.getModel(uri);
1117
}
1218

1319
function createModel(monaco, value, language, path) {
@@ -24,4 +30,14 @@ function isUndefined(input) {
2430
return input === undefined;
2531
}
2632

27-
export { noop, getOrCreateModel, isUndefined };
33+
function disposeModel(model) {
34+
if (!model) {
35+
return;
36+
}
37+
decrementModelUsage(model);
38+
if (shouldDisposeModel(model)) {
39+
model.dispose();
40+
}
41+
}
42+
43+
export { noop, getOrCreateModel, isUndefined, disposeModel };

src/utils/track-model-usage.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
2+
const modelUsage = {};
3+
4+
function decrementModelUsage(model) {
5+
if (modelUsage[model.uri]) {
6+
modelUsage[model.uri] -= 1;
7+
}
8+
}
9+
10+
function incrementModelUsage(model) {
11+
const uri = model.uri;
12+
if (modelUsage[uri] == null) {
13+
modelUsage[uri] = 0;
14+
}
15+
modelUsage[uri] = modelUsage[uri] + 1;
16+
}
17+
18+
function shouldDisposeModel(model) {
19+
return !modelUsage[model.uri] == null;
20+
}
21+
22+
export { decrementModelUsage, incrementModelUsage, shouldDisposeModel };

0 commit comments

Comments
 (0)