Add backlink from lwp_info to thread_info.
* gdbthread.h (add_thread): Change result type to struct thread_info *. * inferiors.c (add_thread): Change result type to struct thread_info *. All callers updated. (add_lwp): Call add_thread here instead of in callers. All callers updated. * linux-low.h (get_lwp_thread): Rewrite. (struct lwp_info): New member "thread". This speeds up gdbserver attach in non-stop mode because now get_lwp_thread doesn't do a linear search for the corresponding thread_info object.
This commit is contained in:
parent
b3312d8019
commit
f7667f0de6
@ -1,3 +1,13 @@
|
|||||||
|
2014-02-19 Doug Evans <dje@google.com>
|
||||||
|
|
||||||
|
* gdbthread.h (add_thread): Change result type to struct thread_info *.
|
||||||
|
* inferiors.c (add_thread): Change result type to struct thread_info *.
|
||||||
|
All callers updated.
|
||||||
|
(add_lwp): Call add_thread here instead of in callers.
|
||||||
|
All callers updated.
|
||||||
|
* linux-low.h (get_lwp_thread): Rewrite.
|
||||||
|
(struct lwp_info): New member "thread".
|
||||||
|
|
||||||
2014-02-19 Doug Evans <dje@google.com>
|
2014-02-19 Doug Evans <dje@google.com>
|
||||||
|
|
||||||
* linux-low.c (add_lwp): Change result to struct lwp_info *.
|
* linux-low.c (add_lwp): Change result to struct lwp_info *.
|
||||||
|
@ -74,7 +74,7 @@ struct thread_info
|
|||||||
extern struct inferior_list all_threads;
|
extern struct inferior_list all_threads;
|
||||||
|
|
||||||
void remove_thread (struct thread_info *thread);
|
void remove_thread (struct thread_info *thread);
|
||||||
void add_thread (ptid_t ptid, void *target_data);
|
struct thread_info *add_thread (ptid_t ptid, void *target_data);
|
||||||
|
|
||||||
struct thread_info *get_first_thread (void);
|
struct thread_info *get_first_thread (void);
|
||||||
|
|
||||||
|
@ -104,7 +104,7 @@ remove_inferior (struct inferior_list *list,
|
|||||||
list->tail = *cur;
|
list->tail = *cur;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
struct thread_info *
|
||||||
add_thread (ptid_t thread_id, void *target_data)
|
add_thread (ptid_t thread_id, void *target_data)
|
||||||
{
|
{
|
||||||
struct thread_info *new_thread = xmalloc (sizeof (*new_thread));
|
struct thread_info *new_thread = xmalloc (sizeof (*new_thread));
|
||||||
@ -121,6 +121,8 @@ add_thread (ptid_t thread_id, void *target_data)
|
|||||||
current_inferior = new_thread;
|
current_inferior = new_thread;
|
||||||
|
|
||||||
new_thread->target_data = target_data;
|
new_thread->target_data = target_data;
|
||||||
|
|
||||||
|
return new_thread;
|
||||||
}
|
}
|
||||||
|
|
||||||
ptid_t
|
ptid_t
|
||||||
|
@ -409,7 +409,6 @@ handle_extended_wait (struct lwp_info *event_child, int wstat)
|
|||||||
|
|
||||||
ptid = ptid_build (pid_of (event_child), new_pid, 0);
|
ptid = ptid_build (pid_of (event_child), new_pid, 0);
|
||||||
new_lwp = add_lwp (ptid);
|
new_lwp = add_lwp (ptid);
|
||||||
add_thread (ptid, new_lwp);
|
|
||||||
|
|
||||||
/* Either we're going to immediately resume the new thread
|
/* Either we're going to immediately resume the new thread
|
||||||
or leave it stopped. linux_resume_one_lwp is a nop if it
|
or leave it stopped. linux_resume_one_lwp is a nop if it
|
||||||
@ -539,6 +538,7 @@ add_lwp (ptid_t ptid)
|
|||||||
lwp->arch_private = the_low_target.new_thread ();
|
lwp->arch_private = the_low_target.new_thread ();
|
||||||
|
|
||||||
add_inferior_to_list (&all_lwps, &lwp->entry);
|
add_inferior_to_list (&all_lwps, &lwp->entry);
|
||||||
|
lwp->thread = add_thread (ptid, lwp);
|
||||||
|
|
||||||
return lwp;
|
return lwp;
|
||||||
}
|
}
|
||||||
@ -632,7 +632,6 @@ linux_create_inferior (char *program, char **allargs)
|
|||||||
|
|
||||||
ptid = ptid_build (pid, pid, 0);
|
ptid = ptid_build (pid, pid, 0);
|
||||||
new_lwp = add_lwp (ptid);
|
new_lwp = add_lwp (ptid);
|
||||||
add_thread (ptid, new_lwp);
|
|
||||||
new_lwp->must_set_ptrace_flags = 1;
|
new_lwp->must_set_ptrace_flags = 1;
|
||||||
|
|
||||||
return pid;
|
return pid;
|
||||||
@ -683,7 +682,6 @@ linux_attach_lwp_1 (unsigned long lwpid, int initial)
|
|||||||
}
|
}
|
||||||
|
|
||||||
new_lwp = add_lwp (ptid);
|
new_lwp = add_lwp (ptid);
|
||||||
add_thread (ptid, new_lwp);
|
|
||||||
|
|
||||||
/* We need to wait for SIGSTOP before being able to make the next
|
/* We need to wait for SIGSTOP before being able to make the next
|
||||||
ptrace call on this LWP. */
|
ptrace call on this LWP. */
|
||||||
|
@ -229,14 +229,17 @@ extern struct linux_target_ops the_low_target;
|
|||||||
|
|
||||||
#define get_lwp(inf) ((struct lwp_info *)(inf))
|
#define get_lwp(inf) ((struct lwp_info *)(inf))
|
||||||
#define get_thread_lwp(thr) (get_lwp (inferior_target_data (thr)))
|
#define get_thread_lwp(thr) (get_lwp (inferior_target_data (thr)))
|
||||||
#define get_lwp_thread(proc) ((struct thread_info *) \
|
#define get_lwp_thread(lwp) ((lwp)->thread)
|
||||||
find_inferior_id (&all_threads, \
|
|
||||||
get_lwp (proc)->entry.id))
|
|
||||||
|
|
||||||
struct lwp_info
|
struct lwp_info
|
||||||
{
|
{
|
||||||
struct inferior_list_entry entry;
|
struct inferior_list_entry entry;
|
||||||
|
|
||||||
|
/* Backlink to the thread_info object.
|
||||||
|
It is the "main" representation of the thread, we just contain
|
||||||
|
linux-specific subordinate data. */
|
||||||
|
struct thread_info *thread;
|
||||||
|
|
||||||
/* If this flag is set, the next SIGSTOP will be ignored (the
|
/* If this flag is set, the next SIGSTOP will be ignored (the
|
||||||
process will be immediately resumed). This means that either we
|
process will be immediately resumed). This means that either we
|
||||||
sent the SIGSTOP to it ourselves and got some other pending event
|
sent the SIGSTOP to it ourselves and got some other pending event
|
||||||
|
Loading…
Reference in New Issue
Block a user