/* Multi-process/thread control defs for GDB, the GNU debugger.
- Copyright (C) 1987-2018 Free Software Foundation, Inc.
+ Copyright (C) 1987-2019 Free Software Foundation, Inc.
Contributed by Lynx Real-Time Systems, Inc. Los Gatos, CA.
#include "frame.h"
#include "ui-out.h"
#include "btrace.h"
-#include "common/vec.h"
#include "target/waitstatus.h"
#include "cli/cli-utils.h"
-#include "common/refcounted-object.h"
-#include "common-gdbthread.h"
+#include "gdbsupport/refcounted-object.h"
+#include "gdbsupport/common-gdbthread.h"
+#include "gdbsupport/forward-scope-exit.h"
struct inferior;
/* Frontend view of the thread state. Possible extensions: stepping,
- finishing, until(ling),... */
+ finishing, until(ling),...
+
+ NOTE: Since the thread state is not a boolean, most times, you do
+ not want to check it with negation. If you really want to check if
+ the thread is stopped,
+
+ use (good):
+
+ if (tp->state == THREAD_STOPPED)
+
+ instead of (bad):
+
+ if (tp->state != THREAD_RUNNING)
+
+ The latter is also true for exited threads, most likely not what
+ you want. */
enum thread_state
{
+ /* In the frontend's perpective, the thread is stopped. */
THREAD_STOPPED,
+
+ /* In the frontend's perpective, the thread is running. */
THREAD_RUNNING,
+
+ /* The thread is listed, but known to have exited. We keep it
+ listed (but not visible) until it's safe to delete it. */
THREAD_EXITED,
};
reverting back (e.g., due to a "kill" command). If the thread
meanwhile exits before being re-selected, then the thread object is
left listed in the thread list, but marked with state
- THREAD_EXITED. (See make_cleanup_restore_current_thread and
+ THREAD_EXITED. (See scoped_restore_current_thread and
delete_thread). All other thread references are considered weak
references. Placing a thread in the thread list is an implicit
strong reference, and is thus not accounted for in the thread's
struct thread_info *find_thread_global_id (int global_id);
/* Find thread by thread library specific handle in inferior INF. */
-struct thread_info *find_thread_by_handle (struct value *thread_handle,
- struct inferior *inf);
+struct thread_info *find_thread_by_handle
+ (gdb::array_view<const gdb_byte> handle, struct inferior *inf);
/* Finds the first thread of the specified inferior. */
extern struct thread_info *first_thread_of_inferior (inferior *inf);
observer is called with PTID as argument. */
extern void set_stop_requested (ptid_t ptid, int stop);
-/* NOTE: Since the thread state is not a boolean, most times, you do
- not want to check it with negation. If you really want to check if
- the thread is stopped,
-
- use (good):
-
- if (is_stopped (ptid))
-
- instead of (bad):
-
- if (!is_running (ptid))
-
- The latter also returns true on exited threads, most likelly not
- what you want. */
-
-/* Reports if in the frontend's perpective, thread PTID is running. */
-extern int is_running (ptid_t ptid);
-
-/* Is this thread listed, but known to have exited? We keep it listed
- (but not visible) until it's safe to delete. */
-extern int is_exited (ptid_t ptid);
-
-/* In the frontend's perpective, is this thread stopped? */
-extern int is_stopped (ptid_t ptid);
-
/* Marks thread PTID as executing, or not. If PTID is minus_one_ptid,
marks all threads.
/* Calls finish_thread_state on scope exit, unless release() is called
to disengage. */
-class scoped_finish_thread_state
-{
-public:
- explicit scoped_finish_thread_state (ptid_t ptid)
- : m_ptid (ptid)
- {}
-
- ~scoped_finish_thread_state ()
- {
- if (!m_released)
- finish_thread_state (m_ptid);
- }
-
- /* Disengage. */
- void release ()
- {
- m_released = true;
- }
-
- DISABLE_COPY_AND_ASSIGN (scoped_finish_thread_state);
-
-private:
- bool m_released = false;
- ptid_t m_ptid;
-};
+using scoped_finish_thread_state
+ = FORWARD_SCOPE_EXIT (finish_thread_state);
/* Commands with a prefix of `thread'. */
extern struct cmd_list_element *thread_cmd_list;
/* Print notices on thread events (attach, detach, etc.), set with
`set print thread-events'. */
-extern int print_thread_events;
+extern bool print_thread_events;
/* Prints the list of threads and their details on UIOUT. If
REQUESTED_THREADS, a list of GDB ids/ranges, is not NULL, only
all attached PIDs are printed. If both REQUESTED_THREADS is not
NULL and PID is not -1, then the thread is printed if it belongs to
the specified process. Otherwise, an error is raised. */
-extern void print_thread_info (struct ui_out *uiout, char *requested_threads,
+extern void print_thread_info (struct ui_out *uiout,
+ const char *requested_threads,
int pid);
/* Save/restore current inferior/thread/frame. */