Additional logging, moderate cleanup.

This commit is contained in:
Michael Jumper 2011-11-26 22:26:39 -08:00
parent 76e55c5a51
commit 9c5f1da646
2 changed files with 40 additions and 20 deletions

View File

@ -45,6 +45,11 @@
#include "client.h"
#include "thread.h"
/**
* Sleep for the given number of milliseconds.
*
* @param millis The number of milliseconds to sleep.
*/
void __guacd_sleep(int millis) {
struct timespec sleep_period;
@ -79,14 +84,18 @@ void* __guac_client_output_thread(void* data) {
/* Send sync */
if (guac_protocol_send_sync(socket, client->last_sent_timestamp)) {
guac_client_log_error(client, "Error sending \"sync\" instruction: %s", guac_status_string(guac_error));
guac_client_log_error(client,
"Error sending \"sync\" instruction: %s",
guac_status_string(guac_error));
guac_client_stop(client);
return NULL;
}
/* Flush */
if (guac_socket_flush(socket)) {
guac_client_log_error(client, "Error flushing output: %s", guac_status_string(guac_error));
guac_client_log_error(client,
"Error flushing output: %s",
guac_status_string(guac_error));
guac_client_stop(client);
return NULL;
}
@ -102,32 +111,35 @@ void* __guac_client_output_thread(void* data) {
int retval = client->handle_messages(client);
if (retval) {
guac_client_log_error(client, "Error handling server messages: %s", guac_status_string(guac_error));
guac_client_log_error(client,
"Error handling server messages: %s",
guac_status_string(guac_error));
guac_client_stop(client);
return NULL;
}
/* Sleep as necessary */
__guacd_sleep(GUAC_SERVER_MESSAGE_HANDLE_FREQUENCY);
/* Send sync instruction */
client->last_sent_timestamp = guac_protocol_get_timestamp();
if (guac_protocol_send_sync(socket, client->last_sent_timestamp)) {
guac_client_log_error(client, "Error sending \"sync\" instruction: %s", guac_status_string(guac_error));
guac_client_log_error(client,
"Error sending \"sync\" instruction: %s",
guac_status_string(guac_error));
guac_client_stop(client);
return NULL;
}
/* Flush */
if (guac_socket_flush(socket)) {
guac_client_log_error(client, "Error flushing output: %s", guac_status_string(guac_error));
guac_client_log_error(client,
"Error flushing output: %s",
guac_status_string(guac_error));
guac_client_stop(client);
return NULL;
}
}
/* If sync threshold exceeded, don't spin waiting for resync */
else
/* Sleep before handling more messages */
__guacd_sleep(GUAC_SERVER_MESSAGE_HANDLE_FREQUENCY);
}
@ -157,14 +169,18 @@ void* __guac_client_input_thread(void* data) {
/* Stop on error */
if (instruction == NULL) {
guac_client_log_error(client, "Error reading instruction: %s", guac_status_string(guac_error));
guac_client_log_error(client,
"Error reading instruction: %s",
guac_status_string(guac_error));
guac_client_stop(client);
return NULL;
}
/* Call handler, stop on error */
if (guac_client_handle_instruction(client, instruction) < 0) {
guac_client_log_error(client, "Error in client \"%s\" instruction handler: %s", instruction->opcode, guac_status_string(guac_error));
guac_client_log_error(client,
"Error in client \"%s\" instruction handler: %s",
instruction->opcode, guac_status_string(guac_error));
guac_instruction_free(instruction);
guac_client_stop(client);
return NULL;
@ -184,10 +200,12 @@ int guac_start_client(guac_client* client) {
guac_thread input_thread, output_thread;
if (guac_thread_create(&output_thread, __guac_client_output_thread, (void*) client)) {
guac_client_log_error(client, "Unable to start output thread");
return -1;
}
if (guac_thread_create(&input_thread, __guac_client_input_thread, (void*) client)) {
guac_client_log_error(client, "Unable to start input thread");
guac_client_stop(client);
guac_thread_join(output_thread);
return -1;
@ -202,4 +220,3 @@ int guac_start_client(guac_client* client) {
}

View File

@ -64,13 +64,14 @@ void* start_client_thread(void* data) {
guac_client* client;
guac_client_plugin* plugin;
client_thread_data* thread_data = (client_thread_data*) data;
guac_socket* socket;
guac_instruction* select;
guac_instruction* connect;
/* Get thread data */
client_thread_data* thread_data = (client_thread_data*) data;
/* Open guac_socket */
socket = guac_socket_open(thread_data->fd);
guac_socket* socket = guac_socket_open(thread_data->fd);
/* Get protocol from select instruction */
select = guac_protocol_expect_instruction(
@ -171,10 +172,12 @@ void* start_client_thread(void* data) {
/* Start client threads */
syslog(LOG_INFO, "Starting client");
guac_start_client(client);
if (guac_start_client(client))
syslog(LOG_ERR, "Client finished abnormally");
else
syslog(LOG_INFO, "Client finished normally");
/* Clean up */
syslog(LOG_INFO, "Client finished");
guac_client_free(client);
if (guac_client_plugin_close(plugin))
syslog(LOG_ERR, "Error closing client plugin");
@ -290,7 +293,7 @@ int main(int argc, char* argv[]) {
#endif
/* Otherwise, this is the daemon */
syslog(LOG_INFO, "Started, listening on port %i", listen_port);
syslog(LOG_INFO, "Listening on port %i", listen_port);
/* Ignore SIGPIPE */
if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) {