[X2Go-Commits] [x2gokdrive] 02/02: reiniting of frame and cursors caches by client request.
git-admin at x2go.org
git-admin at x2go.org
Thu Sep 16 09:53:54 CEST 2021
This is an automated email from the git hooks/post-receive script.
x2go pushed a commit to branch master
in repository x2gokdrive.
commit 76971de4d9a20d36210e56627a912b46148d72c5
Author: Oleksandr Shneyder <o.shneyder at phoca-gmbh.de>
Date: Thu Sep 16 09:52:08 2021 +0200
reiniting of frame and cursors caches by client request.
---
debian/changelog | 1 +
x2gokdriveremote.c | 45 ++++++++++++++++++++++++++++++++++++++++-----
x2gokdriveremote.h | 11 +++++++++--
3 files changed, 50 insertions(+), 7 deletions(-)
diff --git a/debian/changelog b/debian/changelog
index 3e17efc..1a4a4b2 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -26,6 +26,7 @@ x2gokdrive (0.0.0.1-0x2go1) UNRELEASED; urgency=medium
- fix infinite loop if reading of cookie has failed.
- improve initialization of cursor frame and cache element structures.
- improve clearing of the frame list.
+ - reiniting of frame and cursors caches by client request.
[ Mihai Moldovan ]
* Initial release:
diff --git a/x2gokdriveremote.c b/x2gokdriveremote.c
index 4125dcd..67df1c3 100644
--- a/x2gokdriveremote.c
+++ b/x2gokdriveremote.c
@@ -598,6 +598,15 @@ int send_output_selection(struct OutputChunk* chunk)
return 0;
}
+void send_reinit_notification(void)
+{
+ unsigned char buffer[56] = {0};
+ _X_UNUSED int l;
+ *((uint32_t*)buffer)=REINIT;
+ EPHYR_DBG("SENDING REINIT NOTIFICATION");
+ l=write(remoteVars.clientsock,buffer,56);
+}
+
int send_selection_chunk(int sel, unsigned char* data, uint32_t length, uint32_t format, BOOL first, BOOL last, uint32_t compressed, uint32_t total)
{
unsigned char buffer[56] = {0};
@@ -1469,7 +1478,8 @@ void *send_frame_thread (void *threadid)
- if(!remoteVars.first_sendqueue_element && !remoteVars.firstCursor && !remoteVars.selstruct.firstOutputChunk)
+ if(!remoteVars.first_sendqueue_element && !remoteVars.firstCursor && !remoteVars.selstruct.firstOutputChunk &&
+ !remoteVars.cache_rebuilt)
{
/* sleep if frame queue is empty */
pthread_cond_wait(&remoteVars.have_sendqueue_cond, &remoteVars.sendqueue_mutex);
@@ -1477,6 +1487,15 @@ void *send_frame_thread (void *threadid)
/* mutex is locked on this point */
+ //send notification to client that cache is rebuilt
+ if(remoteVars.cache_rebuilt)
+ {
+ remoteVars.cache_rebuilt=FALSE;
+ pthread_mutex_unlock(&remoteVars.sendqueue_mutex);
+ send_reinit_notification();
+ pthread_mutex_lock(&remoteVars.sendqueue_mutex);
+ }
+
//only send output selection chunks if there are no frames and cursors in the queue
//selections can take a lot of bandwidth and have less priority
if(remoteVars.selstruct.firstOutputChunk && !remoteVars.first_sendqueue_element && !remoteVars.firstCursor)
@@ -2342,6 +2361,12 @@ clientReadNotify(int fd, int ready, void *data)
//receive keepalive event, don't need to do anything
break;
}
+ case CACHEREBUILD:
+ {
+ //rebuild all frame and cursors caches
+ rebuild_caches();
+ break;
+ }
default:
{
EPHYR_DBG("UNSUPPORTED EVENT: %d",event_type);
@@ -3305,10 +3330,9 @@ void add_frame(uint32_t width, uint32_t height, int32_t x, int32_t y, uint32_t c
pthread_mutex_lock(&remoteVars.sendqueue_mutex);
- if(! (remoteVars.client_connected && remoteVars.client_initialized))
+ if(! (remoteVars.client_connected && remoteVars.client_initialized) || remoteVars.cache_rebuilt)
{
- /* don't have any clients connected, return */
-
+ /* don't have any clients connected, or cache rebuild is requested, return */
pthread_mutex_unlock(&remoteVars.sendqueue_mutex);
return;
}
@@ -3368,7 +3392,6 @@ void add_frame(uint32_t width, uint32_t height, int32_t x, int32_t y, uint32_t c
pthread_cond_signal(&remoteVars.have_sendqueue_cond);
pthread_mutex_unlock(&remoteVars.sendqueue_mutex);
-
/* on this point will be sent wakeup single to send mutex */
}
@@ -3611,3 +3634,15 @@ remote_screen_init(KdScreenInfo *screen,
return remoteVars.main_img;
}
+
+void rebuild_caches(void)
+{
+ EPHYR_DBG("CLIENT REQUESTED CLEARING ALL CACHES AND QUEUES");
+ pthread_mutex_lock(&remoteVars.sendqueue_mutex);
+ clear_send_queue();
+ clear_frame_cache(0);
+ freeCursors();
+ remoteVars.cache_rebuilt=TRUE;
+ pthread_cond_signal(&remoteVars.have_sendqueue_cond);
+ pthread_mutex_unlock(&remoteVars.sendqueue_mutex);
+}
diff --git a/x2gokdriveremote.h b/x2gokdriveremote.h
index ce48005..62af332 100644
--- a/x2gokdriveremote.h
+++ b/x2gokdriveremote.h
@@ -97,7 +97,9 @@
//Changes 1 - 2: supporting extended selection and sending selection on demand
//Changes 2 - 3: supporting web client, sending cursors in PNG format and know about KEEPALIVE event
//Changes 3 - 4: extended clipboard support for web client
-#define FEATURE_VERSION 4
+//Changes 4 - 5: support for CACHEREBUILD event
+
+#define FEATURE_VERSION 5
#define MAXMSGSIZE 1024*16
@@ -119,7 +121,7 @@
//always 4
#define XSERVERBPP 4
-enum msg_type{FRAME,DELETED, CURSOR, DELETEDCURSOR, SELECTION, SERVERVERSION, DEMANDCLIENTSELECTION};
+enum msg_type{FRAME,DELETED, CURSOR, DELETEDCURSOR, SELECTION, SERVERVERSION, DEMANDCLIENTSELECTION, REINIT};
enum AgentState{STARTING, RUNNING, RESUMING, SUSPENDING, SUSPENDED, TERMINATING, TERMINATED};
enum Compressions{JPEG,PNG};
enum SelectionType{PRIMARY,CLIPBOARD};
@@ -151,6 +153,7 @@ enum OS_VERSION{OS_LINUX, OS_WINDOWS, OS_DARWIN, WEB};
#define CLIENTVERSION 10
#define DEMANDSELECTION 11
#define KEEPALIVE 12
+#define CACHEREBUILD 13
#define EVLENGTH 41
@@ -428,6 +431,9 @@ struct _remoteHostVars
BOOL client_connected;
BOOL client_initialized;
+ //if all cache are cleared and notofictaion to client should be send
+ BOOL cache_rebuilt;
+
struct SelectionStructure selstruct;
} ;
@@ -511,5 +517,6 @@ remote_paint_rect(KdScreenInfo *screen,
int sx, int sy, int dx, int dy, int width, int height);
void request_selection_from_client(enum SelectionType selection);
+void rebuild_caches(void);
#endif /* X2GOKDRIVE_REMOTE_H */
--
Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2gokdrive.git
More information about the x2go-commits
mailing list