diff --git a/server/mutex.c b/server/mutex.c index af13dd9ee80..1b1ef37b21e 100644 --- a/server/mutex.c +++ b/server/mutex.c @@ -37,8 +37,7 @@ struct mutex struct thread *owner; /* mutex owner */ unsigned int count; /* recursion count */ int abandoned; /* has it been abandoned? */ - struct mutex *next; - struct mutex *prev; + struct list entry; /* entry in owner thread mutex list */ }; static void mutex_dump( struct object *obj, int verbose ); @@ -71,7 +70,6 @@ static struct mutex *create_mutex( const WCHAR *name, size_t len, int owned ) mutex->count = 0; mutex->owner = NULL; mutex->abandoned = 0; - mutex->next = mutex->prev = NULL; if (owned) mutex_satisfied( &mutex->obj, current ); } } @@ -83,19 +81,18 @@ static void do_release( struct mutex *mutex ) { assert( !mutex->count ); /* remove the mutex from the thread list of owned mutexes */ - if (mutex->next) mutex->next->prev = mutex->prev; - if (mutex->prev) mutex->prev->next = mutex->next; - else mutex->owner->mutex = mutex->next; + list_remove( &mutex->entry ); mutex->owner = NULL; - mutex->next = mutex->prev = NULL; wake_up( &mutex->obj, 0 ); } void abandon_mutexes( struct thread *thread ) { - while (thread->mutex) + struct list *ptr; + + while ((ptr = list_head( &thread->mutex_list )) != NULL) { - struct mutex *mutex = thread->mutex; + struct mutex *mutex = LIST_ENTRY( ptr, struct mutex, entry ); assert( mutex->owner == thread ); mutex->count = 0; mutex->abandoned = 1; @@ -129,9 +126,7 @@ static int mutex_satisfied( struct object *obj, struct thread *thread ) { assert( !mutex->owner ); mutex->owner = thread; - mutex->prev = NULL; - if ((mutex->next = thread->mutex)) mutex->next->prev = mutex; - thread->mutex = mutex; + list_add_head( &thread->mutex_list, &mutex->entry ); } if (!mutex->abandoned) return 0; mutex->abandoned = 0; diff --git a/server/thread.c b/server/thread.c index 1e2abbd64a3..816f3bfeead 100644 --- a/server/thread.c +++ b/server/thread.c @@ -115,7 +115,6 @@ inline static void init_thread_structure( struct thread *thread ) thread->unix_tid = -1; /* not known yet */ thread->context = NULL; thread->teb = NULL; - thread->mutex = NULL; thread->debug_ctx = NULL; thread->debug_event = NULL; thread->queue = NULL; @@ -139,6 +138,7 @@ inline static void init_thread_structure( struct thread *thread ) thread->creation_time = time(NULL); thread->exit_time = 0; + list_init( &thread->mutex_list ); list_init( &thread->system_apc ); list_init( &thread->user_apc ); diff --git a/server/thread.h b/server/thread.h index 887b8fe463f..924c4717bfe 100644 --- a/server/thread.h +++ b/server/thread.h @@ -29,7 +29,6 @@ struct process; struct thread_wait; struct thread_apc; -struct mutex; struct debug_ctx; struct debug_event; struct msg_queue; @@ -57,7 +56,7 @@ struct thread struct thread *proc_prev; struct process *process; thread_id_t id; /* thread id */ - struct mutex *mutex; /* list of currently owned mutexes */ + struct list mutex_list; /* list of currently owned mutexes */ struct debug_ctx *debug_ctx; /* debugger context if this thread is a debugger */ struct debug_event *debug_event; /* debug event being sent to debugger */ struct msg_queue *queue; /* message queue */