Delay processing of the resize queue

Processing of the resize queue is delayed until we've connected to a
session, as the login screen is currently unable to cope with these
requests.
This commit is contained in:
matt335672
2025-10-06 15:52:37 +01:00
parent c31c499372
commit 6c90bc2493
2 changed files with 50 additions and 9 deletions
+48 -9
View File
@@ -1468,6 +1468,8 @@ add_resize_request_to_queue(struct xrdp_mm *self,
} }
else else
{ {
// This call only has an effect if the wait_obj is not
// NULL_WAIT_OBJ
g_set_wait_obj(self->resize_ready); g_set_wait_obj(self->resize_ready);
} }
} }
@@ -1559,9 +1561,10 @@ dynamic_monitor_data(struct xrdp_process *id, int chan_id,
return error; return error;
} }
LOG(LOG_LEVEL_DEBUG, "dynamic_monitor_data:" LOG(LOG_LEVEL_DEBUG, "dynamic_monitor_data:"
" received width %d, received height %d.", " received width %d, received height %d, queue %s",
description.session_width, description.session_width,
description.session_height); description.session_height,
(wm->mm->resize_ready == NULL_WAIT_OBJ) ? "inactive" : "active");
return 0; return 0;
} }
@@ -1950,8 +1953,6 @@ dynamic_monitor_initialize(struct xrdp_mm *self)
struct xrdp_drdynvc_procs d_procs; struct xrdp_drdynvc_procs d_procs;
int flags; int flags;
int error; int error;
char buf[1024];
int pid;
LOG_DEVEL(LOG_LEVEL_TRACE, "dynamic_monitor_initialize:"); LOG_DEVEL(LOG_LEVEL_TRACE, "dynamic_monitor_initialize:");
@@ -1975,11 +1976,8 @@ dynamic_monitor_initialize(struct xrdp_mm *self)
// Initialize xrdp_mm specific variables. // Initialize xrdp_mm specific variables.
self->resize_queue = list_create(); self->resize_queue = list_create();
self->resize_queue->auto_free = 1; self->resize_queue->auto_free = 1;
pid = g_getpid();
/* setup wait objects for signaling */
g_snprintf(buf, sizeof(buf), "xrdp_%8.8x_resize_ready", pid);
self->resize_ready = g_create_wait_obj(buf);
self->resize_data = NULL; self->resize_data = NULL;
self->resize_ready = NULL_WAIT_OBJ;
return error; return error;
} }
@@ -3269,6 +3267,41 @@ xrdp_mm_connect(struct xrdp_mm *self)
xrdp_mm_connect_sm(self); xrdp_mm_connect_sm(self);
} }
/*****************************************************************************/
/**
* Start resize queue processing
*
* The xrdp login screen does not currently support client-side resizes. We
* currently address this by not processing the resize queue until we are
* able to do so.
*
* We implement this by not creating the resize_ready wait object until
* we are able to process the queue. Calls made to an empty wait object
* are simply ignored.
*
* @param self MM module
*/
static void
start_processing_resize_queue(struct xrdp_mm *self)
{
if (self->resize_ready == NULL_WAIT_OBJ)
{
char buf[32];
int outstanding =
(self->resize_queue != NULL) ? self->resize_queue->count : 0;
int pid = g_getpid();
g_snprintf(buf, sizeof(buf), "xrdp_%8.8x_resize_ready", pid);
self->resize_ready = g_create_wait_obj(buf);
LOG(LOG_LEVEL_INFO,
"xrdp can now process resize requests (%d outstanding)",
outstanding);
if (outstanding > 0)
{
g_set_wait_obj(self->resize_ready);
}
}
}
/*****************************************************************************/ /*****************************************************************************/
static void static void
xrdp_mm_connect_sm(struct xrdp_mm *self) xrdp_mm_connect_sm(struct xrdp_mm *self)
@@ -3445,6 +3478,12 @@ xrdp_mm_connect_sm(struct xrdp_mm *self)
"Connecting to display server"); "Connecting to display server");
/* This is synchronous - no reply message expected */ /* This is synchronous - no reply message expected */
status = xrdp_mm_display_server_connect(self); status = xrdp_mm_display_server_connect(self);
if (status == 0)
{
// This is as good a place as any to start processing
// the resize_queue
start_processing_resize_queue(self);
}
} }
break; break;
@@ -3542,7 +3581,7 @@ xrdp_mm_get_wait_objs(struct xrdp_mm *self,
read_objs[(*rcount)++] = self->encoder->xrdp_encoder_event_processed; read_objs[(*rcount)++] = self->encoder->xrdp_encoder_event_processed;
} }
if (self->resize_queue != 0) if (self->resize_queue != 0 && self->resize_ready != NULL_WAIT_OBJ)
{ {
read_objs[(*rcount)++] = self->resize_ready; read_objs[(*rcount)++] = self->resize_ready;
} }
+2
View File
@@ -459,6 +459,8 @@ struct xrdp_mm
/* Resize on-the-fly control */ /* Resize on-the-fly control */
struct display_control_monitor_layout_data *resize_data; struct display_control_monitor_layout_data *resize_data;
struct list *resize_queue; struct list *resize_queue;
/* wait obj for resize_queue
* Only allocated when the queue can be processed */
tbus resize_ready; tbus resize_ready;
/* Last sync event if a module isn't loaded */ /* Last sync event if a module isn't loaded */
int last_sync_saved; int last_sync_saved;