From 8b0a359be21c8b66c7f7f5d34b85df3cf6689035 Mon Sep 17 00:00:00 2001
From: Francois Cartegnie <fcvlcdev@free.fr>
Date: Sun, 24 Jul 2016 12:59:20 +0200
Subject: [PATCH] Fix build using old GCC intrinsics

As the 2.2 headers are still using vlc_atomics (picture)
we cannot have a way to avoid collisions with early
or late <atomic> inclusion when using GCC >= 4.7

Conditionals in vlc_atomic won't work.

Happens in ProjectM and Qt5.

Signed-off-by: Jean-Baptiste Kempf <jb@videolan.org>
---
 modules/gui/qt4/actions_manager.cpp                |  2 ++
 modules/gui/qt4/adapters/seekpoints.cpp            |  4 +--
 modules/gui/qt4/adapters/seekpoints.hpp            |  4 +--
 modules/gui/qt4/components/controller.cpp          |  2 ++
 .../gui/qt4/components/playlist/playlist_model.hpp |  4 +--
 modules/gui/qt4/components/playlist/views.cpp      |  6 ++++
 modules/gui/qt4/dialogs/messages.cpp               |  2 ++
 modules/gui/qt4/dialogs/vlm.cpp                    |  4 ---
 modules/gui/qt4/dialogs/vlm.hpp                    |  4 ++-
 modules/gui/qt4/input_manager.cpp                  |  2 ++
 modules/gui/qt4/input_manager.hpp                  |  3 +-
 modules/gui/qt4/menus.cpp                          |  2 ++
 modules/gui/qt4/qt4.hpp                            | 32 ++++++++++++++++++----
 modules/gui/qt4/util/pictureflow.cpp               |  2 ++
 modules/visualization/projectm.cpp                 |  4 +++
 15 files changed, 56 insertions(+), 21 deletions(-)

diff --git a/modules/gui/qt4/actions_manager.cpp b/modules/gui/qt4/actions_manager.cpp
index eff40d9..b7ca967 100644
--- a/modules/gui/qt4/actions_manager.cpp
+++ b/modules/gui/qt4/actions_manager.cpp
@@ -25,6 +25,8 @@
 # include "config.h"
 #endif
 
+#include "qt4.hpp"
+
 #include <vlc_vout.h>
 #include <vlc_keys.h>
 
diff --git a/modules/gui/qt4/adapters/seekpoints.cpp b/modules/gui/qt4/adapters/seekpoints.cpp
index fbf2957..a3564bb 100644
--- a/modules/gui/qt4/adapters/seekpoints.cpp
+++ b/modules/gui/qt4/adapters/seekpoints.cpp
@@ -19,14 +19,12 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  *****************************************************************************/
 
+#include "seekpoints.hpp"
 
 #include "recents.hpp"
 #include "dialogs_provider.hpp"
 #include "menus.hpp"
 
-#include "seekpoints.hpp"
-
-#include "qt4.hpp"
 #include "input_manager.hpp"
 
 SeekPoints::SeekPoints( QObject *parent, intf_thread_t *p_intf_ ) :
diff --git a/modules/gui/qt4/adapters/seekpoints.hpp b/modules/gui/qt4/adapters/seekpoints.hpp
index 0083989..bbb9214 100644
--- a/modules/gui/qt4/adapters/seekpoints.hpp
+++ b/modules/gui/qt4/adapters/seekpoints.hpp
@@ -22,9 +22,7 @@
 #ifndef SEEKPOINTS_HPP
 #define SEEKPOINTS_HPP
 
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
+#include "qt4.hpp"
 
 #include <vlc_common.h>
 #include <vlc_interface.h>
diff --git a/modules/gui/qt4/components/controller.cpp b/modules/gui/qt4/components/controller.cpp
index d93e0db..c43d929 100644
--- a/modules/gui/qt4/components/controller.cpp
+++ b/modules/gui/qt4/components/controller.cpp
@@ -26,6 +26,8 @@
 # include "config.h"
 #endif
 
+#include "qt4.hpp"
+
 #include <vlc_vout.h>                       /* vout_thread_t for FSC */
 
 /* Widgets */
diff --git a/modules/gui/qt4/components/playlist/playlist_model.hpp b/modules/gui/qt4/components/playlist/playlist_model.hpp
index f9d1d0c..1f71ac9 100644
--- a/modules/gui/qt4/components/playlist/playlist_model.hpp
+++ b/modules/gui/qt4/components/playlist/playlist_model.hpp
@@ -25,9 +25,7 @@
 #ifndef _PLAYLIST_MODEL_H_
 #define _PLAYLIST_MODEL_H_
 
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
+#include "qt4.hpp"
 
 #include <vlc_input.h>
 #include <vlc_playlist.h>
diff --git a/modules/gui/qt4/components/playlist/views.cpp b/modules/gui/qt4/components/playlist/views.cpp
index 59f6535..0066205 100644
--- a/modules/gui/qt4/components/playlist/views.cpp
+++ b/modules/gui/qt4/components/playlist/views.cpp
@@ -21,6 +21,12 @@
  * 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  *****************************************************************************/
 
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "qt4.hpp"
+
 #include "components/playlist/views.hpp"
 #include "components/playlist/vlc_model.hpp"      /* VLCModel */
 #include "components/playlist/sorting.h"          /* Columns List */
diff --git a/modules/gui/qt4/dialogs/messages.cpp b/modules/gui/qt4/dialogs/messages.cpp
index 30793a2..9c79c99 100644
--- a/modules/gui/qt4/dialogs/messages.cpp
+++ b/modules/gui/qt4/dialogs/messages.cpp
@@ -24,6 +24,8 @@
 # include "config.h"
 #endif
 
+#include "qt4.hpp"
+
 #include "dialogs/messages.hpp"
 
 #include <QPlainTextEdit>
diff --git a/modules/gui/qt4/dialogs/vlm.cpp b/modules/gui/qt4/dialogs/vlm.cpp
index 0da88cc..595f015 100644
--- a/modules/gui/qt4/dialogs/vlm.cpp
+++ b/modules/gui/qt4/dialogs/vlm.cpp
@@ -23,10 +23,6 @@
  * Foundation, Inc., 51 Franklin street, Fifth Floor, Boston MA 02110-1301, USA.
  *****************************************************************************/
 
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
 #include "dialogs/vlm.hpp"
 
 #ifdef ENABLE_VLM
diff --git a/modules/gui/qt4/dialogs/vlm.hpp b/modules/gui/qt4/dialogs/vlm.hpp
index a3c6e5d..dcf7110 100644
--- a/modules/gui/qt4/dialogs/vlm.hpp
+++ b/modules/gui/qt4/dialogs/vlm.hpp
@@ -25,8 +25,10 @@
 #ifndef QVLC_VLM_DIALOG_H_
 #define QVLC_VLM_DIALOG_H_ 1
 
+#include "qt4.hpp"
+
 #ifdef HAVE_CONFIG_H
-# include "config.h"
+#include "config.h"
 #endif
 
 #ifdef ENABLE_VLM
diff --git a/modules/gui/qt4/input_manager.cpp b/modules/gui/qt4/input_manager.cpp
index fd45f4a..c50cb6c 100644
--- a/modules/gui/qt4/input_manager.cpp
+++ b/modules/gui/qt4/input_manager.cpp
@@ -30,6 +30,8 @@
 # include "config.h"
 #endif
 
+#include "qt4.hpp"
+
 #include "input_manager.hpp"
 #include "recents.hpp"
 
diff --git a/modules/gui/qt4/input_manager.hpp b/modules/gui/qt4/input_manager.hpp
index 7d3b76a..4fbecbb 100644
--- a/modules/gui/qt4/input_manager.hpp
+++ b/modules/gui/qt4/input_manager.hpp
@@ -29,9 +29,10 @@
 # include "config.h"
 #endif
 
+#include "qt4.hpp"
+
 #include <vlc_input.h>
 
-#include "qt4.hpp"
 #include "util/singleton.hpp"
 #include "adapters/variables.hpp"
 
diff --git a/modules/gui/qt4/menus.cpp b/modules/gui/qt4/menus.cpp
index 116e98c..46240b0 100644
--- a/modules/gui/qt4/menus.cpp
+++ b/modules/gui/qt4/menus.cpp
@@ -34,6 +34,8 @@
 # include "config.h"
 #endif
 
+#include "qt4.hpp"
+
 #include <vlc_common.h>
 #include <vlc_intf_strings.h>
 #include <vlc_vout.h>                             /* vout_thread_t */
diff --git a/modules/gui/qt4/qt4.hpp b/modules/gui/qt4/qt4.hpp
index 44d7db6..5aec957 100644
--- a/modules/gui/qt4/qt4.hpp
+++ b/modules/gui/qt4/qt4.hpp
@@ -29,12 +29,7 @@
 # include "config.h"
 #endif
 
-#include <vlc_common.h>    /* VLC_COMMON_MEMBERS for vlc_interface.h */
-#include <vlc_interface.h> /* intf_thread_t */
-#include <vlc_playlist.h>  /* playlist_t */
-
-#define QT_NO_CAST_TO_ASCII
-#include <QString>
+#include <QtGlobal>
 
 #if ( QT_VERSION < 0x040600 )
 # error Update your Qt version to at least 4.6.0
@@ -43,6 +38,31 @@
 #define HAS_QT47 ( QT_VERSION >= 0x040700 )
 #define HAS_QT5  ( QT_VERSION >= 0x050000 )
 
+#if HAS_QT5
+  #include <QtCore/qcompilerdetection.h>
+  #if defined(Q_COMPILER_ATOMICS) && \
+             ( __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7 ) )
+   #define VLC_ATOMIC_H
+   #include <atomic>
+   using namespace std;
+   #  define atomic_store(object,desired) \
+      do { \
+          *(object) = (desired); \
+          __sync_synchronize(); \
+      } while (0)
+
+   #  define atomic_load(object) \
+       (__sync_synchronize(), *(object))
+  #endif
+#endif
+
+#include <vlc_common.h>    /* VLC_COMMON_MEMBERS for vlc_interface.h */
+#include <vlc_interface.h> /* intf_thread_t */
+#include <vlc_playlist.h>  /* playlist_t */
+
+#define QT_NO_CAST_TO_ASCII
+#include <QString>
+
 enum {
     DialogEventTypeOffset = 0,
     IMEventTypeOffset     = 100,
diff --git a/modules/gui/qt4/util/pictureflow.cpp b/modules/gui/qt4/util/pictureflow.cpp
index 9318953..a7e6a01 100644
--- a/modules/gui/qt4/util/pictureflow.cpp
+++ b/modules/gui/qt4/util/pictureflow.cpp
@@ -29,6 +29,8 @@
   THE SOFTWARE.
 */
 
+#include "qt4.hpp"
+
 #include "pictureflow.hpp"
 
 #include <QApplication>
diff --git a/modules/visualization/projectm.cpp b/modules/visualization/projectm.cpp
index e80fbf4..96d532d 100644
--- a/modules/visualization/projectm.cpp
+++ b/modules/visualization/projectm.cpp
@@ -30,6 +30,10 @@
 #endif
 
 #include <assert.h>
+#if defined(__GNUC__) && \
+           ( __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7 ) )
+  #define VLC_ATOMIC_H /* Ensure C atomics wont collide with old intrinsics */
+#endif
 
 #include <vlc_common.h>
 #include <vlc_plugin.h>
-- 
2.8.1

