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); }