/* Abstract base class inherited by all process_stratum targets
- Copyright (C) 2018-2021 Free Software Foundation, Inc.
+ Copyright (C) 2018-2022 Free Software Foundation, Inc.
This file is part of GDB.
#include "defs.h"
#include "process-stratum-target.h"
#include "inferior.h"
+#include <algorithm>
process_stratum_target::~process_stratum_target ()
{
return inf->pid != 0;
}
+/* See process-stratum-target.h. */
+
void
process_stratum_target::follow_exec (inferior *follow_inf, ptid_t ptid,
const char *execd_pathname)
/* See process-stratum-target.h. */
+void
+process_stratum_target::follow_fork (inferior *child_inf, ptid_t child_ptid,
+ target_waitkind fork_kind,
+ bool follow_child,
+ bool detach_on_fork)
+{
+ if (child_inf != nullptr)
+ {
+ child_inf->push_target (this);
+ add_thread_silent (this, child_ptid);
+ }
+}
+
+/* See process-stratum-target.h. */
+
void
process_stratum_target::maybe_add_resumed_with_pending_wait_status
(thread_info *thread)
/* See process-stratum-target.h. */
+thread_info *
+process_stratum_target::random_resumed_with_pending_wait_status
+ (inferior *inf, ptid_t filter_ptid)
+{
+ auto matches = [inf, filter_ptid] (const thread_info &thread)
+ {
+ return thread.inf == inf && thread.ptid.matches (filter_ptid);
+ };
+
+ /* First see how many matching events we have. */
+ const auto &l = m_resumed_with_pending_wait_status;
+ unsigned int count = std::count_if (l.begin (), l.end (), matches);
+
+ if (count == 0)
+ return nullptr;
+
+ /* Now randomly pick a thread out of those that match the criteria. */
+ int random_selector
+ = (int) ((count * (double) rand ()) / (RAND_MAX + 1.0));
+
+ if (count > 1)
+ infrun_debug_printf ("Found %u events, selecting #%d",
+ count, random_selector);
+
+ /* Select the Nth thread that matches. */
+ auto it = std::find_if (l.begin (), l.end (),
+ [&random_selector, &matches]
+ (const thread_info &thread)
+ {
+ if (!matches (thread))
+ return false;
+
+ return random_selector-- == 0;
+ });
+
+ gdb_assert (it != l.end ());
+
+ return &*it;
+}
+
+/* See process-stratum-target.h. */
+
std::set<process_stratum_target *>
all_non_exited_process_targets ()
{