Hey, For what it's worth, these 2 attached patches allow to compile on el6 (at least few weeks ago, did not try again just now). Christophe On Thu, Aug 18, 2016 at 06:38:12PM +0200, Francois Gouget wrote: > > The commit below causes compilation errors on RHEL 6.8 :-( > (gcc 4.4.7) > > CC red-worker.lo > In file included from display-channel.h:43, > from red-worker.c:47: > stream.h:46: error: redefinition of typedef 'DisplayChannel' > dcc.h:44: note: previous declaration of 'DisplayChannel' was here > stream.h:48: error: redefinition of typedef 'Stream' > dcc.h:45: note: previous declaration of 'Stream' was here > stream.h:89: error: redefinition of typedef 'StreamAgent' > dcc.h:46: note: previous declaration of 'StreamAgent' was here > > > > commit a84a433e0840d0eb65d4eb5c51f6cdde94a2c210 > Author: Jonathon Jongsma <jjongsma@xxxxxxxxxx> > Date: Fri Aug 5 14:02:29 2016 -0500 > > Limit direct access to DisplayChannelClient > > Add a few more methods and accessors so that other files don't need to > manipulate the struct members directly. Move the struct definition to a > private header which only the dcc-* files will include. > > Signed-off-by: Jonathon Jongsma <jjongsma@xxxxxxxxxx> > Signed-off-by: Frediano Ziglio <fziglio@xxxxxxxxxx> > Acked-by: Frediano Ziglio <fziglio@xxxxxxxxxx> > > > Presumably that's temporary and can pretty much only be endured? > > -- > Francois Gouget <fgouget@xxxxxxxxxxxxxxx> > _______________________________________________ > Spice-devel mailing list > Spice-devel@xxxxxxxxxxxxxxxxxxxxx > https://lists.freedesktop.org/mailman/listinfo/spice-devel
From 62c307ef54893b3c624e414ab4d48b6585abd704 Mon Sep 17 00:00:00 2001 From: Christophe Fergeau <cfergeau@xxxxxxxxxx> Date: Thu, 4 Aug 2016 09:51:57 +0200 Subject: [PATCH 1/2] fix RHEL6 compilation Mostly GMutex API changes, and replacing g_queue_free_full() --- server/char-device.c | 3 ++- server/gstreamer-encoder.c | 30 +++++++++++++++--------------- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/server/char-device.c b/server/char-device.c index 957fb26..d04c5a8 100644 --- a/server/char-device.c +++ b/server/char-device.c @@ -189,7 +189,8 @@ static void red_char_device_client_free(RedCharDevice *dev, dev_client->wait_for_tokens_timer = NULL; } - g_queue_free_full(dev_client->send_queue, (GDestroyNotify)red_pipe_item_unref); + g_queue_foreach(dev_client->send_queue, (GFunc)red_pipe_item_unref, NULL); + g_queue_free(dev_client->send_queue); /* remove write buffers that are associated with the client */ spice_debug("write_queue_is_empty %d", ring_is_empty(&dev->priv->write_queue) && !dev->priv->cur_write_buf); diff --git a/server/gstreamer-encoder.c b/server/gstreamer-encoder.c index e6790af..86079a0 100644 --- a/server/gstreamer-encoder.c +++ b/server/gstreamer-encoder.c @@ -118,8 +118,8 @@ typedef struct SpiceGstEncoder { uint32_t set_pipeline; /* Output buffer */ - GMutex outbuf_mutex; - GCond outbuf_cond; + GMutex *outbuf_mutex; + GCond *outbuf_cond; VideoBuffer *outbuf; /* The video bit rate. */ @@ -815,10 +815,10 @@ static GstBusSyncReply handle_pipeline_message(GstBus *bus, GstMessage *msg, gpo g_clear_error(&err); /* Unblock the main thread */ - g_mutex_lock(&encoder->outbuf_mutex); + g_mutex_lock(encoder->outbuf_mutex); encoder->outbuf = (VideoBuffer*)create_gst_video_buffer(); - g_cond_signal(&encoder->outbuf_cond); - g_mutex_unlock(&encoder->outbuf_mutex); + g_cond_signal(encoder->outbuf_cond); + g_mutex_unlock(encoder->outbuf_mutex); } return GST_BUS_PASS; } @@ -848,10 +848,10 @@ static GstFlowReturn new_sample(GstAppSink *gstappsink, gpointer video_encoder) #endif /* Notify the main thread that the output buffer is ready */ - g_mutex_lock(&encoder->outbuf_mutex); + g_mutex_lock(encoder->outbuf_mutex); encoder->outbuf = (VideoBuffer*)outbuf; - g_cond_signal(&encoder->outbuf_cond); - g_mutex_unlock(&encoder->outbuf_mutex); + g_cond_signal(encoder->outbuf_cond); + g_mutex_unlock(encoder->outbuf_mutex); return GST_FLOW_OK; } @@ -1399,13 +1399,13 @@ static int push_raw_frame(SpiceGstEncoder *encoder, static int pull_compressed_buffer(SpiceGstEncoder *encoder, VideoBuffer **outbuf) { - g_mutex_lock(&encoder->outbuf_mutex); + g_mutex_lock(encoder->outbuf_mutex); while (!encoder->outbuf) { - g_cond_wait(&encoder->outbuf_cond, &encoder->outbuf_mutex); + g_cond_wait(encoder->outbuf_cond, encoder->outbuf_mutex); } *outbuf = encoder->outbuf; encoder->outbuf = NULL; - g_mutex_unlock(&encoder->outbuf_mutex); + g_mutex_unlock(encoder->outbuf_mutex); if ((*outbuf)->data) { return VIDEO_ENCODER_FRAME_ENCODE_DONE; @@ -1425,8 +1425,8 @@ static void spice_gst_encoder_destroy(VideoEncoder *video_encoder) SpiceGstEncoder *encoder = (SpiceGstEncoder*)video_encoder; free_pipeline(encoder); - g_mutex_clear(&encoder->outbuf_mutex); - g_cond_clear(&encoder->outbuf_cond); + g_mutex_free(encoder->outbuf_mutex); + g_cond_free(encoder->outbuf_cond); /* Unref any lingering bitmap opaque structures from past frames */ clear_zero_copy_queue(encoder, TRUE); @@ -1711,8 +1711,8 @@ VideoEncoder *gstreamer_encoder_new(SpiceVideoCodecType codec_type, encoder->starting_bit_rate = starting_bit_rate; encoder->bitmap_ref = bitmap_ref; encoder->bitmap_unref = bitmap_unref; - g_mutex_init(&encoder->outbuf_mutex); - g_cond_init(&encoder->outbuf_cond); + encoder->outbuf_mutex = g_mutex_new(); + encoder->outbuf_cond = g_cond_new(); /* All the other fields are initialized to zero by spice_new0(). */ -- 1.7.1 From af2d4454e5d452de036e1705f44eb80374045df5 Mon Sep 17 00:00:00 2001 From: Christophe Fergeau <cfergeau@xxxxxxxxxx> Date: Thu, 4 Aug 2016 09:57:25 +0200 Subject: [PATCH 2/2] Remove duplicate typedef This fixes compilation on el6. This is achieved by moving the most problematic typedef to a red-types.h header. Ideally, it will go away once we have put some order in the header content/API/... For example, StreamAgent would be better as an opaque type. --- server/Makefile.am | 1 + server/image-cache.h | 4 +--- server/main-channel-client.h | 6 ++---- server/main-channel.c | 1 + server/main-channel.h | 2 +- server/red-channel.h | 2 +- server/red-types.h | 26 ++++++++++++++++++++++++++ server/red-worker.c | 2 +- server/reds.c | 1 + server/sound.c | 1 + server/stream.c | 3 ++- server/stream.h | 3 --- 12 files changed, 38 insertions(+), 14 deletions(-) create mode 100644 server/red-types.h diff --git a/server/Makefile.am b/server/Makefile.am index 921b082..8482e1c 100644 --- a/server/Makefile.am +++ b/server/Makefile.am @@ -150,6 +150,7 @@ libserver_la_SOURCES = \ display-limits.h \ image-encoders.c \ image-encoders.h \ + red-types.h \ $(NULL) if HAVE_LZ4 diff --git a/server/image-cache.h b/server/image-cache.h index b90a3b3..c5ea40b 100644 --- a/server/image-cache.h +++ b/server/image-cache.h @@ -23,9 +23,7 @@ #include <common/canvas_base.h> #include <common/ring.h> -/* FIXME: move back to display-channel.h (once structs are private) */ -typedef struct Drawable Drawable; -typedef struct DisplayChannelClient DisplayChannelClient; +#include "red-types.h" typedef struct ImageCacheItem { RingItem lru_link; diff --git a/server/main-channel-client.h b/server/main-channel-client.h index c74f847..001cd67 100644 --- a/server/main-channel-client.h +++ b/server/main-channel-client.h @@ -17,11 +17,9 @@ #ifndef __MAIN_CHANNEL_CLIENT_H__ #define __MAIN_CHANNEL_CLIENT_H__ +#include "main-channel.h" #include "red-channel.h" - -/* FIXME: remove extra MainChannel typedef when possible */ -typedef struct MainChannel MainChannel; -typedef struct MainChannelClient MainChannelClient; +#include "red-types.h" MainChannelClient *main_channel_client_create(MainChannel *main_chan, RedClient *client, RedsStream *stream, uint32_t connection_id, diff --git a/server/main-channel.c b/server/main-channel.c index 42195e6..974dec3 100644 --- a/server/main-channel.c +++ b/server/main-channel.c @@ -23,6 +23,7 @@ #include "red-common.h" #include "main-channel.h" +#include "main-channel-client.h" #include "reds.h" int main_channel_is_connected(MainChannel *main_chan) diff --git a/server/main-channel.h b/server/main-channel.h index 868a14a..d4b63f6 100644 --- a/server/main-channel.h +++ b/server/main-channel.h @@ -23,7 +23,7 @@ #include <common/marshaller.h> #include "red-channel.h" -#include "main-channel-client.h" +#include "red-types.h" // TODO: Defines used to calculate receive buffer size, and also by reds.c // other options: is to make a reds_main_consts.h, to duplicate defines. diff --git a/server/red-channel.h b/server/red-channel.h index 5b38f57..018c63c 100644 --- a/server/red-channel.h +++ b/server/red-channel.h @@ -33,6 +33,7 @@ #include "reds-stream.h" #include "stat.h" #include "red-pipe-item.h" +#include "red-types.h" #define MAX_SEND_BUFS 1000 #define CLIENT_ACK_WINDOW 20 @@ -131,7 +132,6 @@ typedef struct OutgoingHandler { typedef struct RedChannel RedChannel; typedef struct RedChannelClient RedChannelClient; typedef struct RedClient RedClient; -typedef struct MainChannelClient MainChannelClient; /* Messages handled by red_channel * SET_ACK - sent to client on channel connection diff --git a/server/red-types.h b/server/red-types.h new file mode 100644 index 0000000..a920074 --- /dev/null +++ b/server/red-types.h @@ -0,0 +1,26 @@ +/* + Copyright (C) 2016 Red Hat, Inc. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef _H_RED_TYPES +#define _H_RED_TYPES + +typedef struct MainChannelClient MainChannelClient; +typedef struct DisplayChannelClient DisplayChannelClient; +typedef struct DisplayChannel DisplayChannel; +typedef struct Drawable Drawable; + +#endif diff --git a/server/red-worker.c b/server/red-worker.c index 9238632..b8e1ada 100644 --- a/server/red-worker.c +++ b/server/red-worker.c @@ -45,8 +45,8 @@ #include <common/ring.h> #include "display-channel.h" +#include "main-channel-client.h" #include "stream.h" - #include "spice.h" #include "red-worker.h" #include "cursor-channel.h" diff --git a/server/reds.c b/server/reds.c index 6f88649..9ab917f 100644 --- a/server/reds.c +++ b/server/reds.c @@ -57,6 +57,7 @@ #include "agent-msg-filter.h" #include "inputs-channel.h" #include "main-channel.h" +#include "main-channel-client.h" #include "red-qxl.h" #include "main-dispatcher.h" #include "sound.h" diff --git a/server/sound.c b/server/sound.c index 8335101..3e6eec4 100644 --- a/server/sound.c +++ b/server/sound.c @@ -32,6 +32,7 @@ #include "spice.h" #include "red-common.h" #include "main-channel.h" +#include "main-channel-client.h" #include "reds.h" #include "red-qxl.h" #include "sound.h" diff --git a/server/stream.c b/server/stream.c index 96aca55..8d92895 100644 --- a/server/stream.c +++ b/server/stream.c @@ -18,8 +18,9 @@ #include <config.h> #endif -#include "stream.h" #include "display-channel.h" +#include "main-channel-client.h" +#include "stream.h" #define FPS_TEST_INTERVAL 1 #define FOREACH_STREAMS(display, item) \ diff --git a/server/stream.h b/server/stream.h index c40c188..812b8d1 100644 --- a/server/stream.h +++ b/server/stream.h @@ -42,9 +42,6 @@ #define RED_STREAM_DEFAULT_LOW_START_BIT_RATE (2.5 * 1024 * 1024) // 2.5Mbps #define MAX_FPS 30 -/* move back to display_channel once struct private */ -typedef struct DisplayChannel DisplayChannel; - typedef struct Stream Stream; typedef struct RedStreamActivateReportItem { -- 1.7.1
Attachment:
signature.asc
Description: PGP signature
_______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel