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