// RUN: %libomp-compile-and-run
/*
 * Threadprivate is tested in 2 ways:
 * 1. The global variable declared as threadprivate should have
 *  local copy for each thread. Otherwise race condition and 
 *  wrong result.
 * 2. If the value of local copy is retained for the two adjacent
 *  parallel regions
 */
#include "omp_testsuite.h"
#include <stdlib.h>
#include <stdio.h>

static int sum0=0;
static int myvalue = 0;

#pragma omp threadprivate(sum0)
#pragma omp threadprivate(myvalue)

int test_omp_threadprivate()
{
  int sum = 0;
  int known_sum;
  int i; 
  int iter;
  int *data;
  int size;
  int num_failed = 0;
  int my_random;
  omp_set_dynamic(0);

  #pragma omp parallel private(i) 
  {
    sum0 = 0;
    #pragma omp for 
    for (i = 1; i <= LOOPCOUNT; i++) {
      sum0 = sum0 + i;
    } /*end of for*/
    #pragma omp critical
    {
      sum = sum + sum0;
    } /*end of critical */
  } /* end of parallel */  
  known_sum = (LOOPCOUNT * (LOOPCOUNT + 1)) / 2;
  if (known_sum != sum ) {
    fprintf (stderr, " known_sum = %d, sum = %d\n", known_sum, sum);
  }

  /* the next parallel region is just used to get the number of threads*/
  omp_set_dynamic(0);
  #pragma omp parallel
  {
    #pragma omp master
    {
      size=omp_get_num_threads();
      data=(int*) malloc(size*sizeof(int));
    }
  }/* end parallel*/

  srand(45);
  for (iter = 0; iter < 100; iter++) {
    my_random = rand(); /* random number generator is 
                 called inside serial region*/

    /* the first parallel region is used to initialiye myvalue
       and the array with my_random+rank */
    #pragma omp parallel
    {
      int rank;
      rank = omp_get_thread_num ();
      myvalue = data[rank] = my_random + rank;
    }

    /* the second parallel region verifies that the 
       value of "myvalue" is retained */
    #pragma omp parallel reduction(+:num_failed)
    {
      int rank;
      rank = omp_get_thread_num ();
      num_failed = num_failed + (myvalue != data[rank]);
      if(myvalue != data[rank]) {
        fprintf (stderr, " myvalue = %d, data[rank]= %d\n",
          myvalue, data[rank]);
      }
    }
  }
  free (data);
  return (known_sum == sum) && !num_failed;
} /* end of check_threadprivate*/

int main()
{
  int i;
  int num_failed=0;

  for(i = 0; i < REPETITIONS; i++) {
    if(!test_omp_threadprivate()) {
      num_failed++;
    }
  }
  return num_failed;
}
