<[EMAIL PROTECTED]> writes: >Hello, > >I would very much appreciate your answers on the following issue. >I have a multi threaded application. Each thread is running a function >that creates a perl interpreter and uses it to parse and then run a >perl function from an arbitrary file. >After running this application for a while the application is stuck and > >I can see that 10 threads are in the perl_parse function. An inner >looks show that all threads are in the SWIG_Init function created by >SWIG.
Hmm, can we see the code for SWIG_Init() - is _IT_ threadsafe e.g. is SWIG using global variables so that SWIG_Init() only does something once - if so there may be a race when you have multiple threads. >I think it has something to do with the function >Swig_TypeClientData but i'm not sure. >I'm running on WInXP with perl 5.8.3.809, and I'm using SWIG 1.3.27 to >wrap my c++ classes and pass them to the perl functions. >Are any of you are familiar with such a problem? Do you have an idea >why this can happen? > >I've attached my function code and marked the line where the threads >are "stuck": I can't see anything obviously wrong in code below. Any chance you can post the fragment after CPP processing? One theory I have is that #defines you are using to compile this code don't match how your perl was compiled. So seeing how PERL_SET_CONTEXT(my_perl) expands would allow me to guess how USE_DECLSPEC_THREAD is being seen. Or build with perl with debug so you can see where in perl_parse() threads are "stuck". > > >__declspec(dllexport) >long CFTPerlUserExitInstanceRun(char *FileName,char *FuncName,struct >PerlParmInfo *ParmsVec,unsigned int ParmsVecSize,char* pReason,int >*pCount,int *pUserExitRc) >{ > long lRc = 0; > int count = -1; > PerlInterpreter* my_perl = NULL; > > > char *embedding[] = { "", FileName}; It is traditional to have a tailing NULL in an argv[] list but I don't think perl cares. > > > while (true) > { > my_perl = perl_alloc(); > if (my_perl == NULL) > { > lRc = -1; > break; > } > > > EnterCriticalSection(&g_ParserCS); > PERL_SET_CONTEXT(my_perl); > PL_perl_destruct_level = 1; > perl_construct(my_perl); > LeaveCriticalSection(&g_ParserCS); > > > // ***************************************************** > // THREADS ARE STUCK IN PERL_PARSE > // ***************************************************** > lRc = perl_parse(my_perl, xs_init, 2, embedding , NULL); > > > if (lRc != 0) > { > lRc = -2; > break; > } > > > dSP; > ENTER; > SAVETMPS; > > > PUSHMARK(SP); > > > // push parms to stack > char ParmType[MAX_PARM_TYPE_LEN]; > > > for(unsigned int i=0; i<ParmsVecSize; i++) > { > strncpy(ParmType, PERL_WRAP_PACKAGE_NAME, >MAX_PARM_TYPE_LEN-1); > strncat(ParmType, "::", MAX_PARM_TYPE_LEN-3); > strncat(ParmType, ParmsVec[i].parmtype, MAX_PARM_TYPE_LEN- > strlen(PERL_WRAP_PACKAGE_NAME)-3); > > > SV *pSVParm = sv_newmortal(); > sv_setref_pv( pSVParm, ParmType, ParmsVec[i].parm ); > XPUSHs(pSVParm); > } > > > PUTBACK; > try > { > count = call_pv(FuncName, G_EVAL|G_SCALAR); > } > catch(...) > { > lRc = -3; > } > > > SPAGAIN; > > > // Check the eval first > if (SvTRUE(ERRSV)) > { > STRLEN n_a; > strncpy(pReason, SvPV(ERRSV, n_a), MAX_PERL_REASON_LENGTH-1); >//@G1028 > lRc = -4; > POPs ; > } > else > { > if (count != 1) > { > *pCount = count; > lRc = -5; > } > else > { > *pUserExitRc = POPi; > > > } > } > > > PUTBACK ; > FREETMPS ; > LEAVE ; > > > break; > } > > > if (my_perl != NULL) > { > EnterCriticalSection(&g_ParserCS); > PL_perl_destruct_level = 1; > perl_destruct(my_perl); > LeaveCriticalSection(&g_ParserCS); > perl_free(my_perl); > } > > > return lRc; > > > >} > > >Thank you very much. >Lily.