mirror of
https://github.com/reactos/wine.git
synced 2024-11-25 04:39:45 +00:00
Convert the global process list to a standard list.
This commit is contained in:
parent
3b78212f1d
commit
48c0d51dc3
@ -48,7 +48,7 @@
|
||||
|
||||
/* process structure */
|
||||
|
||||
static struct process *first_process;
|
||||
static struct list process_list = LIST_INIT(process_list);
|
||||
static int running_processes;
|
||||
|
||||
/* process operations */
|
||||
@ -249,8 +249,6 @@ struct thread *create_process( int fd )
|
||||
int request_pipe[2];
|
||||
|
||||
if (!(process = alloc_object( &process_ops ))) goto error;
|
||||
process->next = NULL;
|
||||
process->prev = NULL;
|
||||
process->parent = NULL;
|
||||
process->thread_list = NULL;
|
||||
process->debugger = NULL;
|
||||
@ -283,8 +281,7 @@ struct thread *create_process( int fd )
|
||||
list_init( &process->classes );
|
||||
|
||||
gettimeofday( &process->start_time, NULL );
|
||||
if ((process->next = first_process) != NULL) process->next->prev = process;
|
||||
first_process = process;
|
||||
list_add_head( &process_list, &process->entry );
|
||||
|
||||
if (!(process->id = alloc_ptid( process ))) goto error;
|
||||
if (!(process->msg_fd = create_anonymous_fd( &process_fd_ops, fd, &process->obj ))) goto error;
|
||||
@ -409,9 +406,7 @@ static void process_destroy( struct object *obj )
|
||||
if (process->console) release_object( process->console );
|
||||
if (process->parent) release_object( process->parent );
|
||||
if (process->msg_fd) release_object( process->msg_fd );
|
||||
if (process->next) process->next->prev = process->prev;
|
||||
if (process->prev) process->prev->next = process->next;
|
||||
else first_process = process->next;
|
||||
list_remove( &process->entry );
|
||||
if (process->idle_event) release_object( process->idle_event );
|
||||
if (process->queue) release_object( process->queue );
|
||||
if (process->atom_table) release_object( process->atom_table );
|
||||
@ -427,8 +422,7 @@ static void process_dump( struct object *obj, int verbose )
|
||||
struct process *process = (struct process *)obj;
|
||||
assert( obj->ops == &process_ops );
|
||||
|
||||
fprintf( stderr, "Process id=%04x next=%p prev=%p handles=%p\n",
|
||||
process->id, process->next, process->prev, process->handles );
|
||||
fprintf( stderr, "Process id=%04x handles=%p\n", process->id, process->handles );
|
||||
}
|
||||
|
||||
static int process_signaled( struct object *obj, struct thread *thread )
|
||||
@ -548,11 +542,14 @@ void kill_all_processes( struct process *skip, int exit_code )
|
||||
{
|
||||
for (;;)
|
||||
{
|
||||
struct process *process = first_process;
|
||||
struct process *process;
|
||||
|
||||
while (process && (!process->running_threads || process == skip))
|
||||
process = process->next;
|
||||
if (!process) break;
|
||||
LIST_FOR_EACH_ENTRY( process, &process_list, struct process, entry )
|
||||
{
|
||||
if (process == skip) continue;
|
||||
if (process->running_threads) break;
|
||||
}
|
||||
if (&process->entry == &process_list) break; /* no process found */
|
||||
kill_process( process, NULL, exit_code );
|
||||
}
|
||||
}
|
||||
@ -562,16 +559,16 @@ void kill_console_processes( struct thread *renderer, int exit_code )
|
||||
{
|
||||
for (;;) /* restart from the beginning of the list every time */
|
||||
{
|
||||
struct process *process = first_process;
|
||||
struct process *process;
|
||||
|
||||
/* find the first process being attached to 'renderer' and still running */
|
||||
while (process &&
|
||||
(process == renderer->process || !process->console ||
|
||||
process->console->renderer != renderer || !process->running_threads))
|
||||
LIST_FOR_EACH_ENTRY( process, &process_list, struct process, entry )
|
||||
{
|
||||
process = process->next;
|
||||
if (process == renderer->process) continue;
|
||||
if (!process->running_threads) continue;
|
||||
if (process->console && process->console->renderer == renderer) break;
|
||||
}
|
||||
if (!process) break;
|
||||
if (&process->entry == &process_list) break; /* no process found */
|
||||
kill_process( process, NULL, exit_code );
|
||||
}
|
||||
}
|
||||
@ -685,11 +682,15 @@ void kill_debugged_processes( struct thread *debugger, int exit_code )
|
||||
{
|
||||
for (;;) /* restart from the beginning of the list every time */
|
||||
{
|
||||
struct process *process = first_process;
|
||||
struct process *process;
|
||||
|
||||
/* find the first process being debugged by 'debugger' and still running */
|
||||
while (process && (process->debugger != debugger || !process->running_threads))
|
||||
process = process->next;
|
||||
if (!process) return;
|
||||
LIST_FOR_EACH_ENTRY( process, &process_list, struct process, entry )
|
||||
{
|
||||
if (!process->running_threads) continue;
|
||||
if (process->debugger == debugger) break;
|
||||
}
|
||||
if (&process->entry == &process_list) break; /* no process found */
|
||||
process->debugger = NULL;
|
||||
kill_process( process, NULL, exit_code );
|
||||
}
|
||||
@ -700,7 +701,8 @@ void kill_debugged_processes( struct thread *debugger, int exit_code )
|
||||
void detach_debugged_processes( struct thread *debugger )
|
||||
{
|
||||
struct process *process;
|
||||
for (process = first_process; process; process = process->next)
|
||||
|
||||
LIST_FOR_EACH_ENTRY( process, &process_list, struct process, entry )
|
||||
{
|
||||
if (process->debugger == debugger && process->running_threads)
|
||||
{
|
||||
@ -712,9 +714,11 @@ void detach_debugged_processes( struct thread *debugger )
|
||||
|
||||
void enum_processes( int (*cb)(struct process*, void*), void *user )
|
||||
{
|
||||
struct process *process;
|
||||
for (process = first_process; process; process = process->next)
|
||||
struct list *ptr, *next;
|
||||
|
||||
LIST_FOR_EACH_SAFE( ptr, next, &process_list )
|
||||
{
|
||||
struct process *process = LIST_ENTRY( ptr, struct process, entry );
|
||||
if ((cb)(process, user)) break;
|
||||
}
|
||||
}
|
||||
@ -828,7 +832,7 @@ struct process_snapshot *process_snap( int *count )
|
||||
if (!(snapshot = mem_alloc( sizeof(*snapshot) * running_processes )))
|
||||
return NULL;
|
||||
ptr = snapshot;
|
||||
for (process = first_process; process; process = process->next)
|
||||
LIST_FOR_EACH_ENTRY( process, &process_list, struct process, entry )
|
||||
{
|
||||
if (!process->running_threads) continue;
|
||||
ptr->process = process;
|
||||
|
@ -50,8 +50,7 @@ struct process_dll
|
||||
struct process
|
||||
{
|
||||
struct object obj; /* object header */
|
||||
struct process *next; /* system-wide process list */
|
||||
struct process *prev;
|
||||
struct list entry; /* entry in system-wide process list */
|
||||
struct process *parent; /* parent process */
|
||||
struct thread *thread_list; /* head of the thread list */
|
||||
struct thread *debugger; /* thread debugging this process */
|
||||
|
Loading…
Reference in New Issue
Block a user