Blob Blame History Raw
diff -ru xen-unstable-11405.orig/LibVNCServer-0.8.2/libvncserver/main.c xen-unstable-11405/LibVNCServer-0.8.2/libvncserver/main.c
--- xen-unstable-11405.orig/LibVNCServer-0.8.2/libvncserver/main.c	2006-05-28 16:38:26.000000000 -0400
+++ xen-unstable-11405/LibVNCServer-0.8.2/libvncserver/main.c	2006-09-12 14:23:09.000000000 -0400
@@ -454,13 +454,10 @@
 		updateRegion = sraRgnCreateRgn(cl->modifiedRegion);
 		haveUpdate = sraRgnAnd(updateRegion,cl->requestedRegion);
 		sraRgnDestroy(updateRegion);
-	    }
-	    UNLOCK(cl->updateMutex);
 
-            if (!haveUpdate) {
                 WAIT(cl->updateCond, cl->updateMutex);
-		UNLOCK(cl->updateMutex); /* we really needn't lock now. */
             }
+            UNLOCK(cl->updateMutex);
         }
         
         /* OK, now, to save bandwidth, wait a little while for more
@@ -497,21 +494,25 @@
     while (1) {
 	fd_set rfds, wfds, efds;
 	struct timeval tv;
-	int n;
+	int n, sock;
+
+	LOCK(cl->updateMutex);
+	sock = cl->sock;
+	UNLOCK(cl->updateMutex);
 
 	FD_ZERO(&rfds);
-	FD_SET(cl->sock, &rfds);
+	FD_SET(sock, &rfds);
 	FD_ZERO(&efds);
-	FD_SET(cl->sock, &efds);
+	FD_SET(sock, &efds);
 
 	/* Are we transferring a file in the background? */
 	FD_ZERO(&wfds);
 	if ((cl->fileTransfer.fd!=-1) && (cl->fileTransfer.sending==1))
-	    FD_SET(cl->sock, &wfds);
+	    FD_SET(sock, &wfds);
 
 	tv.tv_sec = 60; /* 1 minute */
 	tv.tv_usec = 0;
-	n = select(cl->sock + 1, &rfds, &wfds, &efds, &tv);
+	n = select(sock + 1, &rfds, &wfds, &efds, &tv);
 	if (n < 0) {
 	    rfbLogPerror("ReadExact: select");
 	    break;
@@ -523,16 +524,19 @@
         }
         
         /* We have some space on the transmit queue, send some data */
-        if (FD_ISSET(cl->sock, &wfds))
+        if (FD_ISSET(sock, &wfds))
             rfbSendFileTransferChunk(cl);
 
-        if (FD_ISSET(cl->sock, &rfds) || FD_ISSET(cl->sock, &efds))
+        if (FD_ISSET(sock, &rfds) || FD_ISSET(sock, &efds))
             rfbProcessClientMessage(cl);
 
-        if (cl->sock == -1) {
-            /* Client has disconnected. */
-            break;
-        }
+	LOCK(cl->updateMutex);
+	if (cl->sock == -1) {
+	    UNLOCK(cl->updateMutex);
+	    /* Client has disconnected. */
+	    break;
+	}
+	UNLOCK(cl->updateMutex);
     }
 
     /* Get rid of the output thread. */
diff -ru xen-unstable-11405.orig/LibVNCServer-0.8.2/libvncserver/rfbserver.c xen-unstable-11405/LibVNCServer-0.8.2/libvncserver/rfbserver.c
--- xen-unstable-11405.orig/LibVNCServer-0.8.2/libvncserver/rfbserver.c	2006-06-05 14:50:45.000000000 -0400
+++ xen-unstable-11405/LibVNCServer-0.8.2/libvncserver/rfbserver.c	2006-09-12 13:02:06.000000000 -0400
@@ -492,9 +492,9 @@
       do {
 	LOCK(cl->refCountMutex);
 	i=cl->refCount;
-	UNLOCK(cl->refCountMutex);
 	if(i>0)
 	  WAIT(cl->deleteCond,cl->refCountMutex);
+	UNLOCK(cl->refCountMutex);
       } while(i>0);
     }
 #endif