From: Simon Marchi Date: Tue, 3 Dec 2024 20:01:14 +0000 (-0500) Subject: gdbserver/win32-low.cc: remove use of `all_threads` X-Git-Tag: gdb-16-branchpoint~177 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=07868dca1186ab0406840d3f52a4d7fa05aa0e61;p=thirdparty%2Fbinutils-gdb.git gdbserver/win32-low.cc: remove use of `all_threads` Fix this: gdbserver/win32-low.cc: In function ‘void child_delete_thread(DWORD, DWORD)’: gdbserver/win32-low.cc:192:7: error: ‘all_threads’ was not declared in this scope; did you mean ‘using_threads’? 192 | if (all_threads.size () == 1) | ^~~~~~~~~~~ | using_threads Commit 9f77b3aa0bfc ("gdbserver: change 'all_processes' and 'all_threads' list type") changed the type of `all_thread` to an intrusive_list, without changing this particular use, which broke the build because an intrusive_list doesn't know its size, so it doesn't have a `size()` method. The subsequent commit removed `all_threads`, leading to the error above. Fix it by using the number of threads of the concerned process instead. My rationale: as far as I know, GDBserver on Windows only supports one process at a time, so there's no need to iterate over all processes. If we made GDBserver for Windows support multiple processes, my intuition is that we'd want this check to use the number of threads of the concerned process, not the number of threads overall. Add the method `process_info::thread_count`, to get the number of threads of the process. I'm not really sure what this check is for in the first place, Hannes Domani said that this check didn't seem to trigger on Windows 7 and 11. Perhaps it was necessary before. Change-Id: I84d6226532b887d99248cf3be90f5065fb7a074a Tested-By: Hannes Domani --- diff --git a/gdbserver/inferiors.h b/gdbserver/inferiors.h index 5757a1f96e3..5867608ba46 100644 --- a/gdbserver/inferiors.h +++ b/gdbserver/inferiors.h @@ -97,6 +97,10 @@ struct process_info : public intrusive_list_node std::unordered_map &thread_map () { return m_ptid_thread_map; } + /* Return the number of threads in this process. */ + unsigned int thread_count () const + { return m_ptid_thread_map.size (); } + /* Return the thread with ptid PTID, or nullptr if no such thread is found. */ thread_info *find_thread (ptid_t ptid); diff --git a/gdbserver/win32-low.cc b/gdbserver/win32-low.cc index d19e89152ec..c3115ea826c 100644 --- a/gdbserver/win32-low.cc +++ b/gdbserver/win32-low.cc @@ -188,12 +188,17 @@ delete_thread_info (thread_info *thread) static void child_delete_thread (DWORD pid, DWORD tid) { + process_info *process = find_process_pid (pid); + + if (process == nullptr) + return; + /* If the last thread is exiting, just return. */ - if (all_threads.size () == 1) + if (process->thread_count () == 1) return; - thread_info *thread = find_thread_ptid (ptid_t (pid, tid)); - if (thread == NULL) + thread_info *thread = process->find_thread (ptid_t (pid, tid)); + if (thread == nullptr) return; delete_thread_info (thread);