[gnome-remote-desktop] rdp: Move some elements from RdpPeerContext to the GrdSessionRdp struct
- From: Jonas Ådahl <jadahl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-remote-desktop] rdp: Move some elements from RdpPeerContext to the GrdSessionRdp struct
- Date: Fri, 3 Sep 2021 09:34:42 +0000 (UTC)
commit c15d62db6092813ce42057966353eb1dbd8e356c
Author: Pascal Nowack <Pascal Nowack gmx de>
Date: Mon May 31 12:52:40 2021 +0200
rdp: Move some elements from RdpPeerContext to the GrdSessionRdp struct
In order to be able to implement separate classes, that handle Fast-
and Slowpath PDUs, the RdpPeerContext struct needs to be moved out of
the GrdSessionRdp class.
Before doing that, move some elements from the RdpPeerContext struct
into the GrdSessionRdp struct, that are private to the GrdSessionRdp
class.
This is a preparatory step for the implementation of a class, that
detects the network characteristics of the RDP session, as this class
will use and hook up to Fast- and Slowpath PDUs.
src/grd-session-rdp.c | 196 +++++++++++++++++++++++---------------------------
1 file changed, 89 insertions(+), 107 deletions(-)
---
diff --git a/src/grd-session-rdp.c b/src/grd-session-rdp.c
index 2d44e86..77bcd1f 100644
--- a/src/grd-session-rdp.c
+++ b/src/grd-session-rdp.c
@@ -78,14 +78,46 @@ typedef struct _Pointer
int64_t last_used;
} Pointer;
+typedef struct _NSCThreadPoolContext
+{
+ uint32_t pending_job_count;
+ GCond *pending_jobs_cond;
+ GMutex *pending_jobs_mutex;
+
+ uint32_t src_stride;
+ uint8_t *src_data;
+ rdpSettings *rdp_settings;
+} NSCThreadPoolContext;
+
+typedef struct _NSCEncodeContext
+{
+ cairo_rectangle_int_t cairo_rect;
+ wStream *stream;
+} NSCEncodeContext;
+
+typedef struct _RawThreadPoolContext
+{
+ uint32_t pending_job_count;
+ GCond *pending_jobs_cond;
+ GMutex *pending_jobs_mutex;
+
+ uint16_t planar_flags;
+ uint32_t src_stride;
+ uint8_t *src_data;
+} RawThreadPoolContext;
+
struct _GrdSessionRdp
{
GrdSession parent;
GSocketConnection *connection;
freerdp_peer *peer;
+ GrdRdpSAMFile *sam_file;
uint32_t rdp_error_info;
+ GMutex rdp_flags_mutex;
+ RdpPeerFlag rdp_flags;
+
GThread *socket_thread;
HANDLE start_event;
HANDLE stop_event;
@@ -104,6 +136,8 @@ struct _GrdSessionRdp
GThreadPool *thread_pool;
GCond pending_jobs_cond;
GMutex pending_jobs_mutex;
+ NSCThreadPoolContext nsc_thread_pool_context;
+ RawThreadPoolContext raw_thread_pool_context;
GSource *pending_encode_source;
@@ -112,51 +146,17 @@ struct _GrdSessionRdp
GrdRdpPipeWireStream *pipewire_stream;
};
-typedef struct _NSCThreadPoolContext
-{
- uint32_t pending_job_count;
- GCond *pending_jobs_cond;
- GMutex *pending_jobs_mutex;
-
- uint32_t src_stride;
- uint8_t *src_data;
- rdpSettings *rdp_settings;
-} NSCThreadPoolContext;
-
-typedef struct _NSCEncodeContext
-{
- cairo_rectangle_int_t cairo_rect;
- wStream *stream;
-} NSCEncodeContext;
-
-typedef struct _RawThreadPoolContext
-{
- uint32_t pending_job_count;
- GCond *pending_jobs_cond;
- GMutex *pending_jobs_mutex;
-
- uint16_t planar_flags;
- uint32_t src_stride;
- uint8_t *src_data;
-} RawThreadPoolContext;
-
typedef struct _RdpPeerContext
{
rdpContext rdp_context;
GrdSessionRdp *session_rdp;
- GrdRdpSAMFile *sam_file;
- GMutex flags_mutex;
- RdpPeerFlag flags;
uint32_t frame_id;
RFX_CONTEXT *rfx_context;
wStream *encode_stream;
- NSCThreadPoolContext nsc_thread_pool_context;
- RawThreadPoolContext raw_thread_pool_context;
-
uint16_t planar_flags;
/* Virtual Channel Manager */
@@ -182,54 +182,48 @@ are_pointer_bitmaps_equal (gconstpointer a,
gconstpointer b);
static gboolean
-is_rdp_peer_flag_set (RdpPeerContext *rdp_peer_context,
- RdpPeerFlag flag)
+is_rdp_peer_flag_set (GrdSessionRdp *session_rdp,
+ RdpPeerFlag flag)
{
gboolean state;
- g_mutex_lock (&rdp_peer_context->flags_mutex);
- state = rdp_peer_context->flags & flag;
- g_mutex_unlock (&rdp_peer_context->flags_mutex);
+ g_mutex_lock (&session_rdp->rdp_flags_mutex);
+ state = !!(session_rdp->rdp_flags & flag);
+ g_mutex_unlock (&session_rdp->rdp_flags_mutex);
return state;
}
static void
-set_rdp_peer_flag (RdpPeerContext *rdp_peer_context,
- RdpPeerFlag flag)
+set_rdp_peer_flag (GrdSessionRdp *session_rdp,
+ RdpPeerFlag flag)
{
- g_mutex_lock (&rdp_peer_context->flags_mutex);
- rdp_peer_context->flags |= flag;
- g_mutex_unlock (&rdp_peer_context->flags_mutex);
+ g_mutex_lock (&session_rdp->rdp_flags_mutex);
+ session_rdp->rdp_flags |= flag;
+ g_mutex_unlock (&session_rdp->rdp_flags_mutex);
}
static void
-unset_rdp_peer_flag (RdpPeerContext *rdp_peer_context,
- RdpPeerFlag flag)
+unset_rdp_peer_flag (GrdSessionRdp *session_rdp,
+ RdpPeerFlag flag)
{
- g_mutex_lock (&rdp_peer_context->flags_mutex);
- rdp_peer_context->flags &= ~flag;
- g_mutex_unlock (&rdp_peer_context->flags_mutex);
+ g_mutex_lock (&session_rdp->rdp_flags_mutex);
+ session_rdp->rdp_flags &= ~flag;
+ g_mutex_unlock (&session_rdp->rdp_flags_mutex);
}
void
grd_session_rdp_notify_graphics_pipeline_reset (GrdSessionRdp *session_rdp)
{
- freerdp_peer *peer = session_rdp->peer;
- RdpPeerContext *rdp_peer_context = (RdpPeerContext *) peer->context;
-
- set_rdp_peer_flag (rdp_peer_context, RDP_PEER_PENDING_GFX_INIT);
+ set_rdp_peer_flag (session_rdp, RDP_PEER_PENDING_GFX_INIT);
}
void
grd_session_rdp_notify_graphics_pipeline_ready (GrdSessionRdp *session_rdp)
{
- freerdp_peer *peer = session_rdp->peer;
- RdpPeerContext *rdp_peer_context = (RdpPeerContext *) peer->context;
-
- set_rdp_peer_flag (rdp_peer_context, RDP_PEER_ALL_SURFACES_INVALID);
- set_rdp_peer_flag (rdp_peer_context, RDP_PEER_PENDING_GFX_GRAPHICS_RESET);
- unset_rdp_peer_flag (rdp_peer_context, RDP_PEER_PENDING_GFX_INIT);
+ set_rdp_peer_flag (session_rdp, RDP_PEER_ALL_SURFACES_INVALID);
+ set_rdp_peer_flag (session_rdp, RDP_PEER_PENDING_GFX_GRAPHICS_RESET);
+ unset_rdp_peer_flag (session_rdp, RDP_PEER_PENDING_GFX_INIT);
g_source_set_ready_time (session_rdp->pending_encode_source, 0);
}
@@ -240,7 +234,6 @@ grd_session_rdp_resize_framebuffer (GrdSessionRdp *session_rdp,
uint32_t height)
{
freerdp_peer *peer = session_rdp->peer;
- RdpPeerContext *rdp_peer_context = (RdpPeerContext *) peer->context;
rdpSettings *rdp_settings = peer->settings;
if (rdp_settings->DesktopWidth == width &&
@@ -250,11 +243,11 @@ grd_session_rdp_resize_framebuffer (GrdSessionRdp *session_rdp,
rdp_settings->DesktopWidth = width;
rdp_settings->DesktopHeight = height;
if (rdp_settings->SupportGraphicsPipeline)
- set_rdp_peer_flag (rdp_peer_context, RDP_PEER_PENDING_GFX_GRAPHICS_RESET);
+ set_rdp_peer_flag (session_rdp, RDP_PEER_PENDING_GFX_GRAPHICS_RESET);
else
peer->update->DesktopResize (peer->context);
- set_rdp_peer_flag (rdp_peer_context, RDP_PEER_ALL_SURFACES_INVALID);
+ set_rdp_peer_flag (session_rdp, RDP_PEER_ALL_SURFACES_INVALID);
}
void
@@ -263,19 +256,17 @@ grd_session_rdp_take_buffer (GrdSessionRdp *session_rdp,
uint16_t width,
uint16_t height)
{
- freerdp_peer *peer = session_rdp->peer;
- RdpPeerContext *rdp_peer_context = (RdpPeerContext *) peer->context;
GrdRdpSurface *rdp_surface = session_rdp->rdp_surface;
uint32_t stride;
cairo_region_t *region;
g_clear_pointer (&rdp_surface->pending_frame, g_free);
- if (is_rdp_peer_flag_set (rdp_peer_context, RDP_PEER_ALL_SURFACES_INVALID))
+ if (is_rdp_peer_flag_set (session_rdp, RDP_PEER_ALL_SURFACES_INVALID))
{
rdp_surface->valid = FALSE;
- unset_rdp_peer_flag (rdp_peer_context, RDP_PEER_ALL_SURFACES_INVALID);
+ unset_rdp_peer_flag (session_rdp, RDP_PEER_ALL_SURFACES_INVALID);
}
if (rdp_surface->width != width || rdp_surface->height != height)
@@ -290,9 +281,9 @@ grd_session_rdp_take_buffer (GrdSessionRdp *session_rdp,
if (!rdp_surface->valid)
g_clear_pointer (&rdp_surface->last_frame, g_free);
- if (is_rdp_peer_flag_set (rdp_peer_context, RDP_PEER_ACTIVATED) &&
- is_rdp_peer_flag_set (rdp_peer_context, RDP_PEER_OUTPUT_ENABLED) &&
- !is_rdp_peer_flag_set (rdp_peer_context, RDP_PEER_PENDING_GFX_INIT) &&
+ if (is_rdp_peer_flag_set (session_rdp, RDP_PEER_ACTIVATED) &&
+ is_rdp_peer_flag_set (session_rdp, RDP_PEER_OUTPUT_ENABLED) &&
+ !is_rdp_peer_flag_set (session_rdp, RDP_PEER_PENDING_GFX_INIT) &&
!rdp_surface->encoding_suspended)
{
stride = grd_session_rdp_get_stride_for_width (session_rdp,
@@ -321,15 +312,11 @@ void
grd_session_rdp_maybe_encode_pending_frame (GrdSessionRdp *session_rdp,
GrdRdpSurface *rdp_surface)
{
- RdpPeerContext *rdp_peer_context;
-
g_assert (session_rdp->peer);
- g_assert (session_rdp->peer->context);
- rdp_peer_context = (RdpPeerContext *) session_rdp->peer->context;
- if (!is_rdp_peer_flag_set (rdp_peer_context, RDP_PEER_ACTIVATED) ||
- !is_rdp_peer_flag_set (rdp_peer_context, RDP_PEER_OUTPUT_ENABLED) ||
- is_rdp_peer_flag_set (rdp_peer_context, RDP_PEER_PENDING_GFX_INIT))
+ if (!is_rdp_peer_flag_set (session_rdp, RDP_PEER_ACTIVATED) ||
+ !is_rdp_peer_flag_set (session_rdp, RDP_PEER_OUTPUT_ENABLED) ||
+ is_rdp_peer_flag_set (session_rdp, RDP_PEER_PENDING_GFX_INIT))
return;
if (!rdp_surface->pending_frame)
@@ -375,7 +362,6 @@ grd_session_rdp_update_pointer (GrdSessionRdp *session_rdp,
uint8_t *data)
{
freerdp_peer *peer = session_rdp->peer;
- RdpPeerContext *rdp_peer_context = (RdpPeerContext *) peer->context;
rdpSettings *rdp_settings = peer->settings;
rdpUpdate *rdp_update = peer->update;
POINTER_SYSTEM_UPDATE pointer_system = {0};
@@ -393,7 +379,7 @@ grd_session_rdp_update_pointer (GrdSessionRdp *session_rdp,
uint8_t r, g, b, a;
uint32_t x, y;
- if (!is_rdp_peer_flag_set (rdp_peer_context, RDP_PEER_ACTIVATED))
+ if (!is_rdp_peer_flag_set (session_rdp, RDP_PEER_ACTIVATED))
{
g_free (data);
return;
@@ -573,11 +559,10 @@ void
grd_session_rdp_hide_pointer (GrdSessionRdp *session_rdp)
{
freerdp_peer *peer = session_rdp->peer;
- RdpPeerContext *rdp_peer_context = (RdpPeerContext *) peer->context;
rdpUpdate *rdp_update = peer->update;
POINTER_SYSTEM_UPDATE pointer_system = {0};
- if (!is_rdp_peer_flag_set (rdp_peer_context, RDP_PEER_ACTIVATED))
+ if (!is_rdp_peer_flag_set (session_rdp, RDP_PEER_ACTIVATED))
return;
if (session_rdp->pointer_type == POINTER_TYPE_HIDDEN)
@@ -615,12 +600,9 @@ grd_session_rdp_notify_error (GrdSessionRdp *session_rdp,
static void
handle_client_gone (GrdSessionRdp *session_rdp)
{
- freerdp_peer *peer = session_rdp->peer;
- RdpPeerContext *rdp_peer_context = (RdpPeerContext *) peer->context;
-
g_debug ("RDP client gone");
- unset_rdp_peer_flag (rdp_peer_context, RDP_PEER_ACTIVATED);
+ unset_rdp_peer_flag (session_rdp, RDP_PEER_ACTIVATED);
maybe_queue_close_session_idle (session_rdp);
}
@@ -660,7 +642,7 @@ rdp_peer_refresh_gfx (GrdSessionRdp *session_rdp,
rdpSettings *rdp_settings = peer->settings;
GrdRdpGraphicsPipeline *graphics_pipeline = rdp_peer_context->graphics_pipeline;
- if (is_rdp_peer_flag_set (rdp_peer_context, RDP_PEER_PENDING_GFX_GRAPHICS_RESET))
+ if (is_rdp_peer_flag_set (session_rdp, RDP_PEER_PENDING_GFX_GRAPHICS_RESET))
{
MONITOR_DEF *monitors;
uint32_t n_monitors;
@@ -672,7 +654,7 @@ rdp_peer_refresh_gfx (GrdSessionRdp *session_rdp,
monitors, n_monitors);
g_free (monitors);
- unset_rdp_peer_flag (rdp_peer_context, RDP_PEER_PENDING_GFX_GRAPHICS_RESET);
+ unset_rdp_peer_flag (session_rdp, RDP_PEER_PENDING_GFX_GRAPHICS_RESET);
}
grd_rdp_graphics_pipeline_refresh_gfx (graphics_pipeline,
@@ -837,7 +819,7 @@ rdp_peer_refresh_nsc (GrdSessionRdp *session_rdp,
uint32_t src_stride = grd_session_rdp_get_stride_for_width (session_rdp,
rdp_surface->width);
NSCThreadPoolContext *thread_pool_context =
- &rdp_peer_context->nsc_thread_pool_context;
+ &session_rdp->nsc_thread_pool_context;
g_autoptr (GError) error = NULL;
cairo_rectangle_int_t *cairo_rect;
int n_rects;
@@ -1077,7 +1059,7 @@ rdp_peer_refresh_raw (GrdSessionRdp *session_rdp,
uint32_t src_stride = grd_session_rdp_get_stride_for_width (session_rdp,
rdp_surface->width);
RawThreadPoolContext *thread_pool_context =
- &rdp_peer_context->raw_thread_pool_context;
+ &session_rdp->raw_thread_pool_context;
g_autoptr (GError) error = NULL;
uint32_t bitmap_data_count = 0;
uint32_t n_bitmaps = 0;
@@ -1253,7 +1235,7 @@ rdp_input_synchronize_event (rdpInput *rdp_input,
GrdSessionRdp *session_rdp = rdp_peer_context->session_rdp;
GrdRdpEventQueue *rdp_event_queue = session_rdp->rdp_event_queue;
- if (!is_rdp_peer_flag_set (rdp_peer_context, RDP_PEER_ACTIVATED) ||
+ if (!is_rdp_peer_flag_set (session_rdp, RDP_PEER_ACTIVATED) ||
is_view_only (session_rdp))
return TRUE;
@@ -1286,7 +1268,7 @@ rdp_input_mouse_event (rdpInput *rdp_input,
uint16_t axis_value;
double axis_step;
- if (!is_rdp_peer_flag_set (rdp_peer_context, RDP_PEER_ACTIVATED) ||
+ if (!is_rdp_peer_flag_set (session_rdp, RDP_PEER_ACTIVATED) ||
is_view_only (session_rdp))
return TRUE;
@@ -1354,7 +1336,7 @@ rdp_input_extended_mouse_event (rdpInput *rdp_input,
GrdButtonState button_state;
int32_t button = 0;
- if (!is_rdp_peer_flag_set (rdp_peer_context, RDP_PEER_ACTIVATED) ||
+ if (!is_rdp_peer_flag_set (session_rdp, RDP_PEER_ACTIVATED) ||
is_view_only (session_rdp))
return TRUE;
@@ -1447,7 +1429,7 @@ rdp_input_keyboard_event (rdpInput *rdp_input,
uint16_t vkcode;
uint16_t keycode;
- if (!is_rdp_peer_flag_set (rdp_peer_context, RDP_PEER_ACTIVATED) ||
+ if (!is_rdp_peer_flag_set (session_rdp, RDP_PEER_ACTIVATED) ||
is_view_only (session_rdp))
return TRUE;
@@ -1497,7 +1479,7 @@ rdp_input_unicode_keyboard_event (rdpInput *rdp_input,
xkb_keysym_t keysym;
GrdKeyState key_state;
- if (!is_rdp_peer_flag_set (rdp_peer_context, RDP_PEER_ACTIVATED) ||
+ if (!is_rdp_peer_flag_set (session_rdp, RDP_PEER_ACTIVATED) ||
is_view_only (session_rdp))
return TRUE;
@@ -1539,9 +1521,9 @@ rdp_suppress_output (rdpContext *rdp_context,
GrdSessionRdp *session_rdp = rdp_peer_context->session_rdp;
if (allow)
- set_rdp_peer_flag (rdp_peer_context, RDP_PEER_OUTPUT_ENABLED);
+ set_rdp_peer_flag (session_rdp, RDP_PEER_OUTPUT_ENABLED);
else
- unset_rdp_peer_flag (rdp_peer_context, RDP_PEER_OUTPUT_ENABLED);
+ unset_rdp_peer_flag (session_rdp, RDP_PEER_OUTPUT_ENABLED);
if (allow)
g_source_set_ready_time (session_rdp->pending_encode_source, 0);
@@ -1621,7 +1603,7 @@ rdp_peer_post_connect (freerdp_peer *peer)
if (rdp_settings->SupportGraphicsPipeline)
{
- set_rdp_peer_flag (rdp_peer_context, RDP_PEER_PENDING_GFX_INIT);
+ set_rdp_peer_flag (session_rdp, RDP_PEER_PENDING_GFX_INIT);
rdp_peer_context->graphics_pipeline =
grd_rdp_graphics_pipeline_new (session_rdp,
@@ -1634,10 +1616,11 @@ rdp_peer_post_connect (freerdp_peer *peer)
grd_session_start (GRD_SESSION (session_rdp));
- sam_file = g_steal_pointer (&rdp_peer_context->sam_file);
+ sam_file = g_steal_pointer (&session_rdp->sam_file);
grd_rdp_sam_maybe_close_and_free_sam_file (sam_file);
- set_rdp_peer_flag (rdp_peer_context, RDP_PEER_ACTIVATED);
+ set_rdp_peer_flag (session_rdp, RDP_PEER_OUTPUT_ENABLED);
+ set_rdp_peer_flag (session_rdp, RDP_PEER_ACTIVATED);
return TRUE;
}
@@ -1646,6 +1629,7 @@ static BOOL
rdp_peer_activate (freerdp_peer *peer)
{
RdpPeerContext *rdp_peer_context = (RdpPeerContext *) peer->context;
+ GrdSessionRdp *session_rdp = rdp_peer_context->session_rdp;
rdpSettings *rdp_settings = peer->settings;
g_debug ("Activating client");
@@ -1659,7 +1643,7 @@ rdp_peer_activate (freerdp_peer *peer)
return FALSE;
}
- set_rdp_peer_flag (rdp_peer_context, RDP_PEER_ALL_SURFACES_INVALID);
+ set_rdp_peer_flag (session_rdp, RDP_PEER_ALL_SURFACES_INVALID);
return TRUE;
}
@@ -1685,9 +1669,6 @@ rdp_peer_context_new (freerdp_peer *peer,
rdp_peer_context->vcm = WTSOpenServerA ((LPSTR) peer->context);
- g_mutex_init (&rdp_peer_context->flags_mutex);
- rdp_peer_context->flags = RDP_PEER_OUTPUT_ENABLED;
-
return TRUE;
}
@@ -1739,12 +1720,12 @@ init_rdp_session (GrdSessionRdp *session_rdp,
rdp_peer_context = (RdpPeerContext *) peer->context;
rdp_peer_context->session_rdp = session_rdp;
- rdp_peer_context->sam_file = grd_rdp_sam_create_sam_file (username, password);
+ session_rdp->sam_file = grd_rdp_sam_create_sam_file (username, password);
rdp_settings = peer->settings;
freerdp_settings_set_string (rdp_settings,
FreeRDP_NtlmSamFile,
- rdp_peer_context->sam_file->filename);
+ session_rdp->sam_file->filename);
rdp_settings->CertificateFile = strdup (grd_settings_get_rdp_server_cert (settings));
rdp_settings->PrivateKeyFile = strdup (grd_settings_get_rdp_server_key (settings));
rdp_settings->RdpSecurity = FALSE;
@@ -1959,7 +1940,7 @@ grd_session_rdp_stop (GrdSession *session)
g_debug ("Stopping RDP session");
- unset_rdp_peer_flag (rdp_peer_context, RDP_PEER_ACTIVATED);
+ unset_rdp_peer_flag (session_rdp, RDP_PEER_ACTIVATED);
if (WaitForSingleObject (session_rdp->stop_event, 0) == WAIT_TIMEOUT)
{
freerdp_set_error_info (peer->context->rdp,
@@ -1982,8 +1963,8 @@ grd_session_rdp_stop (GrdSession *session)
peer->Close (peer);
g_clear_object (&session_rdp->connection);
- if (rdp_peer_context->sam_file)
- grd_rdp_sam_maybe_close_and_free_sam_file (rdp_peer_context->sam_file);
+ if (session_rdp->sam_file)
+ grd_rdp_sam_maybe_close_and_free_sam_file (session_rdp->sam_file);
if (session_rdp->thread_pool)
g_thread_pool_free (session_rdp->thread_pool, FALSE, TRUE);
@@ -2171,6 +2152,7 @@ grd_session_rdp_init (GrdSessionRdp *session_rdp)
g_cond_init (&session_rdp->pending_jobs_cond);
g_mutex_init (&session_rdp->pending_jobs_mutex);
+ g_mutex_init (&session_rdp->rdp_flags_mutex);
session_rdp->rdp_event_queue = grd_rdp_event_queue_new (session_rdp);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]