Alexandre Julliard : server: Don' t report a fatal protocol error for things that we can recover from.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Jun 8 05:06:08 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: 5558652ea3607f282c280000e3fef47f6be4319d
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=5558652ea3607f282c280000e3fef47f6be4319d

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Jun  8 10:26:02 2006 +0200

server: Don't report a fatal protocol error for things that we can recover from.

---

 server/event.c   |    3 ++-
 server/process.c |    4 ++--
 server/request.c |    6 +++++-
 server/thread.c  |   26 +++++++++++---------------
 server/trace.c   |    1 +
 5 files changed, 21 insertions(+), 19 deletions(-)

diff --git a/server/event.c b/server/event.c
index 71c8a81..47dde24 100644
--- a/server/event.c
+++ b/server/event.c
@@ -215,7 +215,8 @@ DECL_HANDLER(event_op)
         reset_event( event );
         break;
     default:
-        fatal_protocol_error( current, "event_op: invalid operation %d\n", req->op );
+        set_error( STATUS_INVALID_PARAMETER );
+        break;
     }
     release_object( event );
 }
diff --git a/server/process.c b/server/process.c
index 3d53115..0c71540 100644
--- a/server/process.c
+++ b/server/process.c
@@ -335,7 +335,7 @@ size_t init_process( struct thread *thre
     if (!process->handles) process->handles = alloc_handle_table( process, 0 );
     if (!process->handles)
     {
-        fatal_protocol_error( thread, "Failed to allocate handle table\n" );
+        set_error( STATUS_NO_MEMORY );
         return 0;
     }
 
@@ -895,7 +895,7 @@ DECL_HANDLER(init_process_done)
 
     if (is_process_init_done(process))
     {
-        fatal_protocol_error( current, "init_process_done: called twice\n" );
+        set_error( STATUS_INVALID_PARAMETER );
         return;
     }
     if (!(dll = find_process_dll( process, req->module )))
diff --git a/server/request.c b/server/request.c
index 9ae5fa4..a78916e 100644
--- a/server/request.c
+++ b/server/request.c
@@ -293,7 +293,11 @@ static void call_req_handler( struct thr
             if (debug_level) trace_reply( req, &reply );
             send_reply( &reply );
         }
-        else fatal_protocol_error( current, "no reply fd for request %d\n", req );
+        else
+        {
+            current->exit_code = 1;
+            kill_thread( current, 1 );  /* no way to continue without reply fd */
+        }
     }
     current = NULL;
 }
diff --git a/server/thread.c b/server/thread.c
index bc8b4f4..40b9615 100644
--- a/server/thread.c
+++ b/server/thread.c
@@ -842,26 +842,22 @@ DECL_HANDLER(init_thread)
     int reply_fd = thread_get_inflight_fd( current, req->reply_fd );
     int wait_fd = thread_get_inflight_fd( current, req->wait_fd );
 
-    if (current->unix_pid != -1)
+    if (current->reply_fd)  /* already initialised */
     {
-        fatal_protocol_error( current, "init_thread: already running\n" );
-        goto error;
-    }
-    if (reply_fd == -1 || fcntl( reply_fd, F_SETFL, O_NONBLOCK ) == -1)
-    {
-        fatal_protocol_error( current, "bad reply fd\n" );
+        set_error( STATUS_INVALID_PARAMETER );
         goto error;
     }
+
+    if (reply_fd == -1 || fcntl( reply_fd, F_SETFL, O_NONBLOCK ) == -1) goto error;
+
+    current->reply_fd = create_anonymous_fd( &thread_fd_ops, reply_fd, &current->obj );
+    reply_fd = -1;
+    if (!current->reply_fd) goto error;
+
     if (wait_fd == -1)
     {
-        fatal_protocol_error( current, "bad wait fd\n" );
-        goto error;
-    }
-    if (!(current->reply_fd = create_anonymous_fd( &thread_fd_ops, reply_fd, &current->obj )))
-    {
-        reply_fd = -1;
-        fatal_protocol_error( current, "could not allocate reply fd\n" );
-        goto error;
+        set_error( STATUS_TOO_MANY_OPENED_FILES );  /* most likely reason */
+        return;
     }
     if (!(current->wait_fd  = create_anonymous_fd( &thread_fd_ops, wait_fd, &current->obj )))
         return;
diff --git a/server/trace.c b/server/trace.c
index 5d2c525..9b5cc39 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -3980,6 +3980,7 @@ static const struct
     { "SHARING_VIOLATION",           STATUS_SHARING_VIOLATION },
     { "SUSPEND_COUNT_EXCEEDED",      STATUS_SUSPEND_COUNT_EXCEEDED },
     { "TIMEOUT",                     STATUS_TIMEOUT },
+    { "TOO_MANY_OPENED_FILES",       STATUS_TOO_MANY_OPENED_FILES },
     { "UNSUCCESSFUL",                STATUS_UNSUCCESSFUL },
     { "VOLUME_DISMOUNTED",           STATUS_VOLUME_DISMOUNTED },
     { "WAS_LOCKED",                  STATUS_WAS_LOCKED },




More information about the wine-cvs mailing list