/* process structure */
-static struct process *first_process;
+static struct list process_list = LIST_INIT(process_list);
static int running_processes;
/* process operations */
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;
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;
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 );
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 )
{
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 );
}
}
{
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 );
}
}
{
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 );
}
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)
{
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;
}
}
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;