+
+#define ptid_of(proc) ((proc)->head.id)
+#define pid_of(proc) ptid_get_pid ((proc)->head.id)
+#define lwpid_of(proc) ptid_get_lwp ((proc)->head.id)
+
+#define get_lwp(inf) ((struct lwp_info *)(inf))
+#define get_thread_lwp(thr) (get_lwp (inferior_target_data (thr)))
+#define get_lwp_thread(proc) ((struct thread_info *) \
+ find_inferior_id (&all_threads, \
+ get_lwp (proc)->head.id))
+
+struct lwp_info
+{
+ struct inferior_list_entry head;
+
+ /* If this flag is set, the next SIGSTOP will be ignored (the
+ process will be immediately resumed). This means that either we
+ sent the SIGSTOP to it ourselves and got some other pending event
+ (so the SIGSTOP is still pending), or that we stopped the
+ inferior implicitly via PTRACE_ATTACH and have not waited for it
+ yet. */
+ int stop_expected;
+
+ /* True if this thread was suspended (with vCont;t). */
+ int suspended;
+
+ /* If this flag is set, the lwp is known to be stopped right now (stop
+ event already received in a wait()). */
+ int stopped;
+
+ /* If this flag is set, the lwp is known to be dead already (exit
+ event already received in a wait(), and is cached in
+ status_pending). */
+ int dead;
+
+ /* When stopped is set, the last wait status recorded for this lwp. */
+ int last_status;
+
+ /* If this flag is set, STATUS_PENDING is a waitstatus that has not yet
+ been reported. */
+ int status_pending_p;
+ int status_pending;
+
+ /* If this flag is set, the pending status is a (GDB-placed) breakpoint. */
+ int pending_is_breakpoint;
+ CORE_ADDR pending_stop_pc;
+
+ /* If this is non-zero, it is a breakpoint to be reinserted at our next
+ stop (SIGTRAP stops only). */
+ CORE_ADDR bp_reinsert;
+
+ /* If this flag is set, the last continue operation on this process
+ was a single-step. */
+ int stepping;
+
+ /* If this flag is set, we need to set the event request flags the
+ next time we see this LWP stop. */
+ int must_set_ptrace_flags;
+
+ /* If this is non-zero, it points to a chain of signals which need to
+ be delivered to this process. */
+ struct pending_signals *pending_signals;
+
+ /* A link used when resuming. It is initialized from the resume request,
+ and then processed and cleared in linux_resume_one_lwp. */
+
+ struct thread_resume *resume;
+
+ int thread_known;
+#ifdef HAVE_THREAD_DB_H
+ /* The thread handle, used for e.g. TLS access. Only valid if
+ THREAD_KNOWN is set. */
+ td_thrhandle_t th;
+#endif
+
+ /* Arch-specific additions. */
+ struct arch_lwp_info *arch_private;
+};
+
+extern struct inferior_list all_lwps;
+
+char *linux_child_pid_to_exec_file (int pid);
+int elf_64_file_p (const char *file);
+
+void linux_attach_lwp (unsigned long pid);
+struct lwp_info *find_lwp_pid (ptid_t ptid);
+
+/* From thread-db.c */
+int thread_db_init (int use_events);
+void thread_db_free (struct process_info *, int detaching);
+int thread_db_handle_monitor_command (char *);
+int thread_db_get_tls_address (struct thread_info *thread, CORE_ADDR offset,
+ CORE_ADDR load_module, CORE_ADDR *address);