buildroot/package/libselinux/0004-Fix-build-break-around-__atomic_-with-GCC-4.7.patch
Thomas Petazzoni cb8d1743ca libselinux: use correct name and content for patch 0004
Commit 6288409642 ("libselinux: add
patch to fix build with gcc < 4.7") introduced a patch, but its file
name was incorrect, so it was never applied. In addition, the patch
was generated against the Git repository of SELinux, which includes
all projects, and therefore it doesn't apply to the libselinux source
code extracted from the tarball: the "libselinux/" component path
needs to be removed from the patch.

This commit fixes both problems, which should finally and really fix:

  http://autobuild.buildroot.net/results/c3272566bb808e43bb77ec59cfe596f7e0fe9a64/

Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
2018-08-18 21:33:47 +02:00

71 lines
2.3 KiB
Diff

From abe76789f8e7ce61b357f693eaed5b28feab5ce2 Mon Sep 17 00:00:00 2001
From: Hollis Blanchard <hollis_blanchard@mentor.com>
Date: Mon, 13 Aug 2018 12:11:33 -0700
Subject: [PATCH] Fix build break around __atomic_*() with GCC<4.7
The __atomic_* GCC primitives were introduced in GCC 4.7, but Red Hat
Enterprise Linux 6.x (for example) provides GCC 4.4. Tweak the current code to
use the (most conservative) __sync_synchronize() primitive provided by those
older GCC versions.
(Really, no __atomic or __sync operations are needed here at all, since POSIX
4.12 "Memory Synchronization" says pthread_mutex_lock() and
pthread_mutex_unlock() "synchronize memory with respect to other threads"...)
Signed-off-by: Hollis Blanchard <hollis_blanchard@mentor.com>
---
src/label_file.h | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/src/label_file.h b/src/label_file.h
index 2fa85474..47859baf 100644
--- a/src/label_file.h
+++ b/src/label_file.h
@@ -351,8 +351,14 @@ static inline int compile_regex(struct saved_data *data, struct spec *spec,
* init_routine does not take a parameter, it's not possible
* to use, so we generate the same effect with atomics and a
* mutex */
+#ifdef __ATOMIC_RELAXED
regex_compiled =
__atomic_load_n(&spec->regex_compiled, __ATOMIC_ACQUIRE);
+#else
+ /* GCC <4.7 */
+ __sync_synchronize();
+ regex_compiled = spec->regex_compiled;
+#endif
if (regex_compiled) {
return 0; /* already done */
}
@@ -360,8 +366,14 @@ static inline int compile_regex(struct saved_data *data, struct spec *spec,
__pthread_mutex_lock(&spec->regex_lock);
/* Check if another thread compiled the regex while we waited
* on the mutex */
+#ifdef __ATOMIC_RELAXED
regex_compiled =
__atomic_load_n(&spec->regex_compiled, __ATOMIC_ACQUIRE);
+#else
+ /* GCC <4.7 */
+ __sync_synchronize();
+ regex_compiled = spec->regex_compiled;
+#endif
if (regex_compiled) {
__pthread_mutex_unlock(&spec->regex_lock);
return 0;
@@ -404,7 +416,13 @@ static inline int compile_regex(struct saved_data *data, struct spec *spec,
}
/* Done. */
+#ifdef __ATOMIC_RELAXED
__atomic_store_n(&spec->regex_compiled, true, __ATOMIC_RELEASE);
+#else
+ /* GCC <4.7 */
+ spec->regex_compiled = true;
+ __sync_synchronize();
+#endif
__pthread_mutex_unlock(&spec->regex_lock);
return 0;
}
--
2.13.0