)]}'
{
  "commit": "f1fdd3164b86d15c97204fe9eaa5de57ae33f2bd",
  "tree": "a8b9401ea40bd434d2f4a46f40fdcba975e7b579",
  "parents": [
    "d9557c71f2cefbd013ab465039f5c0e6288c75f4"
  ],
  "author": {
    "name": "Markus Metzger",
    "email": "markus.t.metzger@intel.com",
    "time": "Mon May 11 08:53:21 2026 +0000"
  },
  "committer": {
    "name": "Markus Metzger",
    "email": "markus.t.metzger@intel.com",
    "time": "Fri May 15 05:10:47 2026 +0000"
  },
  "message": "gdb: use all_threads() in for_each_thread()\n\nIn for_each_thread(), we use all_threads_safe(), which allows deleting the\nthread.  This it not needed in the cases where it is currently used and it\ncauses the iterator to get corrupted when threads are deleted in a nested\nall_threads_safe() iteration.\n\nOne such scenario is as follows:\n- remote debugging in non-stop mode\n- one thread has hit a breakpoint\n- one thread exited but GDB does not know about it, yet\n- resume with \u0027continue -a\u0027\n- the continue command uses for_each_thread() to proceed threads individually\n- the stopped thread starts an inline step-over (displaced stepping disabled)\n- update_thread_list() learns about the exit and deletes the thread\n- the safe iterator\u0027s m_next still points to the deleted thread\n\nApproved-By: Tom Tromey \u003ctom@tromey.com\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "b3052b28d1abc6baea35c0d7b5f6a7dacdaff324",
      "old_mode": 33188,
      "old_path": "gdb/gdbthread.h",
      "new_id": "1bdbf621982938280f8f33b3610042c0f1c72a29",
      "new_mode": 33188,
      "new_path": "gdb/gdbthread.h"
    },
    {
      "type": "modify",
      "old_id": "4f62ca280cdb1f527dc224a0c6232bc039e8fda3",
      "old_mode": 33188,
      "old_path": "gdb/thread.c",
      "new_id": "110e58a70aaec2595bdbe702fea6c3dd1e9d6ca9",
      "new_mode": 33188,
      "new_path": "gdb/thread.c"
    }
  ]
}
