Skip to content

Commit

Permalink
Add explicit object for the encoder finishing
Browse files Browse the repository at this point in the history
On a resize, the encoder is deleted. At present this is done by asking
the encoder to exit, and then waiting a second.

- On slower systems, a second may not be enough, and so the encoder
  data structures are freed while they are still being used by the
  encoder.
- On quicker systems, resizes are delayed by hundreds of milliseconds
  longer than they need to be.

This commit adds a wait object which the encoder can use to signal it
has actually finished.

(cherry picked from commit 985b0de)
  • Loading branch information
matt335672 committed Jun 10, 2024
1 parent a430eb9 commit a5ec4a3
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 6 deletions.
17 changes: 12 additions & 5 deletions xrdp/xrdp_encoder.c
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,8 @@ xrdp_encoder_create(struct xrdp_mm *mm)
g_snprintf(buf, 1024, "xrdp_%8.8x_encoder_event_processed", pid);
self->xrdp_encoder_event_processed = g_create_wait_obj(buf);
g_snprintf(buf, 1024, "xrdp_%8.8x_encoder_term", pid);
self->xrdp_encoder_term = g_create_wait_obj(buf);
self->xrdp_encoder_term_request = g_create_wait_obj(buf);
self->xrdp_encoder_term_done = g_create_wait_obj(buf);
if (client_info->gfx)
{
const char *env_var = g_getenv("XRDP_GFX_FRAMES_IN_FLIGHT");
Expand Down Expand Up @@ -280,8 +281,12 @@ xrdp_encoder_delete(struct xrdp_encoder *self)
return;
}
/* tell worker thread to shut down */
g_set_wait_obj(self->xrdp_encoder_term);
g_sleep(1000);
g_set_wait_obj(self->xrdp_encoder_term_request);
g_obj_wait(&self->xrdp_encoder_term_done, 1, NULL, 0, 5000);
if (!g_is_wait_obj_set(self->xrdp_encoder_term_done))
{
LOG(LOG_LEVEL_WARNING, "Encoder failed to shut down cleanly");
}

#ifdef XRDP_RFXCODEC
for (index = 0; index < 16; index++)
Expand Down Expand Up @@ -314,7 +319,8 @@ xrdp_encoder_delete(struct xrdp_encoder *self)
/* destroy wait objects used for signalling */
g_delete_wait_obj(self->xrdp_encoder_event_to_proc);
g_delete_wait_obj(self->xrdp_encoder_event_processed);
g_delete_wait_obj(self->xrdp_encoder_term);
g_delete_wait_obj(self->xrdp_encoder_term_request);
g_delete_wait_obj(self->xrdp_encoder_term_done);

/* cleanup fifos */
fifo_delete(self->fifo_to_proc, NULL);
Expand Down Expand Up @@ -1127,7 +1133,7 @@ proc_enc_msg(void *arg)
event_to_proc = self->xrdp_encoder_event_to_proc;

term_obj = g_get_term();
lterm_obj = self->xrdp_encoder_term;
lterm_obj = self->xrdp_encoder_term_request;

cont = 1;
while (cont)
Expand Down Expand Up @@ -1178,6 +1184,7 @@ proc_enc_msg(void *arg)
}

} /* end while (cont) */
g_set_wait_obj(self->xrdp_encoder_term_done);
LOG_DEVEL(LOG_LEVEL_DEBUG, "proc_enc_msg: thread exit");
return 0;
}
3 changes: 2 additions & 1 deletion xrdp/xrdp_encoder.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ struct xrdp_encoder
int max_compressed_bytes;
tbus xrdp_encoder_event_to_proc;
tbus xrdp_encoder_event_processed;
tbus xrdp_encoder_term;
tbus xrdp_encoder_term_request;
tbus xrdp_encoder_term_done;
struct fifo *fifo_to_proc;
struct fifo *fifo_processed;
tbus mutex;
Expand Down

0 comments on commit a5ec4a3

Please sign in to comment.