[prev in list] [next in list] [prev in thread] [next in thread] 

List:       mysql-internals
Subject:    proposed patch for bug#33899
From:       Armin Schöffmann <armin.schoeffmann () aegaeon ! de>
Date:       2008-03-18 20:46:08
Message-ID: 1E21D2CC25DEC240850F6CB5B780A8A80131C0 () server ! aegaeon ! de ! local
[Download RAW message or body]

[Attachment #2 (text/plain)]

Hello folks,

http://bugs.mysql.com/bug.php?id=33899 (Client deadlock with shared-memory)

After having quite some trouble with this issue, I finally managed to fix it.

Please verify my changes in viosocket.c - I'd be really thankful, if the patch could \
make it into the next enterprise-build,  as I hate to ship private lib/client-builds \
to customers.

Regards,
Armin.


["patch_bug#33899.txt" (text/plain)]

--- viosocket.c	2008-03-18 20:54:02.125254000 +0100
+++ patch_bug#33899_viosocket.c	2008-03-18 20:50:01.584985500 +0100
@@ -479,19 +479,21 @@
   int length;
   int remain_local;
   char *current_postion;
+  HANDLE events[2];
 
   DBUG_ENTER("vio_read_shared_memory");
   DBUG_PRINT("enter", ("sd: %d  buf: 0x%lx  size: %d", vio->sd, buf, size));
 
   remain_local = size;
   current_postion=buf;
+
+  events[0]= vio->event_server_wrote;
+  events[1]= vio->event_conn_closed;
+
   do
   {
     if (vio->shared_memory_remain == 0)
     {
-      HANDLE events[2];
-      events[0]= vio->event_server_wrote;
-      events[1]= vio->event_conn_closed;
       /*
         WaitForMultipleObjects can return next values:
          WAIT_OBJECT_0+0 - event from vio->event_server_wrote
@@ -538,6 +540,7 @@
   int length;
   uint remain;
   HANDLE pos;
+  HANDLE events[2];
   int sz;
   char *current_postion;
 
@@ -546,10 +549,14 @@
 
   remain = size;
   current_postion = buf;
+
+  events[0]= vio->event_server_read;
+  events[1]= vio->event_conn_closed;
+
   while (remain != 0)
   {
-    if (WaitForSingleObject(vio->event_server_read, vio->net->write_timeout*1000) 
-                            != WAIT_OBJECT_0)
+    if (WaitForMultipleObjects(2,events,FALSE,
+							   vio->net->write_timeout*1000) != WAIT_OBJECT_0)
     {
       DBUG_RETURN(-1);
     };


-- 
MySQL Internals Mailing List
For list archives: http://lists.mysql.com/internals
To unsubscribe:    http://lists.mysql.com/internals?unsub=mysql-internals@progressive-comp.com

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic