)]}'
{
  "commit": "1ffdccc46ea67d3e4c39e3fa44f21b36dd46f3c5",
  "tree": "f411ce786be842cfad1532b4785444dcdaf22ef8",
  "parents": [
    "23a39ef1445548c2e9b22d86182b55d4a7669383"
  ],
  "author": {
    "name": "Mathias Agopian",
    "email": "mathias@google.com",
    "time": "Thu Jun 14 23:39:35 2012 -0700"
  },
  "committer": {
    "name": "The Android Automerger",
    "email": "android-build@android.com",
    "time": "Fri Jun 15 16:17:06 2012 -0700"
  },
  "message": "SF could get stuck waiting for vsync when turning the screen off\n\nWhen turning the screen off we could have 2 waiters on the\nvsync condition: The main vsync waiter as well as one in\nonScreenReleased(). We were only signaling the condition though,\nso it it would be possible to wake onScreenReleased() without waking\nthe main vsync thread which would then be stuck in .wait().\n\nWe fix this by just using broadcast() when receiving a vsync event.\n\nWe also add a broadcast() to signal when the state of\nmUseSoftwareVSync changes.  This is important particularly for\nthe transition from hardware to software vsync because the main\nvsync waiter might have observed mUseSoftwareVSync \u003d\u003d false\nand decided to block indefinitely pending a hardware vsync\nsignal that will never arrive.\n\nRemoved a potentially deadlocking wait for a signal in\nonScreenReleased().  The function was trying to wait for the last\nvsync event from the hardware to be delivered to clients but there\nwas no guarantee that another thread would signal it to wake up\nagain afterwards.  (As far as I can tell, the only other other\nthread that might wake it up at this point would be a client\napplication issuing a vsync request.)  We don\u0027t really need to wait\nhere anyhow.  It\u0027s enough to set the mUseSoftwareVSync flag,\nwake up the thread loop and go.  If there was a pending vsync\ntimestamp from the hardware, then the thread loop will grab\nit and use it then start software vsync on the next iteration.\n\nBug: 6672102\nChange-Id: I7c6abc23bb021d1dfc94f101bd3ce18e3a81a73e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "47fa2f3df16a3682d2d2b1b712bf5084725655b9",
      "old_mode": 33188,
      "old_path": "services/surfaceflinger/EventThread.cpp",
      "new_id": "7c1aebe0b8ae381fa3c5a26a176920c1be528346",
      "new_mode": 33188,
      "new_path": "services/surfaceflinger/EventThread.cpp"
    }
  ]
}
