server: Implementation of the restart wineserver (eterbug #4171)
authorIlya Shpigor <shpigor@etersoft.ru>
Fri, 21 Aug 2009 09:28:41 +0000 (13:28 +0400)
committerVitaly Lipatov <lav@etersoft.ru>
Thu, 27 Aug 2009 15:45:42 +0000 (19:45 +0400)
include/wine/server_protocol.h
server/process.c
server/protocol.def
server/request.h
server/trace.c

index d6301ef06ab3b40f55a7416a27f04d14128cbf66..e872f3c3d8a66b8229ceb4480eb871d7f1ed2686 100644 (file)
@@ -4534,6 +4534,17 @@ struct close_lock_fd_reply
 };
 
 
+struct kill_wineserver_request
+{
+    struct request_header __header;
+    int signal;
+};
+struct kill_wineserver_reply
+{
+    struct reply_header __header;
+};
+
+
 enum request
 {
     REQ_new_process,
@@ -4775,6 +4786,7 @@ enum request
     REQ_get_device_name,
     REQ_get_device,
     REQ_close_lock_fd,
+    REQ_kill_wineserver,
     REQ_NB_REQUESTS
 };
 
@@ -5021,6 +5033,7 @@ union generic_request
     struct get_device_name_request get_device_name_request;
     struct get_device_request get_device_request;
     struct close_lock_fd_request close_lock_fd_request;
+    struct kill_wineserver_request kill_wineserver_request;
 };
 union generic_reply
 {
@@ -5265,8 +5278,9 @@ union generic_reply
     struct get_device_name_reply get_device_name_reply;
     struct get_device_reply get_device_reply;
     struct close_lock_fd_reply close_lock_fd_reply;
+    struct kill_wineserver_reply kill_wineserver_reply;
 };
 
-#define SERVER_PROTOCOL_VERSION 10385
+#define SERVER_PROTOCOL_VERSION 10386
 
 #endif /* __WINE_WINE_SERVER_PROTOCOL_H */
index 8a4fb15a711ea5c0eac29d8800ddac3ebe2085dd..c757b29c6212d8bc5089b8ebd9b345fb4eb40654 100644 (file)
@@ -1222,3 +1222,15 @@ DECL_HANDLER(make_process_system)
             shutdown_timeout = add_timeout_user( master_socket_timeout, server_shutdown_timeout, NULL );
     }
 }
+
+/* kill the wineserver process */
+DECL_HANDLER(kill_wineserver)
+{
+    int ret;
+
+    if (req->signal)
+        ret = kill_lock_owner( req->signal );
+    else
+        ret = kill_lock_owner( -1 );
+    exit( !ret );
+}
index b91a9c522e3dfaa60ac0aa02633d02575154238b..5395ad0c6f0234f7e7eac577acb7f57d314d63b4 100644 (file)
@@ -3140,3 +3140,8 @@ enum message_type
 @REQ(close_lock_fd)
     VARARG(filename,string);      /* file name */
 @END
+
+/* Kill the wineserver process */
+@REQ(kill_wineserver)
+    int signal;                   /* sending signal */
+@END
index ec56d063d6a9857dd3740ea2dec8e7082475a914..148bab97be8c62e0a5b649e07c30c166c7755d28 100644 (file)
@@ -350,6 +350,7 @@ DECL_HANDLER(set_window_layered_info);
 DECL_HANDLER(get_device_name);
 DECL_HANDLER(get_device);
 DECL_HANDLER(close_lock_fd);
+DECL_HANDLER(kill_wineserver);
 
 #ifdef WANT_REQUEST_HANDLERS
 
@@ -595,6 +596,7 @@ static const req_handler req_handlers[REQ_NB_REQUESTS] =
     (req_handler)req_get_device_name,
     (req_handler)req_get_device,
     (req_handler)req_close_lock_fd,
+    (req_handler)req_kill_wineserver,
 };
 
 C_ASSERT( sizeof(affinity_t) == 8 );
@@ -1899,6 +1901,7 @@ C_ASSERT( FIELD_OFFSET(struct get_device_request, manager) == 20 );
 C_ASSERT( FIELD_OFFSET(struct get_device_reply, user_ptr) == 8 );
 C_ASSERT( sizeof(struct get_device_reply) == 16 );
 C_ASSERT( sizeof(struct close_lock_fd_request) == 16 );
+C_ASSERT( sizeof(struct kill_wineserver_request) == 16 );
 
 #endif  /* WANT_REQUEST_HANDLERS */
 
index d7031dac380433ea6a768ef39447825ca62a8675..2e7a543d5e8db2d43c3f6d5169584d806485eac4 100644 (file)
@@ -4046,6 +4046,10 @@ static void dump_close_lock_fd_request( const struct close_lock_fd_request *req
     dump_varargs_string( cur_size );
 }
 
+static void dump_kill_wineserver_request( const struct kill_wineserver_request *req )
+{
+}
+
 static const dump_func req_dumpers[REQ_NB_REQUESTS] = {
     (dump_func)dump_new_process_request,
     (dump_func)dump_get_new_process_info_request,
@@ -4286,6 +4290,7 @@ static const dump_func req_dumpers[REQ_NB_REQUESTS] = {
     (dump_func)dump_get_device_name_request,
     (dump_func)dump_get_device_request,
     (dump_func)dump_close_lock_fd_request,
+    (dump_func)dump_kill_wineserver_request,
 };
 
 static const dump_func reply_dumpers[REQ_NB_REQUESTS] = {
@@ -4528,6 +4533,7 @@ static const dump_func reply_dumpers[REQ_NB_REQUESTS] = {
     (dump_func)dump_get_device_name_reply,
     (dump_func)dump_get_device_reply,
     NULL,
+    NULL,
 };
 
 static const char * const req_names[REQ_NB_REQUESTS] = {
@@ -4770,6 +4776,7 @@ static const char * const req_names[REQ_NB_REQUESTS] = {
     "get_device_name",
     "get_device",
     "close_lock_fd",
+    "kill_wineserver",
 };
 
 static const struct