Automatic sleep on message handle
This commit is contained in:
parent
12d497ca3f
commit
3e90251cb8
@ -57,7 +57,7 @@ AC_TYPE_SSIZE_T
|
||||
# Checks for library functions.
|
||||
AC_FUNC_MALLOC
|
||||
AC_FUNC_REALLOC
|
||||
AC_CHECK_FUNCS([clock_gettime gettimeofday memmove memset select strdup png_get_io_ptr])
|
||||
AC_CHECK_FUNCS([clock_gettime gettimeofday memmove memset select strdup png_get_io_ptr nanosleep])
|
||||
|
||||
AC_CONFIG_FILES([Makefile])
|
||||
AC_OUTPUT
|
||||
|
@ -49,6 +49,22 @@
|
||||
* @file client.h
|
||||
*/
|
||||
|
||||
/**
|
||||
* The time to allow between sync responses in milliseconds. If a sync
|
||||
* instruction is sent to the client and no response is received within this
|
||||
* timeframe, server messages will not be handled until a sync instruction is
|
||||
* received from the client.
|
||||
*/
|
||||
#define GUAC_SYNC_THRESHOLD 500
|
||||
|
||||
/**
|
||||
* The amount of time to wait after handling server messages. If a client
|
||||
* plugin has a message handler, and sends instructions when server messages
|
||||
* are being handled, there will be a pause of this many milliseconds before
|
||||
* the next call to the message handler.
|
||||
*/
|
||||
#define GUAC_SERVER_MESSAGE_HANDLE_FREQUENCY 50
|
||||
|
||||
typedef struct guac_client guac_client;
|
||||
|
||||
/**
|
||||
|
@ -274,6 +274,26 @@ long __guac_current_timestamp() {
|
||||
|
||||
}
|
||||
|
||||
|
||||
void __guac_sleep(int millis) {
|
||||
|
||||
#ifdef HAVE_NANOSLEEP
|
||||
struct timespec sleep_period;
|
||||
|
||||
sleep_period.tv_sec = 0;
|
||||
sleep_period.tv_nsec = millis * 1000000L;
|
||||
|
||||
nanosleep(&sleep_period, NULL);
|
||||
#elif defined(__MINGW32__)
|
||||
Sleep(millis)
|
||||
#else
|
||||
#warning No sleep/nanosleep function available. Clients may not perform as expected. Consider patching libguac to add support for your platform.
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void guac_start_client(guac_client* client) {
|
||||
|
||||
GUACIO* io = client->io;
|
||||
@ -295,7 +315,8 @@ void guac_start_client(guac_client* client) {
|
||||
int last_total_written = io->total_written;
|
||||
|
||||
/* Only handle messages if synced within threshold */
|
||||
if (last_sent_timestamp - last_received_timestamp < 200) {
|
||||
if (last_sent_timestamp - last_received_timestamp
|
||||
< GUAC_SYNC_THRESHOLD) {
|
||||
|
||||
int retval = client->handle_messages(client);
|
||||
if (retval) {
|
||||
@ -305,8 +326,14 @@ void guac_start_client(guac_client* client) {
|
||||
|
||||
/* If data was written during message handling */
|
||||
if (io->total_written != last_total_written) {
|
||||
|
||||
/* Sleep as necessary */
|
||||
__guac_sleep(GUAC_SERVER_MESSAGE_HANDLE_FREQUENCY);
|
||||
|
||||
/* Update sync timestamp and send sync instruction */
|
||||
last_sent_timestamp = __guac_current_timestamp();
|
||||
guac_send_sync(io, last_sent_timestamp);
|
||||
|
||||
}
|
||||
|
||||
guac_flush(io);
|
||||
|
Loading…
Reference in New Issue
Block a user