[Spice-devel] [PATCH spice 02/18] server/red_worker: add get_stream_id
Christophe Fergeau
cfergeau at redhat.com
Thu May 3 05:33:28 PDT 2012
On Wed, May 02, 2012 at 05:01:37PM +0300, Yonit Halperin wrote:
> ---
> server/red_worker.c | 27 ++++++++++++++++-----------
> 1 files changed, 16 insertions(+), 11 deletions(-)
>
> diff --git a/server/red_worker.c b/server/red_worker.c
> index 07782c8..09a9357 100644
> --- a/server/red_worker.c
> +++ b/server/red_worker.c
> @@ -2485,6 +2485,11 @@ static void red_display_release_stream_clip(RedWorker *worker, StreamClipItem *i
> }
> }
>
> +static inline int get_stream_id(RedWorker *worker, Stream *stream)
'inline' isn't needed here, better to let gcc figure things out.
> +{
> + return (int)(stream - worker->streams_buf);
> +}
Returning a (signed) int from this function which will then be used as an
array index makes me uncomfortable. We should add a MIN(0, ...), or assert
if it gets negative.
> +
> static void red_attach_stream(RedWorker *worker, Drawable *drawable, Stream *stream)
> {
> DisplayChannelClient *dcc;
> @@ -2498,7 +2503,7 @@ static void red_attach_stream(RedWorker *worker, Drawable *drawable, Stream *str
> stream->last_time = drawable->creation_time;
>
> WORKER_FOREACH_DCC(worker, item, dcc) {
> - agent = &dcc->stream_agents[stream - worker->streams_buf];
> + agent = &dcc->stream_agents[get_stream_id(worker, stream)];
> if (!region_is_equal(&agent->vis_region, &drawable->tree_item.base.rgn)) {
> region_destroy(&agent->vis_region);
> region_clone(&agent->vis_region, &drawable->tree_item.base.rgn);
> @@ -2516,7 +2521,7 @@ static void red_stop_stream(RedWorker *worker, Stream *stream)
> spice_assert(!stream->current);
> WORKER_FOREACH_DCC(worker, item, dcc) {
> StreamAgent *stream_agent;
> - stream_agent = &dcc->stream_agents[stream - worker->streams_buf];
> + stream_agent = &dcc->stream_agents[get_stream_id(worker, stream)];
> region_clear(&stream_agent->vis_region);
> spice_assert(!pipe_item_is_linked(&stream_agent->destroy_item));
> stream->refs++;
> @@ -2578,7 +2583,7 @@ static void red_detach_streams_behind(RedWorker *worker, QRegion *region)
> item = ring_next(ring, item);
>
> WORKER_FOREACH_DCC(worker, dcc_ring_item, dcc) {
> - StreamAgent *agent = &dcc->stream_agents[stream - worker->streams_buf];
> + StreamAgent *agent = &dcc->stream_agents[get_stream_id(worker, stream)];
> if (region_intersects(&agent->vis_region, region)) {
> region_clear(&agent->vis_region);
> push_stream_clip(dcc, agent);
> @@ -2628,7 +2633,7 @@ static void red_streams_update_clip(RedWorker *worker, Drawable *drawable)
> }
>
> WORKER_FOREACH_DCC(worker, dcc_ring_item, dcc) {
> - agent = &dcc->stream_agents[stream - worker->streams_buf];
> + agent = &dcc->stream_agents[get_stream_id(worker, stream)];
>
> if (region_intersects(&agent->vis_region, &drawable->tree_item.base.rgn)) {
> region_exclude(&agent->vis_region, &drawable->tree_item.base.rgn);
> @@ -2735,7 +2740,7 @@ static int get_minimal_bit_rate(RedWorker *worker, int width, int height)
>
> static void red_display_create_stream(DisplayChannelClient *dcc, Stream *stream)
> {
> - StreamAgent *agent = &dcc->stream_agents[stream - dcc->common.worker->streams_buf];
> + StreamAgent *agent = &dcc->stream_agents[get_stream_id(dcc->common.worker, stream)];
>
> stream->refs++;
> spice_assert(region_is_empty(&agent->vis_region));
> @@ -2927,7 +2932,7 @@ static inline void pre_stream_item_swap(RedWorker *worker, Stream *stream)
> return;
> }
>
> - index = stream - worker->streams_buf;
> + index = get_stream_id(worker, stream);
> DRAWABLE_FOREACH_DPI(stream->current, ring_item, dpi) {
> dcc = dpi->dcc;
> if (!display_channel_client_is_low_bandwidth(dcc)) {
> @@ -8036,7 +8041,7 @@ static inline int red_marshall_stream_data(RedChannelClient *rcc,
> return FALSE;
> }
>
> - StreamAgent *agent = &dcc->stream_agents[stream - worker->streams_buf];
> + StreamAgent *agent = &dcc->stream_agents[get_stream_id(worker, stream)];
> uint64_t time_now = red_now();
> size_t outbuf_size;
> if (time_now - agent->last_send_time < (1000 * 1000 * 1000) / agent->fps) {
> @@ -8061,7 +8066,7 @@ static inline int red_marshall_stream_data(RedChannelClient *rcc,
>
> SpiceMsgDisplayStreamData stream_data;
>
> - stream_data.id = stream - worker->streams_buf;
> + stream_data.id = get_stream_id(worker, stream);
> stream_data.multi_media_time = drawable->red_drawable->mm_time;
> stream_data.data_size = n;
> spice_marshall_msg_display_stream_data(base_marshaller, &stream_data);
> @@ -8361,7 +8366,7 @@ static void red_display_marshall_stream_start(RedChannelClient *rcc,
> SpiceClipRects clip_rects;
>
> stream_create.surface_id = 0;
> - stream_create.id = agent - dcc->stream_agents;
> + stream_create.id = get_stream_id(dcc->common.worker, stream);
> stream_create.flags = stream->top_down ? SPICE_STREAM_FLAGS_TOP_DOWN : 0;
> stream_create.codec_type = SPICE_VIDEO_CODEC_TYPE_MJPEG;
>
> @@ -8397,7 +8402,7 @@ static void red_display_marshall_stream_clip(RedChannelClient *rcc,
> red_channel_client_init_send_data(rcc, SPICE_MSG_DISPLAY_STREAM_CLIP, &item->base);
> SpiceMsgDisplayStreamClip stream_clip;
>
> - stream_clip.id = agent - dcc->stream_agents;
> + stream_clip.id = get_stream_id(dcc->common.worker, agent->stream);
> stream_clip.clip.type = item->clip_type;
> stream_clip.clip.rects = item->rects;
>
> @@ -8411,7 +8416,7 @@ static void red_display_marshall_stream_end(RedChannelClient *rcc,
> SpiceMsgDisplayStreamDestroy destroy;
>
> red_channel_client_init_send_data(rcc, SPICE_MSG_DISPLAY_STREAM_DESTROY, NULL);
> - destroy.id = agent - dcc->stream_agents;
> + destroy.id = get_stream_id(dcc->common.worker, agent->stream);
>
> spice_marshall_msg_display_stream_destroy(base_marshaller, &destroy);
> }
> --
> 1.7.7.6
>
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/spice-devel/attachments/20120503/0456ae33/attachment-0001.pgp>
More information about the Spice-devel
mailing list