<[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.

Reply via email to