From fad7881732f39780fecd0a0c678392f002b88e26 Mon Sep 17 00:00:00 2001
From: dscho <dscho>
Date: Wed, 10 Oct 2001 15:07:17 +0000
Subject: pthreads corrections

---
 Makefile    |  4 ++--
 cursor.c    |  6 +++++-
 main.c      | 12 +++++++-----
 rfb.h       | 45 +++++++++++++++++++++++++--------------------
 rfbserver.c |  1 +
 sockets.c   | 15 ++++++++-------
 6 files changed, 48 insertions(+), 35 deletions(-)

diff --git a/Makefile b/Makefile
index 9250308..cfaf983 100644
--- a/Makefile
+++ b/Makefile
@@ -2,8 +2,8 @@ INCLUDES=-I.
 VNCSERVERLIB=-L. -lvncserver -L/usr/local/lib -lz -ljpeg
 
 # Uncomment these two lines to enable use of PThreads
-#PTHREADDEF = -DHAVE_PTHREADS
-#PTHREADLIB = -lpthread
+PTHREADDEF = -DHAVE_PTHREADS
+PTHREADLIB = -lpthread
 
 # Comment the following line to disable the use of 3 Bytes/Pixel.
 # The code for 3 Bytes/Pixel is not very efficient!
diff --git a/cursor.c b/cursor.c
index f04dc84..5663e85 100644
--- a/cursor.c
+++ b/cursor.c
@@ -452,7 +452,11 @@ void rfbPrintXCursor(rfbCursorPtr cursor)
 extern void rfbSetCursor(rfbScreenInfoPtr rfbScreen,rfbCursorPtr c,Bool freeOld)
 {
   LOCK(rfbScreen->cursorMutex);
-  rfbUndrawCursor(rfbScreen);
+  while(rfbScreen->cursorIsDrawn) {
+    UNLOCK(rfbScreen->cursorMutex);
+    rfbUndrawCursor(rfbScreen);
+    LOCK(rfbScreen->cursorMutex);
+  }
 
   if(freeOld && rfbScreen->cursor)
     rfbFreeCursor(rfbScreen->cursor);
diff --git a/main.c b/main.c
index d1e1797..ea85123 100644
--- a/main.c
+++ b/main.c
@@ -85,17 +85,15 @@ void rfbScheduleCopyRegion(rfbScreenInfoPtr rfbScreen,sraRegionPtr copyRegion,in
 
        /* while(!sraRgnEmpty(cl->copyRegion)) */ {
 #ifdef HAVE_PTHREADS
-	 if(cl->screen->backgroundLoop) {
-	   SIGNAL(cl->updateCond);
-	   UNLOCK(cl->updateMutex);
-	   LOCK(cl->updateMutex);
-	 } else
+	 if(!cl->screen->backgroundLoop)
 #endif
 	   {
 	     sraRegionPtr updateRegion = sraRgnCreateRgn(cl->modifiedRegion);
 	     sraRgnOr(updateRegion,cl->copyRegion);
+	     UNLOCK(cl->updateMutex);
 	     rfbSendFramebufferUpdate(cl,updateRegion);
 	     sraRgnDestroy(updateRegion);
+	     continue;
 	   }
        }
      } else {
@@ -525,7 +523,11 @@ void rfbScreenCleanup(rfbScreenInfoPtr rfbScreen)
   free(rfbScreen);
 }
 
+#ifdef HAVE_PTHREADS
+void rfbInitServerWithPthreads(rfbScreenInfoPtr rfbScreen)
+#else
 void rfbInitServer(rfbScreenInfoPtr rfbScreen)
+#endif
 {
 #ifdef WIN32
   WSADATA trash;
diff --git a/rfb.h b/rfb.h
index 24ee3c0..2914a85 100644
--- a/rfb.h
+++ b/rfb.h
@@ -172,7 +172,7 @@ typedef struct {
 #undef MUTEX
 #define MUTEX(mutex) char dummy##mutex
 #undef COND
-#define COND(cont) char dummy##cond
+#define COND(cond) char dummy##cond
 #endif
 
 /*
@@ -280,11 +280,6 @@ typedef struct
     char* underCursorBuffer;
     Bool dontConvertRichCursorToXCursor;
     struct rfbCursor* cursor;
-    MUTEX(cursorMutex);
-
-#ifdef HAVE_PTHREADS
-    Bool backgroundLoop;
-#endif
 
     /* the following members have to be supplied by the serving process */
     char* frameBuffer;
@@ -300,6 +295,11 @@ typedef struct
     /* displayHook is called just before a frame buffer update */
     DisplayHookPtr displayHook;
 
+    MUTEX(cursorMutex);
+#ifdef HAVE_PTHREADS
+    Bool backgroundLoop;
+#endif
+
 } rfbScreenInfo, *rfbScreenInfoPtr;
 
 
@@ -398,20 +398,6 @@ typedef struct rfbClientRec {
     int copyDX, copyDY;		/* the translation by which the copy happens */
 
 
-#ifdef HAVE_PTHREADS
-    /* whenever a client is referenced, the refCount has to be incremented
-       and afterwards decremented.
-       Use the functions rfbIncrClientRef(cl) and rfbDecrClientRef(cl);
-    */
-    int refCount;
-    MUTEX(refCountMutex);
-    COND(deleteCond);
-
-    MUTEX(outputMutex);
-    MUTEX(updateMutex);
-    COND(updateCond);
-#endif
-
     sraRegionPtr modifiedRegion;
 
     /* As part of the FramebufferUpdateRequest, a client can express interest
@@ -488,6 +474,20 @@ typedef struct rfbClientRec {
     struct rfbClientRec *prev;
     struct rfbClientRec *next;
 
+#ifdef HAVE_PTHREADS
+    /* whenever a client is referenced, the refCount has to be incremented
+       and afterwards decremented.
+       Use the functions rfbIncrClientRef(cl) and rfbDecrClientRef(cl);
+    */
+    int refCount;
+    MUTEX(refCountMutex);
+    COND(deleteCond);
+
+    MUTEX(outputMutex);
+    MUTEX(updateMutex);
+    COND(updateCond);
+#endif
+
 } rfbClientRec, *rfbClientPtr;
 
 
@@ -742,6 +742,11 @@ void doNothingWithClient(rfbClientPtr cl);
 extern rfbScreenInfoPtr rfbGetScreen(int argc,char** argv,
  int width,int height,int bitsPerSample,int samplesPerPixel,
  int bytesPerPixel);
+#ifdef HAVE_PTHREADS
+#define rfbInitServer rfbInitServerWithPthreads
+#else
+#define rfbInitServer rfbInitServerWithoutPthreads
+#endif
 extern void rfbInitServer(rfbScreenInfoPtr rfbScreen);
 extern void rfbScreenCleanup(rfbScreenInfoPtr screenInfo);
 
diff --git a/rfbserver.c b/rfbserver.c
index 283d8ce..16cf8d6 100644
--- a/rfbserver.c
+++ b/rfbserver.c
@@ -137,6 +137,7 @@ rfbNewClientConnection(rfbScreen,sock)
     if(cl!=NULL)
       newConnection(cl, (KEYBOARD_DEVICE|POINTER_DEVICE),1,1,1);
 #endif
+    FD_SET(sock,&(rfbScreen->allFds));
 }
 
 
diff --git a/sockets.c b/sockets.c
index 760dc08..776fc49 100644
--- a/sockets.c
+++ b/sockets.c
@@ -111,16 +111,18 @@ rfbInitSockets(rfbScreenInfoPtr rfbScreen)
 	return;
     }
 
-    rfbLog("Listening for VNC connections on TCP port %d\n", rfbScreen->rfbPort);
+    if(rfbScreen->rfbPort>0) {
+      rfbLog("Listening for VNC connections on TCP port %d\n", rfbScreen->rfbPort);
 
-    if ((rfbScreen->rfbListenSock = ListenOnTCPPort(rfbScreen->rfbPort)) < 0) {
+      if ((rfbScreen->rfbListenSock = ListenOnTCPPort(rfbScreen->rfbPort)) < 0) {
 	rfbLogPerror("ListenOnTCPPort");
 	exit(1);
-    }
+      }
 
-    FD_ZERO(&(rfbScreen->allFds));
-    FD_SET(rfbScreen->rfbListenSock, &(rfbScreen->allFds));
-    rfbScreen->maxFd = rfbScreen->rfbListenSock;
+      FD_ZERO(&(rfbScreen->allFds));
+      FD_SET(rfbScreen->rfbListenSock, &(rfbScreen->allFds));
+      rfbScreen->maxFd = rfbScreen->rfbListenSock;
+    }
 
     if (rfbScreen->udpPort != 0) {
 	rfbLog("rfbInitSockets: listening for input on UDP port %d\n",rfbScreen->udpPort);
@@ -159,7 +161,6 @@ rfbCheckFds(rfbScreenInfoPtr rfbScreen,long usec)
     if (!rfbScreen->inetdInitDone && rfbScreen->inetdSock != -1) {
 	rfbNewClientConnection(rfbScreen,rfbScreen->inetdSock); 
 	rfbScreen->inetdInitDone = TRUE;
-        FD_SET(rfbScreen->inetdSock,&(rfbScreen->allFds));
     }
 
     memcpy((char *)&fds, (char *)&(rfbScreen->allFds), sizeof(fd_set));
-- 
cgit v1.2.3

