)]}'
{
  "commit": "dcd7a6ffedad5a3c889dada8e06073fe76235bad",
  "tree": "a59c6efac9f74d4fe9c860b37607799a62bbd26c",
  "parents": [
    "99928fc00d95803edd307716b66fd705954ca006"
  ],
  "author": {
    "name": "Chris Kennelly CA",
    "email": "ckennelly@google.com",
    "time": "Sun Oct 11 16:32:40 2026 -0700"
  },
  "committer": {
    "name": "Copybara-Service",
    "email": "copybara-worker@google.com",
    "time": "Fri Oct 30 02:25:34 2026 -0700"
  },
  "message": "Cache lock-order edges per thread so DeadlockCheck() can skip deadlock_graph_mu.\n\nIn debug builds with deadlock detection enabled, a thread that acquires a Mutex\nwhile it holds another takes the global deadlock_graph_mu spinlock, to insert\nthe lock-order edges from its held locks into deadlock_graph. Most of these\nacquisitions find every edge already in the graph, but with many threads they\nstill contend on deadlock_graph_mu.\n\nGive each thread a 512-entry direct-mapped cache of the edges that it has found\nor inserted in deadlock_graph. If every edge from a held lock to the new lock\nhas a valid cache entry, DeadlockCheck() takes the held locks\u0027 GraphIds from\nthe cache and returns without deadlock_graph_mu. A hit skips only work that\nwould leave deadlock_graph unchanged:\n\n- Edges leave deadlock_graph only when one of their nodes is removed, so an\n  entry is valid while both of its nodes are still in the graph. The new\n  GraphCycles::IsCurrent() checks this by comparing node versions, without\n  deadlock_graph_mu. RemoveNode() bumps the version, so an entry for a\n  destroyed or forgotten Mutex misses, even if a new Mutex reuses its address.\n  The check is exact per node: removing a node does not invalidate entries for\n  other nodes.\n- DeadlockCheck() replaces a lock\u0027s stored stack trace when the thread holds\n  more locks than when that trace was taken. So that a hit never skips this,\n  each entry records the lock depth at which it was cached, and serves only\n  acquisitions at that depth or lower.\n\nCost: 28 KiB per thread, zero-initialized on the thread\u0027s first nested lock\nacquisition, only in debug builds with deadlock detection enabled.\nPiperOrigin-RevId: 997581889\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "707908145f1a6678cea9c5d4c2bdda84a637e0d5",
      "old_mode": 33188,
      "old_path": "absl/synchronization/internal/graphcycles.cc",
      "new_id": "a3edaed0c71d8f517415084a709900706402557c",
      "new_mode": 33188,
      "new_path": "absl/synchronization/internal/graphcycles.cc"
    },
    {
      "type": "modify",
      "old_id": "27eaa6c61be032dc4f82486e71394bff4462de39",
      "old_mode": 33188,
      "old_path": "absl/synchronization/internal/graphcycles.h",
      "new_id": "72b6e76d63e0a9a8e2d517ea2475799f8adee2fc",
      "new_mode": 33188,
      "new_path": "absl/synchronization/internal/graphcycles.h"
    },
    {
      "type": "modify",
      "old_id": "b1a6daf0825d4b9956bf34538033d98139419ea3",
      "old_mode": 33188,
      "old_path": "absl/synchronization/internal/graphcycles_test.cc",
      "new_id": "26a81aa8d4fb95c0f553db9730979733fc347b2f",
      "new_mode": 33188,
      "new_path": "absl/synchronization/internal/graphcycles_test.cc"
    },
    {
      "type": "modify",
      "old_id": "d5c1a3c46e5f762b96a830dbbc56c0da93917772",
      "old_mode": 33188,
      "old_path": "absl/synchronization/mutex.cc",
      "new_id": "f6f161a0f674eb06135c1651bbd8442cecc92b5c",
      "new_mode": 33188,
      "new_path": "absl/synchronization/mutex.cc"
    },
    {
      "type": "modify",
      "old_id": "50b982ee4e6c9285eb71d15113e0131c40b7b23b",
      "old_mode": 33188,
      "old_path": "absl/synchronization/mutex_test.cc",
      "new_id": "d89bd89ca73429f77b7b01cf94a29869fef79027",
      "new_mode": 33188,
      "new_path": "absl/synchronization/mutex_test.cc"
    }
  ]
}
