[Spice-devel] [PATCH 12/23] server/red_worker: introduce common_channel_config_socket
Marc-André Lureau
marcandre.lureau at gmail.com
Sat Feb 12 11:57:01 PST 2011
ack
On Fri, Feb 11, 2011 at 6:23 PM, Alon Levy <alevy at redhat.com> wrote:
> ---
> server/red_worker.c | 50 ++++++++++++++++++++++++++++++--------------------
> 1 files changed, 30 insertions(+), 20 deletions(-)
>
> diff --git a/server/red_worker.c b/server/red_worker.c
> index 549cf79..06b53de 100644
> --- a/server/red_worker.c
> +++ b/server/red_worker.c
> @@ -9305,6 +9305,30 @@ static void red_channel_receive(RedChannel *channel)
> }
> }
>
> +int common_channel_config_socket(RedChannel *channel)
> +{
> + int flags;
> + int delay_val;
> + RedsStreamContext *peer = channel->peer;
> +
> + if ((flags = fcntl(peer->socket, F_GETFL)) == -1) {
> + red_printf("accept failed, %s", strerror(errno));
> + return FALSE;
> + }
> +
> + if (fcntl(peer->socket, F_SETFL, flags | O_NONBLOCK) == -1) {
> + red_printf("accept failed, %s", strerror(errno));
> + return FALSE;
> + }
> +
> + // TODO - this should be dynamic, not one time at channel creation
> + delay_val = IS_LOW_BANDWIDTH() ? 0 : 1;
> + if (setsockopt(peer->socket, IPPROTO_TCP, TCP_NODELAY, &delay_val, sizeof(delay_val)) == -1) {
> + red_printf("setsockopt failed, %s", strerror(errno));
> + }
> + return TRUE;
> +}
> +
> static void free_common_channel_from_listener(EventListener *ctx)
> {
> CommonChannel* common = SPICE_CONTAINEROF(ctx, CommonChannel, listener);
> @@ -9324,28 +9348,15 @@ static RedChannel *__new_channel(RedWorker *worker, int size, uint32_t channel_i
> struct epoll_event event;
> RedChannel *channel;
> CommonChannel *common;
> - int flags;
> - int delay_val;
> -
> - if ((flags = fcntl(peer->socket, F_GETFL)) == -1) {
> - red_printf("accept failed, %s", strerror(errno));
> - goto error1;
> - }
> -
> - if (fcntl(peer->socket, F_SETFL, flags | O_NONBLOCK) == -1) {
> - red_printf("accept failed, %s", strerror(errno));
> - goto error1;
> - }
> -
> - delay_val = IS_LOW_BANDWIDTH() ? 0 : 1;
> - if (setsockopt(peer->socket, IPPROTO_TCP, TCP_NODELAY, &delay_val, sizeof(delay_val)) == -1) {
> - red_printf("setsockopt failed, %s", strerror(errno));
> - }
>
> ASSERT(size >= sizeof(*channel));
> common = spice_malloc0(size);
> channel = &common->base;
> ASSERT(common == (CommonChannel*)channel);
> + channel->peer = peer;
> + if (!common_channel_config_socket(channel)) {
> + goto error;
> + }
> common->id = worker->id;
> channel->parser = spice_get_client_channel_parser(channel_id, NULL);
> common->listener.refs = 1;
> @@ -9373,16 +9384,15 @@ static RedChannel *__new_channel(RedWorker *worker, int size, uint32_t channel_i
> event.data.ptr = &common->listener;
> if (epoll_ctl(worker->epoll, EPOLL_CTL_ADD, peer->socket, &event) == -1) {
> red_printf("epoll_ctl failed, %s", strerror(errno));
> - goto error2;
> + goto error;
> }
>
> channel->migrate = migrate;
>
> return channel;
>
> -error2:
> +error:
> free(channel);
> -error1:
> peer->cb_free(peer);
>
> return NULL;
> --
> 1.7.4
>
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
>
--
Marc-André Lureau
More information about the Spice-devel
mailing list