#include #include #include #include #ifdef DEBUG #include #endif #include "cpuid.h" typedef struct { uint32_t id; /* filled in by launch_threads. */ } state_t; static pthread_t* threads = 0; static state_t* thread_state = 0; static const unsigned int num_threads = 4; static void* threads_worker (state_t *tstate); void launch_threads (uint32_t nthreads, void* (*worker)(state_t*), state_t* tstate_proto) { int i; thread_state = malloc (sizeof (state_t) *nthreads); threads = malloc (sizeof (pthread_t) *nthreads); memset (threads, 0, sizeof (pthread_t) *nthreads); for(i = 0; i < nthreads; i++) { memcpy (thread_state + i, tstate_proto, sizeof (state_t)); thread_state[i].id = i; pthread_create (threads+i, NULL, (void* (*)(void*))worker, (void*) (thread_state+i)); } } void wait() { int i; for(i = 0; i < num_threads; i++) pthread_join (threads[i], 0); free (threads); threads = 0; free (thread_state); thread_state = 0; } #ifndef DO_TEST #define DO_TEST do_test static void rao_test (void); __attribute__ ((noinline)) static void do_test (void) { state_t tstate_proto; launch_threads(num_threads, threads_worker, &tstate_proto); wait(); rao_test (); } #endif int main() { if (__builtin_cpu_supports ("raoint")) { DO_TEST (); #ifdef DEBUG printf ("PASSED\n"); #endif } #ifdef DEBUG else printf ("SKIPPED\n"); #endif return 0; }