Console fix #2 (resent)

eric pouech eric.pouech at wanadoo.fr
Sun Dec 2 09:44:48 CST 2001


his patch changes the way the console renderer is handled in the
server. it was a process, it's now a thread... this would allow
(not sure it's going to be done though) to have a single process
handle several consoles

A+
-- 
---------------
Eric Pouech (http://perso.wanadoo.fr/eric.pouech/)
"The future will be better tomorrow", Vice President Dan Quayle
-------------- next part --------------
Name: cs_rndr
ChangeLog: let the console renderer be defined as a thread
GenDate: 2001/12/01 20:07:21 UTC
ModifiedFiles: server/console.c server/console.h server/debugger.c server/process.c server/process.h server/thread.c
AddedFiles: 
===================================================================
RCS file: /usr/share/cvs/cvsroot/wine/wine/server/console.c,v
retrieving revision 1.30
diff -u -u -r1.30 console.c
--- server/console.c	2001/11/30 18:46:50	1.30
+++ server/console.c	2001/12/01 12:37:14
@@ -180,7 +180,7 @@
     return evt;
 }
 
-static struct object *create_console_input( struct process* renderer )
+static struct object *create_console_input( struct thread* renderer )
 {
     struct console_input *console_input;
 
@@ -310,9 +310,10 @@
  *	2/ parent is a renderer which launches process, and process should attach to the console
  *	   renderered by parent
  */
-void inherit_console(struct process *parent, struct process *process, handle_t hconin)
+void inherit_console(struct thread *parent_thread, struct process *process, handle_t hconin)
 {
     int done = 0;
+    struct process* parent = parent_thread->process;
 
     /* if parent is a renderer, then attach current process to its console
      * a bit hacky....
@@ -323,7 +324,7 @@
 
         if ((console = (struct console_input*)get_handle_obj( parent, hconin, 0, NULL )))
 	{
-	    if (console->renderer == parent)
+	    if (console->renderer == parent_thread)
 	    {
 		process->console = (struct console_input*)grab_object( console );
 		process->console->num_proc++;
@@ -1097,7 +1098,7 @@
         goto the_end;
     }
 
-    if ((console = (struct console_input*)create_console_input( renderer )))
+    if ((console = (struct console_input*)create_console_input( current )))
     {
         if ((in = alloc_handle( renderer, console, req->access, req->inherit )))
         {
Index: server/console.h
===================================================================
RCS file: /usr/share/cvs/cvsroot/wine/wine/server/console.h,v
retrieving revision 1.2
diff -u -u -r1.2 console.h
--- server/console.h	2001/11/30 18:46:50	1.2
+++ server/console.h	2001/11/30 20:49:58
@@ -16,7 +16,7 @@
 {
     struct object                obj;           /* object header */
     int                          num_proc;      /* number of processes attached to this console */
-    struct process              *renderer;      /* console renderer thread */
+    struct thread               *renderer;      /* console renderer thread */
     int                          mode;          /* input mode */
     struct screen_buffer        *active;        /* active screen buffer */
     int                          recnum;        /* number of input records */
@@ -31,7 +31,7 @@
 
 /* console functions */
 
-extern void inherit_console(struct process *parent, struct process *process, handle_t hconin);
+extern void inherit_console(struct thread *parent_thread, struct process *process, handle_t hconin);
 extern int free_console( struct process *process );
 
 #endif  /* __WINE_SERVER_CONSOLE_H */
Index: server/debugger.c
===================================================================
RCS file: /usr/share/cvs/cvsroot/wine/wine/server/debugger.c,v
retrieving revision 1.33
diff -u -u -r1.33 debugger.c
--- server/debugger.c	2001/11/30 18:46:50	1.33
+++ server/debugger.c	2001/11/30 22:29:43
@@ -413,9 +413,8 @@
         if (thread->process == process) goto error;
 
     /* don't let a debugger debug its console... won't work */
-    if (debugger->process->console &&
-        debugger->process->console->renderer == process &&
-        process->console) goto error;
+    if (debugger->process->console && debugger->process->console->renderer->process == process)
+        goto error;
 
     suspend_process( process );
 
Index: server/process.c
===================================================================
RCS file: /usr/share/cvs/cvsroot/wine/wine/server/process.c,v
retrieving revision 1.74
diff -u -u -r1.74 process.c
--- server/process.c	2001/11/30 18:46:50	1.74
+++ server/process.c	2001/11/30 21:05:55
@@ -97,7 +97,7 @@
 
 
 /* set the console and stdio handles for a newly created process */
-static int set_process_console( struct process *process, struct process *parent,
+static int set_process_console( struct process *process, struct thread *parent_thread,
                                 struct startup_info *info, struct init_process_reply *reply )
 {
     if (process->create_flags & CREATE_NEW_CONSOLE)
@@ -105,26 +105,26 @@
         /* let the process init do the allocation */
         return 1;
     }
-    else if (parent && !(process->create_flags & DETACHED_PROCESS))
+    else if (parent_thread && !(process->create_flags & DETACHED_PROCESS))
     {
         /* FIXME: some better error checking should be done...
          * like if hConOut and hConIn are console handles, then they should be on the same
          * physical console
          */
-        inherit_console( parent, process,
+        inherit_console( parent_thread, process,
                          (info->inherit_all || (info->start_flags & STARTF_USESTDHANDLES)) ?
                          info->hstdin : 0 );
     }
-    if (parent)
+    if (parent_thread)
     {
         if (!info->inherit_all && !(info->start_flags & STARTF_USESTDHANDLES))
         {
             /* duplicate the handle from the parent into this process */
-            reply->hstdin  = duplicate_handle( parent, info->hstdin, process,
+            reply->hstdin  = duplicate_handle( parent_thread->process, info->hstdin, process,
                                                0, TRUE, DUPLICATE_SAME_ACCESS );
-            reply->hstdout = duplicate_handle( parent, info->hstdout, process,
+            reply->hstdout = duplicate_handle( parent_thread->process, info->hstdout, process,
                                                0, TRUE, DUPLICATE_SAME_ACCESS );
-            reply->hstderr = duplicate_handle( parent, info->hstderr, process,
+            reply->hstderr = duplicate_handle( parent_thread->process, info->hstderr, process,
                                                0, TRUE, DUPLICATE_SAME_ACCESS );
         }
         else
@@ -260,7 +260,7 @@
     }
 
     /* set the process console */
-    if (!set_process_console( process, parent, info, reply )) return;
+    if (!set_process_console( process, parent_thread, info, reply )) return;
 
     if (parent)
     {
@@ -434,7 +434,7 @@
 }
 
 /* kill all processes being attached to a console renderer */
-static void kill_console_processes( struct process *renderer, int exit_code )
+void kill_console_processes( struct thread *renderer, int exit_code )
 {
     for (;;)  /* restart from the beginning of the list every time */
     {
@@ -442,7 +442,7 @@
 
         /* find the first process being attached to 'renderer' and still running */
         while (process &&
-               (process == renderer || !process->console ||
+               (process == renderer->process || !process->console ||
                 process->console->renderer != renderer || !process->running_threads))
         {
             process = process->next;
@@ -462,9 +462,6 @@
 
     /* close the console attached to this process, if any */
     free_console( process );
-
-    /* close the processes using process as renderer, if any */
-    kill_console_processes( process, 0 );
 
     while (process->exe.next)
     {
Index: server/process.h
===================================================================
RCS file: /usr/share/cvs/cvsroot/wine/wine/server/process.h,v
retrieving revision 1.23
diff -u -u -r1.23 process.h
--- server/process.h	2001/11/23 23:05:07	1.23
+++ server/process.h	2001/11/30 20:21:22
@@ -78,6 +78,7 @@
 extern void suspend_process( struct process *process );
 extern void resume_process( struct process *process );
 extern void kill_process( struct process *process, struct thread *skip, int exit_code );
+extern void kill_console_processes( struct thread *renderer, int exit_code );
 extern void kill_debugged_processes( struct thread *debugger, int exit_code );
 extern struct process_snapshot *process_snap( int *count );
 extern struct module_snapshot *module_snap( struct process *process, int *count );
Index: server/thread.c
===================================================================
RCS file: /usr/share/cvs/cvsroot/wine/wine/server/thread.c,v
retrieving revision 1.70
diff -u -u -r1.70 thread.c
--- server/thread.c	2001/11/30 18:46:50	1.70
+++ server/thread.c	2001/11/30 20:50:02
@@ -698,6 +698,7 @@
         /* if it is waiting on the socket, we don't need to send a SIGTERM */
         violent_death = 0;
     }
+    kill_console_processes( thread, 0 );
     debug_exit_thread( thread );
     abandon_mutexes( thread );
     remove_process_thread( thread->process, thread );


More information about the wine-patches mailing list