// RUN: %libomp-compile-and-run
/*
 * Test for dynamic scheduling with chunk size
 * Method: calculate 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 <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;
}
