)]}'
{
  "commit": "8c4d532bceb3e56952c1cb83b8a40e7f18f0cbbf",
  "tree": "05ff3fd9de5a90d222cf2421ceab6f64bc0b22fe",
  "parents": [
    "9fef193a88a54a765bc301ab9d535a640c215eb7"
  ],
  "author": {
    "name": "Todd Lipcon",
    "email": "tlipcon@google.com",
    "time": "Tue Oct 20 10:08:38 2026 -0700"
  },
  "committer": {
    "name": "Copybara-Service",
    "email": "copybara-worker@google.com",
    "time": "Tue Oct 20 10:10:15 2026 -0700"
  },
  "message": "Avoid taking deadlock_graph_mu when locking a Mutex with no other locks held\n\nIn debug builds with deadlock detection enabled, locking a Mutex takes the\nglobal deadlock_graph_mu spinlock to look up the Mutex\u0027s graph id. This also\ngives a graph node to every Mutex that is ever locked. But graph ids are used\nonly to add lock-order edges, and there are edges to add only when a thread\nacquires a lock while it holds another.\n\nThis change looks up graph ids only in that case. A held lock gets its id when\nthe thread first acquires another lock while holding it. As a result:\n\n- lock(), lock_shared() and LockWhen() take deadlock_graph_mu only if the\n  thread holds another lock, and try_lock() and try_lock_shared() never do.\n- Mutexes that never take part in nested locking no longer get graph nodes.\n\nThis does not change behavior. DeadlockCheck() already looks up a held lock\u0027s\nid again if it is no longer current, and only acquisitions made while holding\nanother lock use the ids.\n\nDeadlockCheck() looks up the held locks\u0027 ids before the acquired Mutex\u0027s id.\nGraphCycles ranks each new slot above all existing nodes, so if a held lock and\nthe acquired Mutex both get new slots, the edge between them is already in rank\norder.\n\nPiperOrigin-RevId: 1003192716\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "7d5aba77acc9da2a075b0e184ca575865aef7875",
      "old_mode": 33188,
      "old_path": "absl/synchronization/mutex.cc",
      "new_id": "d5c1a3c46e5f762b96a830dbbc56c0da93917772",
      "new_mode": 33188,
      "new_path": "absl/synchronization/mutex.cc"
    },
    {
      "type": "modify",
      "old_id": "e945d5e6664e663c0fd15822664b593d689cab6b",
      "old_mode": 33188,
      "old_path": "absl/synchronization/mutex_test.cc",
      "new_id": "50b982ee4e6c9285eb71d15113e0131c40b7b23b",
      "new_mode": 33188,
      "new_path": "absl/synchronization/mutex_test.cc"
    }
  ]
}
