)]}'
{
  "commit": "a79435bd6f7de397ac7f65f68c8db0f7173eabe5",
  "tree": "e8101c24f3821ab1be33d3b935152f8b6baac873",
  "parents": [
    "34560b6d0950b54497d70a319d5496ccc0ffec10"
  ],
  "author": {
    "name": "Rob Carr",
    "email": "racarr@google.com",
    "time": "Fri Mar 06 14:46:07 2020 -0800"
  },
  "committer": {
    "name": "Rob Carr",
    "email": "racarr@google.com",
    "time": "Mon Mar 09 11:47:58 2020 -0700"
  },
  "message": "SurfaceFlinger: Avoid destroying Layer on Binder thread\n\nBufferQueueLayer::onFrameAvailable passes \u0027this\u0027 as an sp\u003cLayer\u003e\nto SurfaceInterceptor. This constructs a temporary sp\u003cLayer\u003e. We are\non a binder thread and not holding any locks, so at this point the main\nthread could drop it\u0027s last references. Then when we destroy our\ntemporary sp\u003cLayer\u003e it is the last reference and we end up\ninvoking ~Layer from the Binder thread, an invalid operation\nwhich in this case leads to dead-lock (as we attempt to reacquire\nthe already acquired BufferQueue mutex from the BufferQueueLayer d\u0027tor)\n\nBug: 149473038\nTest: Existing tests pass\nChange-Id: I77a20bedf2db3b974ac03d804f70993514478fb2\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "18f7f44fa5f32461a63519e2c430225404da7a1f",
      "old_mode": 33188,
      "old_path": "services/surfaceflinger/BufferQueueLayer.cpp",
      "new_id": "fac90241215f29c85294be7ac4dd18bce95b0f26",
      "new_mode": 33188,
      "new_path": "services/surfaceflinger/BufferQueueLayer.cpp"
    },
    {
      "type": "modify",
      "old_id": "1f9d46c330f62ffe6836aefd34fadb3d33cfb278",
      "old_mode": 33188,
      "old_path": "services/surfaceflinger/SurfaceInterceptor.cpp",
      "new_id": "5b3cd698b58a099f5bc76630098633beaea4cee5",
      "new_mode": 33188,
      "new_path": "services/surfaceflinger/SurfaceInterceptor.cpp"
    },
    {
      "type": "modify",
      "old_id": "a665f62ad7427126ad00db4753d59b44815ec167",
      "old_mode": 33188,
      "old_path": "services/surfaceflinger/SurfaceInterceptor.h",
      "new_id": "896bdcc259ea86feec54b9c14a5fface14423d27",
      "new_mode": 33188,
      "new_path": "services/surfaceflinger/SurfaceInterceptor.h"
    },
    {
      "type": "modify",
      "old_id": "458b2f3da247b3725531d64b2d33b1e5b81b0b70",
      "old_mode": 33188,
      "old_path": "services/surfaceflinger/tests/unittests/mock/MockSurfaceInterceptor.h",
      "new_id": "5beee1c0ecdbc9cfe5dc342d4ac7dd883197f4a6",
      "new_mode": 33188,
      "new_path": "services/surfaceflinger/tests/unittests/mock/MockSurfaceInterceptor.h"
    }
  ]
}
