ReWind licensed patch. Peter Hunnisett <peter@transgaming.com> Suspended threads should not acquire synchronization objects
? suspend_threads_no_locks.diff ? suspend_wine.diff ? server/diff Index: server/process.c =================================================================== RCS file: /home/wine/wine/server/process.c,v retrieving revision 1.97 diff -u -r1.97 process.c --- server/process.c 19 Feb 2003 00:33:33 -0000 1.97 +++ server/process.c 24 Feb 2003 19:02:49 -0000 @@ -659,7 +659,11 @@ while (thread) { struct thread *next = thread->proc_next; - if (!thread->suspend) continue_thread( thread ); + if (!thread->suspend) + { + continue_thread( thread ); + wake_thread( thread ); + } thread = next; } } Index: server/thread.c =================================================================== RCS file: /home/wine/wine/server/thread.c,v retrieving revision 1.89 diff -u -r1.89 thread.c --- server/thread.c 19 Feb 2003 00:33:33 -0000 1.89 +++ server/thread.c 24 Feb 2003 19:02:49 -0000 @@ -405,6 +405,9 @@ struct thread_wait *wait = thread->wait; struct wait_queue_entry *entry = wait->queues; + /* Suspended threads may not acquire locks */ + if( thread->process->suspend + thread->suspend > 0 ) return -1; + assert( wait ); if (wait->flags & SELECT_ALL) { @@ -467,7 +470,7 @@ /* attempt to wake up a thread */ /* return >0 if OK, 0 if the wait condition is still not satisfied */ -static int wake_thread( struct thread *thread ) +int wake_thread( struct thread *thread ) { int signaled, count; void *cookie; @@ -941,7 +944,10 @@ if ((thread = get_thread_from_handle( req->handle, THREAD_SUSPEND_RESUME ))) { if (thread->state == TERMINATED) set_error( STATUS_ACCESS_DENIED ); - else reply->count = resume_thread( thread ); + else { + reply->count = resume_thread( thread ); + if( reply->count == 1 ) wake_thread( thread ); + } release_object( thread ); } } Index: server/thread.h =================================================================== RCS file: /home/wine/wine/server/thread.h,v retrieving revision 1.44 diff -u -r1.44 thread.h --- server/thread.h 19 Feb 2003 00:33:33 -0000 1.44 +++ server/thread.h 24 Feb 2003 19:02:49 -0000 @@ -114,6 +114,7 @@ extern struct thread *get_thread_from_pid( int pid ); extern int suspend_thread( struct thread *thread, int check_limit ); extern int resume_thread( struct thread *thread ); +extern int wake_thread( struct thread *thread ); extern int add_queue( struct object *obj, struct wait_queue_entry *entry ); extern void remove_queue( struct object *obj, struct wait_queue_entry *entry ); extern void kill_thread( struct thread *thread, int violent_death );