Hi,

On 18/08/17 21:32, Jeremy Bicha wrote:
> Source: drumgizmo
> Version: 0.9.14-2
> Severity: serious
> 
> drumgizmo fails to build from source on several release architectures
> that it used to build on because of test failures.
> 
> https://buildd.debian.org/status/package.php?p=drumgizmo

The attached patch does not fix all the test failures, but does fix the
3 affecting mips, and this should be enough to fix armel and mipsel as
well. Things are still broken on mips64el and s390x after this.

src/atomic.h:
This fixes enginetest by removing the assertion. My guess is that the
writer of the code meant to say "does this atomic use the std::atomic
implementation" (as opposed to the other implementation in src/atomic.h)
but instead said "is this atomic lock free" assuming that all
std::atomics are always lock free...

test/atomictest.cc:
Fixes atomictest by removing the test for lock free atomics. One some
architectures isLockFree may legitimately return false (eg it is
impossible to make atomic<long int> lock free on 32-bit mips). The test
was probably added with the same assumption as above.

plugingui/image.cc:
Fixes imagecachetest. The original code was not big-endian safe. Replace
the memcpy with shifts and ORs.

Thanks,
James
--- a/src/atomic.h
+++ b/src/atomic.h
@@ -151,8 +151,6 @@ public:
 	SettingRef(Atomic<T>& value)
 		: value(value)
 	{
-		// string isn't lock free either
-		assert((std::is_same<T, std::string>::value || value.is_lock_free()));
 	}
 
 	bool hasChanged()
--- a/test/atomictest.cc
+++ b/test/atomictest.cc
@@ -40,7 +40,6 @@ class AtomicTest
 	CPPUNIT_TEST(nonPodAtomicCanBeValueInitialized);
 	CPPUNIT_TEST(podAtomicCanBeValueAssigned);
 	CPPUNIT_TEST(nonPodAtomicCanBeValueAssigned);
-	CPPUNIT_TEST(podAtomicsAreLockFree);
 	CPPUNIT_TEST_SUITE_END();
 	
 	public:
@@ -99,23 +98,6 @@ class AtomicTest
 			CPPUNIT_ASSERT_EQUAL(s.load(), std::string{"hello world"});
 		}
 		
-		void podAtomicsAreLockFree() {
-			CPPUNIT_ASSERT(isLockFree<bool>());
-			CPPUNIT_ASSERT(isLockFree<unsigned short int>());
-			CPPUNIT_ASSERT(isLockFree<short int>());
-			CPPUNIT_ASSERT(isLockFree<unsigned int>());
-			CPPUNIT_ASSERT(isLockFree<int>());
-			CPPUNIT_ASSERT(isLockFree<unsigned long int>());
-			CPPUNIT_ASSERT(isLockFree<long int>());
-			CPPUNIT_ASSERT(isLockFree<unsigned long long int>());
-			CPPUNIT_ASSERT(isLockFree<long long int>());
-			CPPUNIT_ASSERT(isLockFree<float>());
-			CPPUNIT_ASSERT(isLockFree<double>());
-			
-			// compile error: undefined reference to `__atomic_is_lock_free'
-			//CPPUNIT_ASSERT(isLockFree<long double>());
-		}
-		
 		// todo: further testing
 		
 	private:
@@ -123,12 +105,6 @@ class AtomicTest
 		bool isUsingStandardImpl() {
 			return std::is_base_of<std::atomic<T>, Atomic<T>>::value;
 		}
-		
-		template <typename T>
-		bool isLockFree() {
-			Atomic<T> a;
-			return a.is_lock_free();
-		}
 };
 
 // Registers the fixture into the 'registry'
--- a/plugingui/image.cc
+++ b/plugingui/image.cc
@@ -86,10 +86,16 @@ void Image::setError()
 
 	std::uint32_t iw, ih;
 
-	std::memcpy(&iw, ptr, sizeof(uint32_t));
+	iw = (uint32_t) ptr[0] |
+	     (uint32_t) ptr[1] << 8 |
+	     (uint32_t) ptr[2] << 16 |
+	     (uint32_t) ptr[3] << 24;
 	ptr += sizeof(uint32_t);
 
-	std::memcpy(&ih, ptr, sizeof(uint32_t));
+	ih = (uint32_t) ptr[0] |
+	     (uint32_t) ptr[1] << 8 |
+	     (uint32_t) ptr[2] << 16 |
+	     (uint32_t) ptr[3] << 24;
 	ptr += sizeof(uint32_t);
 
 	_width = iw;

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to