RFR: 8341418: Prism/es2 DrawableInfo is never freed (leak)
Thiago Milczarek Sayao
tsayao at openjdk.org
Sun Oct 6 19:15:40 UTC 2024
On Sun, 6 Oct 2024 12:03:02 GMT, Michael Strauß <mstrauss at openjdk.org> wrote:
>> When creating a Scene, a `DrawableInfo` is allocated with `malloc`. When scene changes, this is called on `WindowStage.java`:
>>
>> `QuantumRenderer.getInstance().disposePresentable(painter.presentable); // latched on RT`
>>
>> But the underlying `DrawableInfo` is never freed.
>>
>> I also think this should be done when the Stage is closed.
>>
>> To test:
>>
>> import javafx.animation.Animation;
>> import javafx.animation.KeyFrame;
>> import javafx.animation.KeyValue;
>> import javafx.animation.Timeline;
>> import javafx.application.Application;
>> import javafx.scene.Scene;
>> import javafx.scene.control.TextField;
>> import javafx.scene.control.Label;
>> import javafx.scene.layout.Pane;
>> import javafx.scene.layout.StackPane;
>> import javafx.scene.layout.VBox;
>> import javafx.scene.paint.Color;
>> import javafx.stage.Stage;
>> import javafx.util.Duration;
>>
>> public class TestScenes extends Application {
>>
>> @Override
>> public void start(Stage stage) {
>> Timeline timeline = new Timeline(
>> new KeyFrame(Duration.millis(100), e -> stage.setScene(createScene("Scene 1", Color.RED))),
>> new KeyFrame(Duration.millis(200), e -> stage.setScene(createScene("Scene 2", Color.BLUE))),
>> new KeyFrame(Duration.millis(300), e -> stage.setScene(createScene("Scene 3", Color.GREEN)))
>> );
>>
>> timeline.setCycleCount(Animation.INDEFINITE);
>> timeline.play();
>>
>> stage.show();
>> }
>>
>> private Scene createScene(String text, Color color) {
>> return new Scene(new StackPane(), 400, 300, color);
>> }
>>
>> public static void main(String[] args) {
>> launch(TestScenes.class, args);
>> }
>> }
>
> modules/javafx.graphics/src/main/java/com/sun/prism/es2/ES2SwapChain.java line 193:
>
>> 191: @Override
>> 192: public ES2Graphics createGraphics() {
>> 193: if (drawable == null || drawable.getNativeWindow() != pState.getNativeWindow()) {
>
> The null check wasn't here before, and it doesn't seem necessary as `createGLDrawable()` does not return `null`.
But drawable can now be disposed and set to null. If that happens and `createGraphics` is called again it will end in a NPE.
-------------
PR Review Comment: https://git.openjdk.org/jfx/pull/1586#discussion_r1789213796
More information about the openjfx-dev
mailing list