server/red_worker: add red_channel_push

This commit is contained in:
Alon Levy 2010-11-08 01:50:04 +02:00
parent 111cf51103
commit a0a9718423

View File

@ -969,7 +969,7 @@ typedef struct BitmapData {
static void red_draw_qxl_drawable(RedWorker *worker, Drawable *drawable);
static void red_current_flush(RedWorker *worker, int surface_id);
static void display_channel_push(RedWorker *worker);
static void red_channel_push(RedChannel *channel);
#ifdef DRAW_ALL
#define red_update_area(worker, rect, surface_id)
#define red_draw_drawable(worker, item)
@ -4560,7 +4560,7 @@ static void red_add_surface_image(RedWorker *worker, int surface_id)
/* not allowing lossy compression because probably, especially if it is a primary surface,
it combines both "picture-like" areas with areas that are more "artificial"*/
red_add_surface_area_image(worker, surface_id, &area, NULL, FALSE);
display_channel_push(worker);
red_channel_push(&worker->display_channel->common.base);
}
typedef struct {
@ -8260,7 +8260,7 @@ static void red_send_cursor(CursorChannel *cursor_channel, CursorItem *cursor)
red_channel_begin_send_message(channel);
red_release_cursor(cursor_channel->common.worker, cursor);
red_release_cursor(worker, cursor);
}
static void red_send_surface_create(DisplayChannel *display, SpiceMsgSurfaceCreate *surface_create)
@ -8407,13 +8407,24 @@ static void display_channel_send_item(RedChannel *base, PipeItem *pipe_item)
red_unref_channel((RedChannel *)display_channel);
}
static void display_channel_push(RedWorker *worker)
void red_channel_push(RedChannel *channel)
{
PipeItem *pipe_item;
while ((pipe_item = red_channel_pipe_get((RedChannel *)worker->display_channel))) {
display_channel_send_item((RedChannel *)worker->display_channel, pipe_item);
if (!channel->during_send) {
channel->during_send = TRUE;
} else {
return;
}
if (channel->send_data.blocked) {
red_channel_send(channel);
}
while ((pipe_item = red_channel_pipe_get(channel))) {
channel->send_item(channel, pipe_item);
}
channel->during_send = FALSE;
}
static void cursor_channel_send_item(RedChannel *channel, PipeItem *pipe_item)
@ -8462,19 +8473,14 @@ static void cursor_channel_send_item(RedChannel *channel, PipeItem *pipe_item)
red_unref_channel(channel);
}
static void cursor_channel_push(RedWorker *worker)
{
PipeItem *pipe_item;
while ((pipe_item = red_channel_pipe_get((RedChannel *)worker->cursor_channel))) {
cursor_channel_send_item(&worker->cursor_channel->common.base, pipe_item);
}
}
static inline void red_push(RedWorker *worker)
{
cursor_channel_push(worker);
display_channel_push(worker);
if (worker->cursor_channel) {
red_channel_push(&worker->cursor_channel->common.base);
}
if (worker->display_channel) {
red_channel_push(&worker->display_channel->common.base);
}
}
typedef struct ShowTreeData {
@ -8802,7 +8808,7 @@ static inline void flush_display_commands(RedWorker *worker)
}
while (red_process_commands(worker, MAX_PIPE_SIZE, &ring_is_empty)) {
display_channel_push(worker);
red_channel_push(&worker->display_channel->common.base);
}
if (ring_is_empty) {
@ -8811,7 +8817,7 @@ static inline void flush_display_commands(RedWorker *worker)
end_time = red_now() + DISPLAY_CLIENT_TIMEOUT * 10;
int sleep_count = 0;
for (;;) {
display_channel_push(worker);
red_channel_push(&worker->display_channel->common.base);
if (!worker->display_channel ||
worker->display_channel->common.base.pipe_size <= MAX_PIPE_SIZE) {
break;
@ -8844,7 +8850,7 @@ static inline void flush_cursor_commands(RedWorker *worker)
}
while (red_process_cursor(worker, MAX_PIPE_SIZE, &ring_is_empty)) {
cursor_channel_push(worker);
red_channel_push(&worker->cursor_channel->common.base);
}
if (ring_is_empty) {
@ -8853,7 +8859,7 @@ static inline void flush_cursor_commands(RedWorker *worker)
end_time = red_now() + DISPLAY_CLIENT_TIMEOUT * 10;
int sleep_count = 0;
for (;;) {
cursor_channel_push(worker);
red_channel_push(&worker->cursor_channel->common.base);
if (!worker->cursor_channel ||
worker->cursor_channel->common.base.pipe_size <= MAX_PIPE_SIZE) {
break;
@ -8889,7 +8895,7 @@ static void push_new_primary_surface(RedWorker *worker)
if (!display_channel->common.base.migrate) {
red_create_surface_item(worker, 0);
}
display_channel_push(worker);
red_channel_push(&worker->display_channel->common.base);
}
}
@ -9939,7 +9945,7 @@ static inline void handle_dev_create_primary_surface(RedWorker *worker)
if (worker->display_channel) {
red_pipe_add_verb(&worker->display_channel->common.base, SPICE_MSG_DISPLAY_MARK);
display_channel_push(worker);
red_channel_push(&worker->display_channel->common.base);
}
if (worker->cursor_channel) {
@ -10010,7 +10016,7 @@ static void handle_dev_input(EventListener *listener, uint32_t events)
case RED_WORKER_MESSAGE_OOM:
ASSERT(worker->running);
while (red_process_commands(worker, MAX_PIPE_SIZE, &ring_is_empty)) {
display_channel_push(worker);
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->current_size,