Remove scoped_inc_dec_ref

We can remove scoped_inc_dec_ref by changing the sole user to instead
keep a vector of thread_info_ref objects.  This removes some manual
reference counting and simplifies the code a bit.

gdb/ChangeLog
2020-12-11  Tom Tromey  <tom@tromey.com>

	* thread.c (class scoped_inc_dec_ref): Remove.
	(tp_array_compar_ascending, tp_array_compar_descending): Change
	parameter types.
	(thread_apply_all_command): Use thread_info_ref.
This commit is contained in:
Tom Tromey 2020-12-11 09:21:53 -07:00
parent d634cd0bce
commit bfcb9db853
2 changed files with 14 additions and 34 deletions

View File

@ -1,3 +1,10 @@
2020-12-11 Tom Tromey <tom@tromey.com>
* thread.c (class scoped_inc_dec_ref): Remove.
(tp_array_compar_ascending, tp_array_compar_descending): Change
parameter types.
(thread_apply_all_command): Use thread_info_ref.
2020-12-11 Tom Tromey <tom@tromey.com> 2020-12-11 Tom Tromey <tom@tromey.com>
* infrun.c (struct stop_context) <thread>: Now a thread_info_ref. * infrun.c (struct stop_context) <thread>: Now a thread_info_ref.

View File

@ -58,29 +58,6 @@ static int highest_thread_num;
/* The current/selected thread. */ /* The current/selected thread. */
static thread_info *current_thread_; static thread_info *current_thread_;
/* RAII type used to increase / decrease the refcount of each thread
in a given list of threads. */
class scoped_inc_dec_ref
{
public:
explicit scoped_inc_dec_ref (const std::vector<thread_info *> &thrds)
: m_thrds (thrds)
{
for (thread_info *thr : m_thrds)
thr->incref ();
}
~scoped_inc_dec_ref ()
{
for (thread_info *thr : m_thrds)
thr->decref ();
}
private:
const std::vector<thread_info *> &m_thrds;
};
/* Returns true if THR is the current thread. */ /* Returns true if THR is the current thread. */
static bool static bool
@ -1468,7 +1445,7 @@ print_thread_id (struct thread_info *thr)
ascending order. */ ascending order. */
static bool static bool
tp_array_compar_ascending (const thread_info *a, const thread_info *b) tp_array_compar_ascending (const thread_info_ref &a, const thread_info_ref &b)
{ {
if (a->inf->num != b->inf->num) if (a->inf->num != b->inf->num)
return a->inf->num < b->inf->num; return a->inf->num < b->inf->num;
@ -1481,7 +1458,7 @@ tp_array_compar_ascending (const thread_info *a, const thread_info *b)
descending order. */ descending order. */
static bool static bool
tp_array_compar_descending (const thread_info *a, const thread_info *b) tp_array_compar_descending (const thread_info_ref &a, const thread_info_ref &b)
{ {
if (a->inf->num != b->inf->num) if (a->inf->num != b->inf->num)
return a->inf->num > b->inf->num; return a->inf->num > b->inf->num;
@ -1619,17 +1596,13 @@ thread_apply_all_command (const char *cmd, int from_tty)
thread, in case the command is one that wipes threads. E.g., thread, in case the command is one that wipes threads. E.g.,
detach, kill, disconnect, etc., or even normally continuing detach, kill, disconnect, etc., or even normally continuing
over an inferior or thread exit. */ over an inferior or thread exit. */
std::vector<thread_info *> thr_list_cpy; std::vector<thread_info_ref> thr_list_cpy;
thr_list_cpy.reserve (tc); thr_list_cpy.reserve (tc);
for (thread_info *tp : all_non_exited_threads ()) for (thread_info *tp : all_non_exited_threads ())
thr_list_cpy.push_back (tp); thr_list_cpy.push_back (thread_info_ref::new_reference (tp));
gdb_assert (thr_list_cpy.size () == tc); gdb_assert (thr_list_cpy.size () == tc);
/* Increment the refcounts, and restore them back on scope
exit. */
scoped_inc_dec_ref inc_dec_ref (thr_list_cpy);
auto *sorter = (ascending auto *sorter = (ascending
? tp_array_compar_ascending ? tp_array_compar_ascending
: tp_array_compar_descending); : tp_array_compar_descending);
@ -1637,9 +1610,9 @@ thread_apply_all_command (const char *cmd, int from_tty)
scoped_restore_current_thread restore_thread; scoped_restore_current_thread restore_thread;
for (thread_info *thr : thr_list_cpy) for (thread_info_ref &thr : thr_list_cpy)
if (switch_to_thread_if_alive (thr)) if (switch_to_thread_if_alive (thr.get ()))
thr_try_catch_cmd (thr, cmd, from_tty, flags); thr_try_catch_cmd (thr.get (), cmd, from_tty, flags);
} }
} }