Alexandre Julliard : server: Make sure to completely kill processes before returning from a wineserver -k .

Alexandre Julliard julliard at wine.codeweavers.com
Mon Aug 14 14:10:24 CDT 2006


Module: wine
Branch: master
Commit: 3a4c04dce412678f227c32723cd39e9163e6668b
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=3a4c04dce412678f227c32723cd39e9163e6668b

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Aug 14 20:40:31 2006 +0200

server: Make sure to completely kill processes before returning from a wineserver -k.

---

 server/request.c |   20 ++++++++++++++------
 server/request.h |    2 +-
 server/signal.c  |    3 ++-
 3 files changed, 17 insertions(+), 8 deletions(-)

diff --git a/server/request.c b/server/request.c
index fd8e584..ac5a696 100644
--- a/server/request.c
+++ b/server/request.c
@@ -117,6 +117,7 @@ unsigned int global_error = 0;  /* globa
 struct timeval server_start_time = { 0, 0 };  /* server startup time */
 
 static struct master_socket *master_socket;  /* the master socket object */
+static int force_shutdown;
 
 /* socket communication static structures */
 static struct iovec myiovec;
@@ -497,7 +498,7 @@ static void master_socket_poll_event( st
     {
         /* this is not supposed to happen */
         fprintf( stderr, "wineserver: Error on master socket\n" );
-        release_object( sock );
+        set_fd_events( sock->fd, -1 );
     }
     else if (event & POLLIN)
     {
@@ -811,14 +812,14 @@ static void close_socket_timeout( void *
     flush_registry();
 
     /* if a new client is waiting, we keep on running */
-    if (check_fd_events( master_socket->fd, POLLIN )) return;
+    if (!force_shutdown && check_fd_events( master_socket->fd, POLLIN )) return;
 
     if (debug_level) fprintf( stderr, "wineserver: exiting (pid=%ld)\n", (long) getpid() );
 
 #ifdef DEBUG_OBJECTS
     close_objects();  /* shut down everything properly */
 #endif
-    exit(0);
+    exit( force_shutdown );
 }
 
 /* close the master socket and stop waiting for new clients */
@@ -835,8 +836,15 @@ void close_master_socket(void)
     else close_socket_timeout( NULL );  /* close it right away */
 }
 
-/* lock/unlock the master socket to stop accepting new clients */
-void lock_master_socket( int locked )
+/* forced shutdown, used for wineserver -k */
+void shutdown_master_socket(void)
 {
-    set_fd_events( master_socket->fd, locked ? 0 : POLLIN );
+    force_shutdown = 1;
+    master_socket_timeout = 0;
+    if (master_socket->timeout)
+    {
+        remove_timeout_user( master_socket->timeout );
+        close_socket_timeout( NULL );
+    }
+    set_fd_events( master_socket->fd, -1 ); /* stop waiting for new clients */
 }
diff --git a/server/request.h b/server/request.h
index 751473f..aad0387 100644
--- a/server/request.h
+++ b/server/request.h
@@ -58,7 +58,7 @@ extern void write_reply( struct thread *
 extern unsigned int get_tick_count(void);
 extern void open_master_socket(void);
 extern void close_master_socket(void);
-extern void lock_master_socket( int locked );
+extern void shutdown_master_socket(void);
 extern int wait_for_lock(void);
 extern int kill_lock_owner( int sig );
 
diff --git a/server/signal.c b/server/signal.c
index 8f638d8..006a470 100644
--- a/server/signal.c
+++ b/server/signal.c
@@ -38,6 +38,7 @@ #include "file.h"
 #include "object.h"
 #include "process.h"
 #include "thread.h"
+#include "request.h"
 
 #if defined(linux) && defined(__SIGRTMIN)
 /* the signal used by linuxthreads as exit signal for clone() threads */
@@ -185,7 +186,7 @@ static void sigint_callback(void)
 {
     kill_all_processes( NULL, 1 );
     flush_registry();
-    exit(1);
+    shutdown_master_socket();
 }
 
 /* SIGHUP handler */




More information about the wine-cvs mailing list