Convert the per-thread mutex list to a standard list.
This commit is contained in:
parent
e8d1e2f745
commit
20894e2ffb
|
@ -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;
|
||||
|
|
|
@ -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 );
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue