)]}'
{
  "commit": "abacb7417205339cd75ad09e55b8e6063a983ec0",
  "tree": "93d8d2a2f80f7f2b1b6e169a634657c5cb40d937",
  "parents": [
    "8a756b221888d4d63892d5aa90a6eca884ef5393"
  ],
  "author": {
    "name": "John McDole",
    "email": "codefu@google.com",
    "time": "Tue Sep 29 15:59:57 2026 -0700"
  },
  "committer": {
    "name": "John McDole",
    "email": "codefu@google.com",
    "time": "Thu Oct 01 20:06:54 2026 -0700"
  },
  "message": "[Linux] Synchronize multi-window renderer lifetime across GTK and raster threads\n\nWhen destroying an active secondary window on Linux:\n\n1. FlView did not retain a strong reference to self-\u003erenderer, allowing gtk_container_dispose() on self-\u003eevent_box to unreference and free self-\u003erenderer during dispose() while the Flutter raster thread may still call fl_view_present_layers(self-\u003erenderer). Retain a strong reference to self-\u003erenderer until fl_view_finalize().\n\n2. FlViewRendererOpenGL and FlViewRendererSubsurface destroyed frame_mutex and task_runner in dispose() while leaving compositor and frame for finalize(). Move task_runner and frame_mutex cleanup to finalize() so present_layers() can safely access them after dispose().\n\n3. Synchronize compositor, frame, and render_context teardown under frame_mutex in cleanup_opengl_resources() during unrealize() and dispose() on the GTK main thread. Only clear the GTK thread\u0027s current GdkGLContext if this window\u0027s render_context is the one currently bound.\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "6a51c262e18ce69ed4cd1a661345e03014152853",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/shell/platform/linux/fl_view.cc",
      "new_id": "e565a24a049379bc65ee4843f2e17e9071d29110",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/shell/platform/linux/fl_view.cc"
    },
    {
      "type": "modify",
      "old_id": "f0c973de019aafe5f5893b3d9de1ee6a2d41eeaa",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/shell/platform/linux/fl_view_renderer_opengl.cc",
      "new_id": "2a2b1d5cea3862532c55c2fc65a87d81d24df265",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/shell/platform/linux/fl_view_renderer_opengl.cc"
    },
    {
      "type": "modify",
      "old_id": "2fb99cdc35bcb38ab581e6a2193bc089a56a1068",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/shell/platform/linux/fl_view_renderer_subsurface.cc",
      "new_id": "c05f63e9b039b57ca9636a170693d53ecbae1a0f",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/shell/platform/linux/fl_view_renderer_subsurface.cc"
    },
    {
      "type": "modify",
      "old_id": "0c16f8990f11744820bb291dbfddb4ee92ea6cba",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/shell/platform/linux/testing/mock_gtk.cc",
      "new_id": "2ca0faf9c1eb708be1fcbad4c44e875c52521fe3",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/shell/platform/linux/testing/mock_gtk.cc"
    }
  ]
}
