Exclude simultaneous access to the terminal structure by the input and output threads.
This commit is contained in:
parent
43f42cbb4c
commit
342824914a
@ -39,6 +39,7 @@
|
|||||||
#define _SSH_GUAC_TERMINAL_H
|
#define _SSH_GUAC_TERMINAL_H
|
||||||
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
|
||||||
#include <pango/pangocairo.h>
|
#include <pango/pangocairo.h>
|
||||||
|
|
||||||
@ -303,6 +304,12 @@ struct guac_terminal {
|
|||||||
*/
|
*/
|
||||||
guac_client* client;
|
guac_client* client;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lock which restricts simultaneous access to this terminal via the root
|
||||||
|
* guac_terminal_* functions.
|
||||||
|
*/
|
||||||
|
pthread_mutex_t lock;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The description of the font to use for rendering.
|
* The description of the font to use for rendering.
|
||||||
*/
|
*/
|
||||||
|
@ -85,6 +85,9 @@ int ssh_guac_client_handle_messages(guac_client* client) {
|
|||||||
|
|
||||||
int bytes_read = 0;
|
int bytes_read = 0;
|
||||||
|
|
||||||
|
/* Lock terminal access */
|
||||||
|
pthread_mutex_lock(&(client_data->term->lock));
|
||||||
|
|
||||||
/* Clear cursor */
|
/* Clear cursor */
|
||||||
guac_terminal_toggle_reverse(client_data->term,
|
guac_terminal_toggle_reverse(client_data->term,
|
||||||
client_data->term->cursor_row,
|
client_data->term->cursor_row,
|
||||||
@ -116,6 +119,9 @@ int ssh_guac_client_handle_messages(guac_client* client) {
|
|||||||
/* Flush terminal delta */
|
/* Flush terminal delta */
|
||||||
guac_terminal_delta_flush(client_data->term->delta, client_data->term);
|
guac_terminal_delta_flush(client_data->term->delta, client_data->term);
|
||||||
|
|
||||||
|
/* Unlock terminal access */
|
||||||
|
pthread_mutex_unlock(&(client_data->term->lock));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -157,12 +163,16 @@ int ssh_guac_client_mouse_handler(guac_client* client, int x, int y, int mask) {
|
|||||||
|
|
||||||
/* Scroll up if wheel moved up */
|
/* Scroll up if wheel moved up */
|
||||||
if (released_mask & GUAC_CLIENT_MOUSE_SCROLL_UP) {
|
if (released_mask & GUAC_CLIENT_MOUSE_SCROLL_UP) {
|
||||||
|
pthread_mutex_lock(&(term->lock));
|
||||||
guac_terminal_scroll_display_up(term);
|
guac_terminal_scroll_display_up(term);
|
||||||
|
pthread_mutex_unlock(&(term->lock));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Scroll down if wheel moved down */
|
/* Scroll down if wheel moved down */
|
||||||
if (released_mask & GUAC_CLIENT_MOUSE_SCROLL_DOWN) {
|
if (released_mask & GUAC_CLIENT_MOUSE_SCROLL_DOWN) {
|
||||||
|
pthread_mutex_lock(&(term->lock));
|
||||||
guac_terminal_scroll_display_down(term);
|
guac_terminal_scroll_display_down(term);
|
||||||
|
pthread_mutex_unlock(&(term->lock));
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -38,6 +38,7 @@
|
|||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
|
||||||
#include <cairo/cairo.h>
|
#include <cairo/cairo.h>
|
||||||
#include <pango/pangocairo.h>
|
#include <pango/pangocairo.h>
|
||||||
@ -156,6 +157,9 @@ guac_terminal* guac_terminal_create(guac_client* client,
|
|||||||
guac_terminal_clear(term,
|
guac_terminal_clear(term,
|
||||||
0, 0, term->term_height, term->term_width);
|
0, 0, term->term_height, term->term_width);
|
||||||
|
|
||||||
|
/* Init terminal lock */
|
||||||
|
pthread_mutex_init(&(term->lock), NULL);
|
||||||
|
|
||||||
return term;
|
return term;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user