Process termination & exit code

Eric Pouech pouech-eric at wanadoo.fr
Sun Jun 8 04:36:59 CDT 2003


as reported by Igor Sysoev on WD, exit process code wasn't properly 
implemented on *BSD
it appeared (thanks Igor for all the testings and traces) that after 
terminate_process request was issued, the client/server pipe got closed 
because the running thread was actually killed, erasing the exit_code 
that terminate_process had set.
This patch actually fixes it.

A+
-- 
Eric Pouech
-------------- next part --------------
Name:          tk
ChangeLog:     process termination was incorrectly setting exit_code
License:       X11
GenDate:       2003/06/08 09:27:56 UTC
ModifiedFiles: server/thread.h server/process.c server/thread.c
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/server/thread.h,v
retrieving revision 1.52
diff -u -u -r1.52 thread.h
--- server/thread.h	4 Apr 2003 22:26:34 -0000	1.52
+++ server/thread.h	8 Jun 2003 09:25:01 -0000
@@ -37,6 +37,7 @@
 enum run_state
 {
     RUNNING,    /* running normally */
+    TERMINATING,/* being terminated */
     TERMINATED  /* terminated */
 };
 
@@ -82,7 +83,7 @@
     struct fd             *request_fd;    /* fd for receiving client requests */
     struct fd             *reply_fd;      /* fd to send a reply to a client */
     struct fd             *wait_fd;       /* fd to use to wake a sleeping client */
-    enum run_state         state;         /* running state */
+    enum run_state         states;         /* running state */
     int                    attached;      /* is thread attached with ptrace? */
     int                    exit_code;     /* thread exit code */
     int                    unix_pid;      /* Unix pid of client */
Index: server/process.c
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/server/process.c,v
retrieving revision 1.104
diff -u -u -r1.104 process.c
--- server/process.c	18 Mar 2003 05:04:33 -0000	1.104
+++ server/process.c	7 Jun 2003 20:36:57 -0000
@@ -688,8 +659,10 @@
     while (thread)
     {
         struct thread *next = thread->proc_next;
-        thread->exit_code = exit_code;
+        if (thread->state == RUNNING)
+            thread->exit_code = exit_code;
         if (thread != skip) kill_thread( thread, 1 );
+        else thread->state = TERMINATING;
         thread = next;
     }
 }
Index: server/thread.c
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/server/thread.c,v
retrieving revision 1.97
diff -u -u -r1.97 thread.c
--- server/thread.c	4 Apr 2003 22:26:34 -0000	1.97
+++ server/thread.c	8 Jun 2003 09:27:33 -0000
@@ -589,7 +589,7 @@
 
     /* cancel a possible previous APC with the same owner */
     if (owner) thread_cancel_apc( thread, owner, system );
-    if (thread->state == TERMINATED) return 0;
+    if (thread->state != RUNNING) return 0;
 
     if (!(apc = mem_alloc( sizeof(*apc) ))) return 0;
     apc->prev   = queue->tail;
@@ -764,12 +764,12 @@
     int total = 0;
 
     for (thread = first_thread; thread; thread = thread->next)
-        if (thread->state != TERMINATED) total++;
+        if (thread->state == RUNNING) total++;
     if (!total || !(snapshot = mem_alloc( sizeof(*snapshot) * total ))) return NULL;
     ptr = snapshot;
     for (thread = first_thread; thread; thread = thread->next)
     {
-        if (thread->state == TERMINATED) continue;
+        if (thread->state != RUNNING) continue;
         ptr->thread   = thread;
         ptr->count    = thread->obj.refcount;
         ptr->priority = thread->priority;
@@ -908,7 +908,7 @@
     {
         reply->tid            = get_thread_id( thread );
         reply->teb            = thread->teb;
-        reply->exit_code      = (thread->state == TERMINATED) ? thread->exit_code : STILL_ACTIVE;
+        reply->exit_code      = (thread->state == RUNNING) ? STILL_ACTIVE : thread->exit_code;
         reply->priority       = thread->priority;
         reply->creation_time  = thread->creation_time;
         reply->exit_time      = thread->exit_time;
@@ -936,7 +936,7 @@
 
     if ((thread = get_thread_from_handle( req->handle, THREAD_SUSPEND_RESUME )))
     {
-        if (thread->state == TERMINATED) set_error( STATUS_ACCESS_DENIED );
+        if (thread->state != RUNNING) set_error( STATUS_ACCESS_DENIED );
         else reply->count = suspend_thread( thread );
         release_object( thread );
     }
@@ -949,7 +949,7 @@
 
     if ((thread = get_thread_from_handle( req->handle, THREAD_SUSPEND_RESUME )))
     {
-        if (thread->state == TERMINATED) set_error( STATUS_ACCESS_DENIED );
+        if (thread->state != RUNNING) set_error( STATUS_ACCESS_DENIED );
         else reply->count = resume_thread( thread );
         release_object( thread );
     }


More information about the wine-patches mailing list