On Sat, 28 Sep 2013 11:38:58 -0400
Søren Sandmann <sandm...@cs.au.dk> wrote:

> From: Søren Sandmann Pedersen <s...@redhat.com>
> 
> This test program allocates an array of 16 uint32_ts and spawns 16
> threads that each use one of the allocated uint32_ts as destination

The 1x1 size for the destination image does not catch any problems
in the vmx code because the simd optimized parts are used only when
the width is at least 4 pixels.

> for a large number of composite operations. Each thread then checks
> whether the results have the right crc32 checksum.
> 
> The purpose of this test is catch errors where memory outside images
> is read and then written back. Such out-of-bounds accesses are broken
> when multiple threads are involved.

Some changes are also needed to work in the same way on big endian
and little endian systems. I tweaked it in the following way to make
it run:

diff --git a/test/thread-test.c b/test/thread-test.c
index 917f417..8fc7d32 100644
--- a/test/thread-test.c
+++ b/test/thread-test.c
@@ -93,6 +93,15 @@ static const pixman_format_code_t formats[] =
 #define RAND_ELT(arr)                                                  \
     arr[prng_rand() % ARRAY_LENGTH (arr)]
 
+static inline uint32_t
+byteswap32 (uint32_t x)
+{
+    return ((x & ((uint32_t)0xFF << 24)) >> 24) |
+           ((x & ((uint32_t)0xFF << 16)) >>  8) |
+           ((x & ((uint32_t)0xFF <<  8)) <<  8) |
+           ((x & ((uint32_t)0xFF <<  0)) << 24);
+}
+
 static void *
 thread (void *data)
 {
@@ -106,7 +115,13 @@ thread (void *data)
 
     for (i = 0; i < N_ROUNDS; ++i)
     {
+       pixman_op_t op;
+       int rand1, rand2;
+#ifdef WORDS_BIGENDIAN
+       *info->dest = byteswap32 (prng_rand());
+#else
        *info->dest = prng_rand();
+#endif
 
        prng_randmemset (src_buf, sizeof (src_buf), 0);
 
@@ -115,10 +130,17 @@ thread (void *data)
        dst_img = pixman_image_create_bits (
            RAND_ELT (formats), 1, 1, info->dest, 4);
 
+       image_endian_swap (src_img);
+       image_endian_swap (dst_img);
+       
+       rand2 = prng_rand() % 4;
+       rand1 = prng_rand() % 4;
+       op = RAND_ELT (operators);
+
        pixman_image_composite32 (
-           RAND_ELT (operators),
+           op,
            src_img, NULL, dst_img,
-           prng_rand() % 4, prng_rand() % 4, 0, 0, 0, 0, 1, 1);
+           rand1, rand2, 0, 0, 0, 0, 1, 1);
 
        crc32 = compute_crc32_for_image (crc32, dst_img);
 


-- 
Best regards,
Siarhei Siamashka
_______________________________________________
Pixman mailing list
Pixman@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/pixman

Reply via email to