From fad7881732f39780fecd0a0c678392f002b88e26 Mon Sep 17 00:00:00 2001 From: dscho Date: Wed, 10 Oct 2001 15:07:17 +0000 Subject: [PATCH] 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));