From d3bb5fb6eb920b7149fa5544ef893afa038b772c Mon Sep 17 00:00:00 2001
From: dscho <dscho>
Date: Mon, 10 Feb 2003 20:09:20 +0000
Subject: fixed a bug that prevented the first connection to be closed

---
 main.c      |  5 ++++-
 rfbserver.c | 18 +++++++++++++++++-
 2 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/main.c b/main.c
index 340be3b..c2d6bc3 100644
--- a/main.c
+++ b/main.c
@@ -750,6 +750,9 @@ void gettimeofday(struct timeval* tv,char* dummy)
 }
 #endif
 
+/* defined in rfbserver.c, but kind of "private" */
+rfbClientPtr rfbClientIteratorHead(rfbClientIteratorPtr i);
+
 void
 rfbProcessEvents(rfbScreenInfoPtr rfbScreen,long usec)
 {
@@ -767,7 +770,7 @@ rfbProcessEvents(rfbScreenInfoPtr rfbScreen,long usec)
 #endif
 
   i = rfbGetClientIterator(rfbScreen);
-  cl=rfbClientIteratorNext(i);
+  cl=rfbClientIteratorHead(i);
   while(cl) {
     if (cl->sock >= 0 && !cl->onHold && FB_UPDATE_PENDING(cl) &&
         !sraRgnEmpty(cl->requestedRegion)) {
diff --git a/rfbserver.c b/rfbserver.c
index 9f79b47..f8b273c 100644
--- a/rfbserver.c
+++ b/rfbserver.c
@@ -118,6 +118,21 @@ rfbGetClientIterator(rfbScreenInfoPtr rfbScreen)
   return i;
 }
 
+rfbClientPtr
+rfbClientIteratorHead(rfbClientIteratorPtr i)
+{
+#ifdef HAVE_LIBPTHREAD
+  if(i->next != 0) {
+    rfbDecrClientRef(i->next);
+    rfbIncrClientRef(i->screen->rfbClientHead);
+  }
+#endif
+  LOCK(rfbClientListMutex);
+  i->next = i->screen->rfbClientHead;
+  UNLOCK(rfbClientListMutex);
+  return i->next;
+}
+
 rfbClientPtr
 rfbClientIteratorNext(rfbClientIteratorPtr i)
 {
@@ -396,7 +411,8 @@ rfbClientConnectionGone(cl)
     LOCK(cl->refCountMutex);
     if(cl->refCount) {
       UNLOCK(cl->refCountMutex);
-      WAIT(cl->deleteCond,cl->refCountMutex);
+      if(cl->screen->backgroundLoop != FALSE)
+        WAIT(cl->deleteCond,cl->refCountMutex);
     } else {
       UNLOCK(cl->refCountMutex);
     }
-- 
cgit v1.2.3

