summaryrefslogtreecommitdiff
path: root/test/thread-test.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/thread-test.c')
-rw-r--r--test/thread-test.c87
1 files changed, 73 insertions, 14 deletions
diff --git a/test/thread-test.c b/test/thread-test.c
index 1c2f040..12c51e3 100644
--- a/test/thread-test.c
+++ b/test/thread-test.c
@@ -1,23 +1,34 @@
#include "utils.h"
-#ifndef HAVE_PTHREADS
+#if !defined (HAVE_PTHREADS) && !defined (_WIN32)
int main ()
{
- printf ("Skipped thread-test - pthreads not supported\n");
+ printf ("Skipped thread-test - pthreads or Windows Threads not supported\n");
return 0;
}
#else
#include <stdlib.h>
-#include <pthread.h>
+
+#ifdef HAVE_PTHREADS
+# include <pthread.h>
+#elif defined (_WIN32)
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+#endif
+
+#define THREADS 16
typedef struct
{
int thread_no;
uint32_t *dst_buf;
prng_t prng_state;
+#if defined (_WIN32) && !defined (HAVE_PTHREADS)
+ uint32_t crc32;
+#endif
} info_t;
static const pixman_op_t operators[] =
@@ -67,8 +78,13 @@ static const pixman_format_code_t formats[] =
#define DEST_WIDTH (7)
+#ifdef HAVE_PTHREADS
static void *
thread (void *data)
+#elif defined (_WIN32)
+DWORD WINAPI
+thread (LPVOID data)
+#endif
{
info_t *info = data;
uint32_t crc32 = 0x0;
@@ -112,7 +128,12 @@ thread (void *data)
pixman_image_unref (dst_img);
}
+#ifdef HAVE_PTHREADS
return (void *)(uintptr_t)crc32;
+#elif defined (_WIN32)
+ info->crc32 = crc32;
+ return 0;
+#endif
}
static inline uint32_t
@@ -127,26 +148,34 @@ byteswap32 (uint32_t x)
int
main (void)
{
- uint32_t dest[16 * DEST_WIDTH];
- info_t info[16] = { { 0 } };
- pthread_t threads[16];
- void *retvals[16];
- uint32_t crc32s[16], crc32;
+ uint32_t dest[THREADS * DEST_WIDTH];
+ info_t info[THREADS] = { { 0 } };
+
+#ifdef HAVE_PTHREADS
+ pthread_t threads[THREADS];
+ void *retvals[THREADS];
+#elif defined (_WIN32)
+ HANDLE hThreadArray[THREADS];
+ DWORD dwThreadIdArray[THREADS];
+#endif
+
+ uint32_t crc32s[THREADS], crc32;
int i;
- for (i = 0; i < 16; ++i)
+ for (i = 0; i < THREADS; ++i)
{
info[i].thread_no = i;
info[i].dst_buf = &dest[i * DEST_WIDTH];
}
- for (i = 0; i < 16; ++i)
- pthread_create (&threads[i], NULL, thread, &info[i]);
+#ifdef HAVE_PTHREADS
+ for (i = 0; i < THREADS; ++i)
+ pthread_create (&threads[i], NULL, thread, &info[i]);
- for (i = 0; i < 16; ++i)
- pthread_join (threads[i], &retvals[i]);
+ for (i = 0; i < THREADS; ++i)
+ pthread_join (threads[i], &retvals[i]);
- for (i = 0; i < 16; ++i)
+ for (i = 0; i < THREADS; ++i)
{
crc32s[i] = (uintptr_t)retvals[i];
@@ -154,6 +183,36 @@ main (void)
crc32s[i] = byteswap32 (crc32s[i]);
}
+#elif defined (_WIN32)
+ for (i = 0; i < THREADS; ++i)
+ {
+ hThreadArray[i] = CreateThread(NULL,
+ 0,
+ thread,
+ &info[i],
+ 0,
+ &dwThreadIdArray[i]);
+ if (hThreadArray[i] == NULL)
+ {
+ printf ("Windows thread creation failed!\n");
+ return 1;
+ }
+ }
+ for (i = 0; i < THREADS; ++i)
+ {
+ WaitForSingleObject (hThreadArray[i], INFINITE);
+ CloseHandle(hThreadArray[i]);
+ }
+
+ for (i = 0; i < THREADS; ++i)
+ {
+ crc32s[i] = info[i].crc32;
+
+ if (is_little_endian())
+ crc32s[i] = byteswap32 (crc32s[i]);
+ }
+#endif
+
crc32 = compute_crc32 (0, crc32s, sizeof crc32s);
#define EXPECTED 0x82C4D9FB