[Spice-devel] [spice-server v3 5/6] reds-stream: Introduce reds_stream_get_no_delay() helper
Frediano Ziglio
fziglio at redhat.com
Thu Mar 30 17:36:15 UTC 2017
>
> This new function removes one place outside of RedsStream which needs to
> access RedsStream::socket
>
> Signed-off-by: Christophe Fergeau <cfergeau at redhat.com>
Acked-by: Frediano Ziglio <fziglio at redhat.com>
> ---
> server/net-utils.c | 20 ++++++++++++++++++++
> server/net-utils.h | 1 +
> server/red-channel-client.c | 7 ++-----
> server/reds-stream.c | 5 +++++
> server/reds-stream.h | 1 +
> 5 files changed, 29 insertions(+), 5 deletions(-)
>
> diff --git a/server/net-utils.c b/server/net-utils.c
> index 44e1987..c316945 100644
> --- a/server/net-utils.c
> +++ b/server/net-utils.c
> @@ -108,3 +108,23 @@ bool red_socket_set_non_blocking(int fd, bool
> non_blocking)
>
> return true;
> }
> +
> +/**
> + * red_socket_get_no_delay:
> + * @fd: a socket file descriptor
> + *
> + * Returns: The current value of TCP_NODELAY for @fd, -1 if an error
> occurred
> + */
> +int red_socket_get_no_delay(int fd)
> +{
> + int delay_val;
> + socklen_t opt_size = sizeof(delay_val);
> +
> + if (getsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &delay_val,
> + &opt_size) == -1) {
> + spice_warning("getsockopt failed, %s", strerror(errno));
> + return -1;
> + }
> +
> + return delay_val;
> +}
> diff --git a/server/net-utils.h b/server/net-utils.h
> index d56b479..e0f918d 100644
> --- a/server/net-utils.h
> +++ b/server/net-utils.h
> @@ -22,6 +22,7 @@
>
> bool red_socket_set_keepalive(int fd, bool enable, int timeout);
> bool red_socket_set_no_delay(int fd, bool no_delay);
> +int red_socket_get_no_delay(int fd);
> bool red_socket_set_non_blocking(int fd, bool non_blocking);
>
> #endif
> diff --git a/server/red-channel-client.c b/server/red-channel-client.c
> index 9fca8c1..ffebc6a 100644
> --- a/server/red-channel-client.c
> +++ b/server/red-channel-client.c
> @@ -556,7 +556,6 @@ static void red_channel_client_send_ping(RedChannelClient
> *rcc)
>
> if (!rcc->priv->latency_monitor.warmup_was_sent) { // latency test start
> int delay_val;
> - socklen_t opt_size = sizeof(delay_val);
>
> rcc->priv->latency_monitor.warmup_was_sent = TRUE;
> /*
> @@ -565,10 +564,8 @@ static void
> red_channel_client_send_ping(RedChannelClient *rcc)
> * roundtrip measurement is less accurate (bigger).
> */
> rcc->priv->latency_monitor.tcp_nodelay = 1;
> - if (getsockopt(rcc->priv->stream->socket, IPPROTO_TCP, TCP_NODELAY,
> &delay_val,
> - &opt_size) == -1) {
> - spice_warning("getsockopt failed, %s", strerror(errno));
> - } else {
> + delay_val = reds_stream_get_no_delay(rcc->priv->stream);
> + if (delay_val != -1) {
> rcc->priv->latency_monitor.tcp_nodelay = delay_val;
> if (!delay_val) {
> reds_stream_set_no_delay(rcc->priv->stream, TRUE);
> diff --git a/server/reds-stream.c b/server/reds-stream.c
> index 4d5b258..7f95215 100644
> --- a/server/reds-stream.c
> +++ b/server/reds-stream.c
> @@ -273,6 +273,11 @@ bool reds_stream_set_no_delay(RedsStream *stream, bool
> no_delay)
> return red_socket_set_no_delay(stream->socket, no_delay);
> }
>
> +int reds_stream_get_no_delay(RedsStream *stream)
> +{
> + return red_socket_get_no_delay(stream->socket);
> +}
> +
> int reds_stream_send_msgfd(RedsStream *stream, int fd)
> {
> struct msghdr msgh = { 0, };
> diff --git a/server/reds-stream.h b/server/reds-stream.h
> index 37ba87c..b4fc8b2 100644
> --- a/server/reds-stream.h
> +++ b/server/reds-stream.h
> @@ -73,6 +73,7 @@ int reds_stream_enable_ssl(RedsStream *stream, SSL_CTX
> *ctx);
> int reds_stream_get_family(const RedsStream *stream);
> bool reds_stream_is_plain_unix(const RedsStream *stream);
> bool reds_stream_set_no_delay(RedsStream *stream, bool no_delay);
> +int reds_stream_get_no_delay(RedsStream *stream);
> int reds_stream_send_msgfd(RedsStream *stream, int fd);
>
> typedef enum {
Frediano
More information about the Spice-devel
mailing list