cb8d1743ca
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>
71 lines
2.3 KiB
Diff
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
|
|
|