[Spice-devel] [PATCH v2 4/4] channel: use iface parameter to distinguish interface context
Christophe Fergeau
cfergeau at redhat.com
Mon Jan 11 05:53:55 PST 2016
Acked-by: Christophe Fergeau <cfergeau at redhat.com>
On Thu, Jan 07, 2016 at 05:32:17PM +0000, Frediano Ziglio wrote:
> Now we can use the iface parameter to distinguish the context instead
> of doing strange assumption on opaque and its state.
>
> Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> ---
> server/red-worker.c | 18 ++++++++----------
> 1 file changed, 8 insertions(+), 10 deletions(-)
>
> diff --git a/server/red-worker.c b/server/red-worker.c
> index b0b7df1..c56b316 100644
> --- a/server/red-worker.c
> +++ b/server/red-worker.c
> @@ -71,6 +71,7 @@ struct RedWorker {
> QXLInstance *qxl;
> RedDispatcher *red_dispatcher;
> int running;
> + SpiceCoreInterfaceInternal core;
> struct pollfd poll_fds[MAX_EVENT_SOURCES];
> struct SpiceWatch watches[MAX_EVENT_SOURCES];
> unsigned int event_timeout;
> @@ -534,16 +535,9 @@ static void worker_watch_update_mask(SpiceWatch *watch, int event_mask)
> static SpiceWatch *worker_watch_add(const SpiceCoreInterfaceInternal *iface,
> int fd, int event_mask, SpiceWatchFunc func, void *opaque)
> {
> - /* Since we are a channel core implementation, we always get called from
> - red_channel_client_create(), so opaque always is our rcc */
> - RedChannelClient *rcc = opaque;
> - struct RedWorker *worker;
> + RedWorker *worker = SPICE_CONTAINEROF(iface, RedWorker, core);
> int i;
>
> - /* Since we are called from red_channel_client_create()
> - CommonChannelClient->worker has not been set yet! */
> - worker = SPICE_CONTAINEROF(rcc->channel, CommonChannel, base)->worker;
> -
> /* Search for a free slot in our poll_fds & watches arrays */
> for (i = 0; i < MAX_EVENT_SOURCES; i++) {
> if (worker->poll_fds[i].fd == -1) {
> @@ -551,6 +545,9 @@ static SpiceWatch *worker_watch_add(const SpiceCoreInterfaceInternal *iface,
> }
> }
> if (i == MAX_EVENT_SOURCES) {
> + /* Since we are a channel core implementation, we always get called from
> + red_channel_client_create(), so opaque always is our rcc */
> + RedChannelClient *rcc = opaque;
> spice_warning("could not add a watch for channel type %u id %u",
> rcc->channel->type, rcc->channel->id);
> return NULL;
> @@ -581,7 +578,7 @@ static void worker_watch_remove(SpiceWatch *watch)
> memset(watch, 0, sizeof(SpiceWatch));
> }
>
> -SpiceCoreInterfaceInternal worker_core = {
> +static const SpiceCoreInterfaceInternal worker_core_initializer = {
> .timer_add = spice_timer_queue_add,
> .timer_start = spice_timer_set,
> .timer_cancel = spice_timer_cancel,
> @@ -641,7 +638,7 @@ CommonChannel *red_worker_new_channel(RedWorker *worker, int size,
> channel_cbs->alloc_recv_buf = common_alloc_recv_buf;
> channel_cbs->release_recv_buf = common_release_recv_buf;
>
> - channel = red_channel_create_parser(size, &worker_core,
> + channel = red_channel_create_parser(size, &worker->core,
> channel_type, worker->qxl->id,
> TRUE /* handle_acks */,
> spice_get_client_channel_parser(channel_type, NULL),
> @@ -1546,6 +1543,7 @@ RedWorker* red_worker_new(QXLInstance *qxl, RedDispatcher *red_dispatcher)
> qxl->st->qif->get_init_info(qxl, &init_info);
>
> worker = spice_new0(RedWorker, 1);
> + worker->core = worker_core_initializer;
>
> record_filename = getenv("SPICE_WORKER_RECORD_FILENAME");
> if (record_filename) {
> --
> 2.4.3
>
> _______________________________________________
> 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: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/spice-devel/attachments/20160111/63375248/attachment.sig>
More information about the Spice-devel
mailing list