summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile4
-rw-r--r--cursor.c6
-rw-r--r--main.c12
-rw-r--r--rfb.h45
-rw-r--r--rfbserver.c1
-rw-r--r--sockets.c15
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));