mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-05-25 19:58:06 +08:00

The python code maintains a list of threads for each inferior. This list is implemented as a linked list. When the number of threads grows high, this implementation can begin to be a performance bottleneck as finding a particular thread_object in the list has a complexity of O(N). We see this in ROCgdb[1], a downstream port of GDB for AMDGUP. On AMDGPU devices, the number of threads can get significantly higher than on usual GDB workloads. In some situations, we can reach the end of the inferior process with GDB still having a substantial list of known threads. While running target_mourn_inferior, we end up in inferior::clear_thread_list which iterates over all remaining threads and marks each thread exited. This fires the gdb::observers::thread_exit observer and eventually py-inferior.c:set_thread_exited gets called. This function searches in the linked list with poor performances. This patch proposes to change the linked list that keeps the per inferior_object list of thread_objects into a std::unordered_map. This allows to have the search operation complexity be O(1) on average instead of O(N). With this patch, we can complete clear_thread_list in about 2.5 seconds compared to 10 minutes without it. Except for the performance change, no user visible change is expected. Regression tested on Ubuntu-22.04 x86_64. [1] https://github.com/ROCm-Developer-Tools/ROCgdb