[Spice-devel] spice server is stuck when playing video

Coolper Chen lxchen at tnsoft.com.cn
Thu Apr 22 00:26:02 PDT 2010


Hi,

I build the spice from git, and do some test. I find one issue when I
playing video in windows xp(sp2), here's the steps to reproduce:
1.use KMPlayer to play a video,wait for some time,the spice server will
be stuck;
2.use "top" command to watch qemu process, find the process's cpu usage
rate is 100%;

So, I use gdb to see what happened, I found why it stucks,

static void fill_cursor(CursorChannel *cursor_channel, SpiceCursor
*red_cursor, CursorItem *cursor)
{
    RedChannel *channel = &cursor_channel->base;

    if (!cursor) {
        red_cursor->flags = SPICE_CURSOR_FLAGS_NONE;
        return;
    }

    if (cursor->type == CURSOR_TYPE_DEV) {
        QXLCursorCmd *cursor_cmd;
        QXLCursor *qxl_cursor;

        cursor_cmd = cursor->qxl_cursor;
        qxl_cursor = (QXLCursor *)get_virt(&channel->worker->mem_slots,
cursor_cmd->u.set.shape,
                                           sizeof(QXLCursor),
cursor->group_id);
        red_cursor->flags = 0;
        red_cursor->header = qxl_cursor->header;

        if (red_cursor->header.unique) {
            if (red_cursor_cache_find(cursor_channel,
red_cursor->header.unique)) {
                red_cursor->flags |= SPICE_CURSOR_FLAGS_FROM_CACHE;
                return;
            }
            if (red_cursor_cache_add(cursor_channel,
red_cursor->header.unique, 1)) {
                red_cursor->flags |= SPICE_CURSOR_FLAGS_CACHE_ME;
            }
        }

        if (qxl_cursor->data_size) {
            // QXLDataChunk *chunk = (QXLDataChunk *)&qxl_cursor->chunk;
            // chunk->data_size is different from qxl_cursor->data_size,
here is why spice server stuck,
            // in my case,qxl_cursor->data_size is 4224,
chunk->data_size is 128, so in red_send_data() function, it enters
infinite loop.
            add_buf(channel, BUF_TYPE_CHUNK, &qxl_cursor->chunk,
qxl_cursor->data_size,
                    get_memslot_id(&channel->worker->mem_slots,
cursor_cmd->u.set.shape), cursor->group_id);
        }
    } else {
        LocalCursor *local_cursor;
        ASSERT(cursor->type == CURSOR_TYPE_LOCAL);
        local_cursor = (LocalCursor *)cursor;
        *red_cursor = local_cursor->red_cursor;
        add_buf(channel, BUF_TYPE_RAW, local_cursor->red_cursor.data,
local_cursor->data_size, 0,
                0);
    }
}

Welcome for giving some comments.

Best Regards,
Coolper
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/spice-devel/attachments/20100422/07bcbf70/attachment.htm>


More information about the Spice-devel mailing list