summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/idle-server-connection.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/src/idle-server-connection.c b/src/idle-server-connection.c
index b593fa3..a921c33 100644
--- a/src/idle-server-connection.c
+++ b/src/idle-server-connection.c
@@ -71,6 +71,7 @@ struct _IdleServerConnectionPrivate {
GSocketClient *socket_client;
GIOStream *io_stream;
+ GCancellable *read_cancellable;
GCancellable *cancellable;
IdleServerConnectionState state;
@@ -245,8 +246,12 @@ static void change_state(IdleServerConnection *conn, IdleServerConnectionState s
static void _input_stream_read(IdleServerConnection *conn, GInputStream *input_stream, GAsyncReadyCallback callback) {
IdleServerConnectionPrivate *priv = IDLE_SERVER_CONNECTION_GET_PRIVATE(conn);
+ if (priv->read_cancellable == NULL)
+ priv->read_cancellable = g_cancellable_new ();
+
+
memset(priv->input_buffer, '\0', sizeof(priv->input_buffer));
- g_input_stream_read_async (input_stream, &priv->input_buffer, sizeof(priv->input_buffer) - 1, G_PRIORITY_DEFAULT, NULL, callback, conn);
+ g_input_stream_read_async (input_stream, &priv->input_buffer, sizeof(priv->input_buffer) - 1, G_PRIORITY_DEFAULT, priv->read_cancellable, callback, conn);
}
static void _input_stream_read_ready(GObject *source_object, GAsyncResult *res, gpointer user_data) {
@@ -514,6 +519,9 @@ void idle_server_connection_disconnect_full_async(IdleServerConnection *conn, gu
priv->reason = reason;
+ g_cancellable_cancel (priv->read_cancellable);
+ g_clear_object (&priv->read_cancellable);
+
result = g_simple_async_result_new(G_OBJECT(conn), callback, user_data, idle_server_connection_disconnect_full_async);
g_io_stream_close_async(priv->io_stream, G_PRIORITY_DEFAULT, cancellable, _close_ready, result);
g_object_unref(priv->io_stream);