--- server/red_channel.c | 15 +++++++++++++++ server/red_channel.h | 7 +++++++ server/red_worker.c | 20 ++++++++++++-------- 3 files changed, 34 insertions(+), 8 deletions(-)
diff --git a/server/red_channel.c b/server/red_channel.c index 01779c6..7f32c7c 100644 --- a/server/red_channel.c +++ b/server/red_channel.c @@ -1103,3 +1103,18 @@ void red_channel_pipes_new_add_tail(RedChannel *channel, new_pipe_item_t creator red_channel_pipes_create_batch(channel, creator, data, red_channel_client_pipe_add_tail_no_push); } + +uint32_t red_channel_max_pipe_size(RedChannel *channel) +{ + return channel->rcc ? channel->rcc->pipe_size : 0; +} + +uint32_t red_channel_min_pipe_size(RedChannel *channel) +{ + return channel->rcc ? channel->rcc->pipe_size : 0; +} + +uint32_t red_channel_sum_pipes_size(RedChannel *channel) +{ + return channel->rcc ? channel->rcc->pipe_size : 0; +} diff --git a/server/red_channel.h b/server/red_channel.h index a48d3a5..4b29b0c 100644 --- a/server/red_channel.h +++ b/server/red_channel.h @@ -365,6 +365,13 @@ RedClient *red_channel_client_get_client(RedChannelClient *rcc); * not via the below accessor and direct header manipulation. */ SpiceDataHeader *red_channel_client_get_header(RedChannelClient *rcc); +/* return the sum of all the rcc pipe size */ +uint32_t red_channel_max_pipe_size(RedChannel *channel); +/* return the min size of all the rcc pipe */ +uint32_t red_channel_min_pipe_size(RedChannel *channel); +/* return the max size of all the rcc pipe */ +uint32_t red_channel_sum_pipes_size(RedChannel *channel); + /* apply given function to all connected clients */ typedef void (*channel_client_callback)(RedChannelClient *rcc); typedef void (*channel_client_callback_data)(RedChannelClient *rcc, void *data); diff --git a/server/red_worker.c b/server/red_worker.c index c2e1623..474e125 100644 --- a/server/red_worker.c +++ b/server/red_worker.c @@ -4349,7 +4349,7 @@ static int red_process_cursor(RedWorker *worker, uint32_t max_pipe_size, int *ri *ring_is_empty = FALSE; while (!cursor_is_connected(worker) || - worker->cursor_channel->common.base.rcc->pipe_size <= max_pipe_size) { + red_channel_min_pipe_size(&worker->cursor_channel->common.base) <= max_pipe_size) { if (!worker->qxl->st->qif->get_cursor_command(worker->qxl, &ext_cmd)) { *ring_is_empty = TRUE; if (worker->repoll_cursor_ring < CMD_RING_POLL_RETRIES) { @@ -4387,10 +4387,10 @@ static int red_process_commands(RedWorker *worker, uint32_t max_pipe_size, int * QXLCommandExt ext_cmd; int n = 0; uint64_t start = red_now(); - + *ring_is_empty = FALSE; - while (!display_is_connected(worker) - || worker->display_channel->common.base.rcc->pipe_size <= max_pipe_size) { + while (!display_is_connected(worker) || + red_channel_min_pipe_size(&worker->display_channel->common.base) <= max_pipe_size) { if (!worker->qxl->st->qif->get_command(worker->qxl, &ext_cmd)) { *ring_is_empty = TRUE;; if (worker->repoll_cmd_ring < CMD_RING_POLL_RETRIES) { @@ -8707,6 +8707,8 @@ static void red_wait_outgoing_items(RedChannel *channel); static inline void flush_display_commands(RedWorker *worker) { + RedChannel *display_red_channel = &worker->display_channel->common.base; + for (;;) { uint64_t end_time; int ring_is_empty; @@ -8728,7 +8730,7 @@ static inline void flush_display_commands(RedWorker *worker) for (;;) { red_channel_push(&worker->display_channel->common.base); if (!display_is_connected(worker) || - worker->display_channel->common.base.rcc->pipe_size <= MAX_PIPE_SIZE) { + red_channel_min_pipe_size(display_red_channel) <= MAX_PIPE_SIZE) { break; } RedChannel *channel = (RedChannel *)worker->display_channel; @@ -8749,6 +8751,8 @@ static inline void flush_display_commands(RedWorker *worker) static inline void flush_cursor_commands(RedWorker *worker) { + RedChannel *cursor_red_channel = &worker->cursor_channel->common.base; + for (;;) { uint64_t end_time; int ring_is_empty = FALSE; @@ -8770,7 +8774,7 @@ static inline void flush_cursor_commands(RedWorker *worker) for (;;) { red_channel_push(&worker->cursor_channel->common.base); if (!cursor_is_connected(worker) - || worker->cursor_channel->common.base.rcc->pipe_size <= MAX_PIPE_SIZE) { + || red_channel_min_pipe_size(cursor_red_channel) <= MAX_PIPE_SIZE) { break; } RedChannel *channel = (RedChannel *)worker->cursor_channel; @@ -10101,9 +10105,9 @@ static void handle_dev_input(EventListener *listener, uint32_t events) red_channel_push(&worker->display_channel->common.base); } if (worker->qxl->st->qif->flush_resources(worker->qxl) == 0) { - red_printf("oom current %u pipe %u", worker->render.current_size, + red_printf("oom current %u pipes %u", worker->render.current_size, worker->display_channel ? - display_red_channel->rcc->pipe_size : 0); + red_channel_sum_pipes_size(display_red_channel) : 0); red_free_some(worker); worker->qxl->st->qif->flush_resources(worker->qxl); } -- 1.7.5.1 _______________________________________________ Spice-devel mailing list Spice-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/spice-devel