// RUN: %libomp-compile-and-run
/*
 * Test for dynamic scheduling with chunk size
 * Method: caculate how many times the iteration space is dispatched
 *     and judge if each dispatch has the requested chunk size
 *     unless it is the last one.
 * It is possible for two adjacent chunks are assigned to the same thread
 * Modified by Chunhua Liao
 */
#include <stdio.h>
#include <omp.h>
#include <unistd.h>
#include <stdlib.h>
#include "omp_testsuite.h"

#define CFDMAX_SIZE 100
const int chunk_size = 7;

int test_omp_for_schedule_dynamic()
{
  int tid;
  int *tids;
  int i;
  int tidsArray[CFDMAX_SIZE];
  int count = 0;
  int tmp_count = 0; /*dispatch times*/
  int *tmp;  /*store chunk size for each dispatch*/
  int result = 0;
  
  tids = tidsArray;

  #pragma omp parallel private(tid) shared(tids)
  {        /* begin of parallel */
    int tid;
    tid = omp_get_thread_num ();
    #pragma omp for schedule(dynamic,chunk_size)
    for (i = 0; i < CFDMAX_SIZE; i++) {
      tids[i] = tid;
    }
  }

  for (i = 0; i < CFDMAX_SIZE - 1; ++i) {
    if (tids[i] != tids[i + 1]) {
      count++;
    }
  }

  tmp = (int *) malloc (sizeof (int) * (count + 1));
  tmp[0] = 1;

  for (i = 0; i < CFDMAX_SIZE - 1; ++i) {
    if (tmp_count > count) {
      printf ("--------------------\nTestinternal Error: List too small!!!\n--------------------\n");  /* Error handling */
      break;
    }
    if (tids[i] != tids[i + 1]) {
      tmp_count++;
      tmp[tmp_count] = 1;
    } else {
      tmp[tmp_count]++;
    }
  }
  /* is dynamic statement working? */
  for (i = 0; i < count; i++) {
    if ((tmp[i]%chunk_size)!=0) {
      /* it is possible for 2 adjacent chunks assigned to a same thread */
      result++;
      fprintf(stderr,"The intermediate dispatch has wrong chunksize.\n");
      /* result += ((tmp[i] / chunk_size) - 1); */
    }
  }
  if ((tmp[count]%chunk_size)!=(CFDMAX_SIZE%chunk_size)) { 
    result++;
    fprintf(stderr,"the last dispatch has wrong chunksize.\n");
  }
  /* for (int i=0;i<count+1;++i) printf("%d\t:=\t%d\n",i+1,tmp[i]); */
  return (result==0);
}
int main()
{
  int i;
  int num_failed=0;

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