#include #include #include #include #include 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 ); }