/* Global headerfile of the OpenMP Testsuite */

#ifndef OMP_TESTSUITE_H
#define OMP_TESTSUITE_H

#include <stdio.h>
#include <stdlib.h>
#include <omp.h>

/* General                                                */
/**********************************************************/
#define LOOPCOUNT 1000 /* Number of iterations to slit amongst threads */
#define REPETITIONS 10 /* Number of times to run each test */

/* following times are in seconds */
#define SLEEPTIME 1

/* Definitions for tasks                                  */
/**********************************************************/
#define NUM_TASKS 25
#define MAX_TASKS_PER_THREAD 5

#ifdef  _WIN32
// Windows versions of pthread_create() and pthread_join()
# include <windows.h>
typedef HANDLE pthread_t;

// encapsulates the information about a pthread-callable function
struct thread_func_info_t {
  void* (*start_routine)(void*);
  void* arg;
};

// call the void* start_routine(void*);
static DWORD __thread_func_wrapper(LPVOID lpParameter) {
  struct thread_func_info_t* function_information;
  function_information = (struct thread_func_info_t*)lpParameter;
  function_information->start_routine(function_information->arg);
  free(function_information);
  return 0;
}

// attr is ignored
static int pthread_create(pthread_t *thread, void *attr,
                          void *(*start_routine) (void *), void *arg) {
  pthread_t pthread;
  struct thread_func_info_t* info;
  info = (struct thread_func_info_t*)malloc(sizeof(struct thread_func_info_t));
  info->start_routine = start_routine;
  info->arg = arg;
  pthread = CreateThread(NULL, 0, __thread_func_wrapper, info, 0, NULL);
  if (pthread == NULL) {
    fprintf(stderr, "CreateThread() failed: Error #%u.\n", GetLastError());
    exit(1);
  }
  *thread = pthread;
  return 0;
}
// retval is ignored for now
static int pthread_join(pthread_t thread, void **retval) {
  int rc;
  rc = WaitForSingleObject(thread, INFINITE);
  if (rc == WAIT_FAILED) {
    fprintf(stderr, "WaitForSingleObject() failed: Error #%u.\n",
            GetLastError());
    exit(1);
  }
  rc = CloseHandle(thread);
  if (rc == 0) {
    fprintf(stderr, "CloseHandle() failed: Error #%u.\n", GetLastError());
    exit(1);
  }
  return 0;
}
#else
# include <pthread.h>
#endif

#endif
