#include <stdlib.h>
#include <unistd.h>
#include <libgen.h>
#include <pthread.h>
#include <tcl.h>

static char *pName;
static char *script_name = "test.tcl";
static char *proc_name = "test";

static void *thFunction( void *p ) 
{
  Tcl_Interp *interp = Tcl_CreateInterp();
  Tcl_Obj *pScript = NULL;
  if ( interp ) {
    Tcl_Init( interp );
    Tcl_Preserve( interp );
    
    if ( Tcl_EvalFile( interp, script_name ) != TCL_OK ) {
      fprintf( stderr, "Error evaluating %s(%d): %s\n",
               script_name, interp->errorLine,
               Tcl_GetStringResult( interp ) );
    } else {
      Tcl_Obj *pScript = Tcl_NewStringObj( proc_name,
                                           strlen( proc_name ) );
      Tcl_IncrRefCount( pScript );
      if ( Tcl_EvalObjEx( interp, pScript, 0 ) != TCL_OK ) {
        fprintf( stderr, "Error calling %s(%d): %s\n",
                 proc_name, interp->errorLine,
                 Tcl_GetStringResult( interp ) );
      }
      Tcl_DecrRefCount( pScript );
    }
    /*Destroy the interpreter*/
    if ( !Tcl_InterpDeleted( interp ) ) {
      Tcl_DeleteInterp( interp );
      Tcl_Release( (ClientData) interp ); 
    } else {
      fprintf( stderr, "Interp already deleted!!!\n" );
    }
    Tcl_FinalizeThread();
  }
  return( NULL );
}
    
     
int main( int argc, char** argv )
{
  int i;
  int j;
  pthread_t *aThreads;
  int nThreads;
  int nIters;
  pName = basename( argv[0] );

  if( argc < 3 ) {
    fprintf( stderr, "Usage: %s nThreads nIters\n", pName );
    return (-1);
  }
  nThreads = atoi( argv[1] );
  nIters = atoi( argv[2] );

  aThreads = ( pthread_t * ) malloc( nThreads * sizeof( pthread_t ) );

  for( j=0; j< nIters; j++ ) {
    for( i=0; i< nThreads; i++ ) {
      pthread_create( &aThreads[i], 0, thFunction, 0 );
    }
    /* Wait for the threads to end */
    for( i = 0; i < nThreads; i++ ) {
      pthread_join( aThreads[i], 0 );
    }
  }
  free( aThreads );
  return( 0 );
}
