#ifdef _CIVL
#include <civlc.cvh>
#endif
/*****************************************************************************
* FILE: bug3.c
* DESCRIPTION:
*   This "hello world" Pthreads program demonstrates an unsafe (incorrect) 
*   way to pass thread arguments at thread creation. Compare with hello_arg1.c.
* AUTHOR: Blaise Barney
* LAST REVISED: 01/29/09
******************************************************************************/
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

#ifdef _CIVL
#include <unistd.h>
#endif

#define NUM_THREADS	2

#ifdef _CIVL
pthread_t pool[NUM_THREADS];
int getTid(pthread_t pth){
    for(int i = 0; i < NUM_THREADS; i++){
      if(pthread_equal(pool[i], pth))
          return i;
    }
    return -1;
}
#endif

void *PrintHello(void *threadid)
{
   long taskid = *((long*)threadid);
   sleep(1);
   printf("Hello from thread %ld\n", taskid);
#ifdef _CIVL
    $assert(taskid == getTid(pthread_self()));
#endif
    pthread_exit(NULL);
}

int main(int argc, char *argv[])
{
pthread_t threads[NUM_THREADS];
int rc; 
long t;

for(t=0;t<NUM_THREADS;t++) {
  printf("Creating thread %ld\n", t);
  rc = pthread_create(&threads[t], NULL, PrintHello, (void *) &t);
#ifdef _CIVL
    pool[t]=threads[t];
#endif
  if (rc) {
    printf("ERROR; return code from pthread_create() is %d\n", rc);
    exit(-1);
    }
   }

pthread_exit(NULL);
}

