summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordscho <dscho>2003-02-10 20:09:20 +0000
committerdscho <dscho>2003-02-10 20:09:20 +0000
commitd3bb5fb6eb920b7149fa5544ef893afa038b772c (patch)
tree3745bf6ef54f3b8822430a9cd4d37fe080f56003
parent2a48679c1c790f1e73ada20be0b73b2be604eabd (diff)
downloadlibtdevnc-d3bb5fb6eb920b7149fa5544ef893afa038b772c.tar.gz
libtdevnc-d3bb5fb6eb920b7149fa5544ef893afa038b772c.zip
fixed a bug that prevented the first connection to be closed
-rw-r--r--main.c5
-rw-r--r--rfbserver.c18
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
@@ -119,6 +119,21 @@ rfbGetClientIterator(rfbScreenInfoPtr rfbScreen)
}
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)
{
if(i->next == 0) {
@@ -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);
}