server: add new threads to end of thread_list The head of a process' thread_list should be best-effort an initialized thread. Currently, new threads are prepended to thread_list which causes write_process_memory to break if the request is interleaved between a new_thread request and the corresponding init_thread. This occurs because write_process_memory queries the unix_pid via the first thread in thread_list (the new thread) which is not yet initialized with a unix pid. An alternative solution is to introduce this code in [read|write]_process_memory or to move the unix_pid into the process struct. I'd be happy to do either if it's more appropriate, but I think this change better reflects the semantics of get_process_first_thread. This patch: 1. Appends new threads to the end of thread_list so that the first thread is very likely initialized. 2. Changes get_process_first_thread to try to return the first initialized thread before defaulting to the first (and uninitialized) thread Thomas Kho --- server/process.c | 15 +++++++++++---- 1 files changed, 11 insertions(+), 4 deletions(-) diff --git a/server/process.c b/server/process.c index 2b8a5dc..132f4e8 100644 --- a/server/process.c +++ b/server/process.c @@ -207,9 +207,16 @@ void *get_ptid_entry( unsigned int id ) /* return the main thread of the process */ struct thread *get_process_first_thread( struct process *process ) { - struct list *ptr = list_head( &process->thread_list ); - if (!ptr) return NULL; - return LIST_ENTRY( ptr, struct thread, proc_entry ); + struct thread *thread = NULL, *cur; + + LIST_FOR_EACH_ENTRY( cur, &process->thread_list, struct thread, proc_entry ) + { + if (cur->unix_pid != -1) /* initialized thread */ + return cur; + else if (!thread) + thread = cur; + } + return thread; } /* set the state of the process startup info */ @@ -543,7 +550,7 @@ static void process_killed( struct proce /* add a thread to a process running threads list */ void add_process_thread( struct process *process, struct thread *thread ) { - list_add_head( &process->thread_list, &thread->proc_entry ); + list_add_tail( &process->thread_list, &thread->proc_entry ); if (!process->running_threads++) running_processes++; grab_object( thread ); }