Steve Hay wrote:

>Steve Hay wrote:
>
>  
>
>>Philippe M. Chiasson wrote:
>>
>> 
>>
>>    
>>
>>>Steve Hay wrote:
>>>
>>>
>>>   
>>>
>>>      
>>>
>>>>>>>Steve Hay wrote:
>>>>>>>
>>>>>>>        
>>>>>>>
>>>>>>>           
>>>>>>>
>>>>>>>              
>>>>>>>
>>>>>>>>Therefore, I want to configure my Perl with MULTIPLICITY and 
>>>>>>>>USE_ITHREADS, but not PERL_IMPLICIT_SYS.  That way, I can enable 
>>>>>>>>PERL_MALLOC.
>>>>>>>>
>>>>>>>>I've tried doing exactly this, but it doesn't seem to work.  Perl 
>>>>>>>>(5.8.6) itself built and tested without error, and mp2 (RC4) also built 
>>>>>>>>without error.  However, the mp2 test suite won't even get off the 
>>>>>>>>ground.
>>>>>>>>          
>>>>>>>>
>>>>>>>>             
>>>>>>>>
>>>>>>>>                
>>>>>>>>
>>>>Your comment made me start looking at how to reproduce the segfault 
>>>>without mp2 being involved (otherwise it'd be hard to get p5p 
>>>>interested), which turned out to be very simple:  The following tiny 
>>>>program, taken from an example in the perlembed manpage is all that it took:
>>>>
>>>>#include "EXTERN.h"
>>>>#include "perl.h"
>>>>static PerlInterpreter *my_perl;
>>>>int main(int argc, char **argv, char **env) {
>>>>  PERL_SYS_INIT3(&argc, &argv, &env);
>>>>  my_perl = perl_alloc();
>>>>  perl_construct(my_perl);
>>>>  perl_destruct(my_perl);
>>>>  perl_free(my_perl);
>>>>  PERL_SYS_TERM();
>>>>}
>>>>
>>>>The above program works fine (using my ithreads-but-no-impsys perl), but 
>>>>segfaults in the same way as apache/mp2 if I omit the PERL_SYS_INIT3() 
>>>>(and PERL_SYS_TERM) call(s):
>>>>
>>>>Perl_malloc(unsigned int 1020) line 1458
>>>>S_more_sv(interpreter * 0x00853fe0) line 315 + 10 bytes
>>>>Perl_newSV(interpreter * 0x00853fe0, unsigned int 79) line 4561 + 76 bytes
>>>>perl_construct(interpreter * 0x00853fe0) line 267 + 11 bytes
>>>>main(int 1, char * * 0x00852bf0, char * * 0x00852fd0) line 7 + 11 bytes
>>>>EMBED! mainCRTStartup + 227 bytes
>>>>KERNEL32! 77e8141a()
>>>>
>>>>Now, looking at the mp2 source, I see that modperl_startup() (the 
>>>>function which calls perl_construct()) does not have a PERL_SYS_INIT3() 
>>>>call in it.  Adding one as per the attached patch (against svn rev 
>>>>149266) fixes my problem.  The entire test suite now passes all tests OK 
>>>>in this configuration.  (I had to SKIP t/perl/ithreads*.t again, though 
>>>>-- it crashed the server again the first time I tried with them still in 
>>>>place :-s  Not sure if this patch re-introduces that failure, or if it 
>>>>never really went away.  Maybe I've just been lucky with it working 
>>>>recently?)
>>>>
>>>>However, we presumably now need to add a corresponding PERL_SYS_TERM() 
>>>>somewhere?
>>>>  
>>>>
>>>>     
>>>>
>>>>        
>>>>
>>>PERL_SYS_(TERM|INIT) needs to be called only once in the parent process.
>>>Can you give this patch a spin ?
>>>
>>>
>>>   
>>>
>>>      
>>>
>>Didn't work, I'm afraid :(
>> 
>>
>>    
>>
>No replies to this one, then :(
>
>Are people still pondering it, or does nobody know how to resolve this?
>
After further investigation, I've realised that actually Philippe's 
patch DOES fix the problem.

The reason that I didn't see it before was that in my original 
PERL_SYS_INIT() patch I was looking around for a place to put a 
corresponding PERL_SYS_TERM(), and had tried placing one in 
modperl_perl_destruct().  I'd forgotten that I'd done that, and it was 
causing Philippe's patch to not work because modperl_perl_destruct() is 
called more than once and was destroying the (global) perl malloc mutex 
which PERL_SYS_INIT had created!  (Hence the crash on a subsequent call 
to MALLOC_LOCK.)

So could somebody please apply the attached patch.  (This version 
updates PERL_SYS_INIT() to PERL_SYS_INIT3() as per perlembed, and fixes 
an "Illegal indirection" error which simply calling PERL_SYS_INIT3(0, 
NULL, NULL) produces.)

The use of PERL_SYS_INIT() is essential to running mp2 with Perl's 
malloc(), at least on Win32.  (PERL_SYS_INIT() calls Perl_win32_init(), 
which calls MALLOC_INIT, without which the MALLOC_LOCK/MALLO_UNLOCK's 
done by Perl's malloc() don't work.)

- Steve


------------------------------------------------
Radan Computational Ltd.

The information contained in this message and any files transmitted with it are 
confidential and intended for the addressee(s) only.  If you have received this 
message in error or there are any problems, please notify the sender 
immediately.  The unauthorized use, disclosure, copying or alteration of this 
message is strictly forbidden.  Note that any views or opinions presented in 
this email are solely those of the author and do not necessarily represent 
those of Radan Computational Ltd.  The recipient(s) of this message should 
check it and any attached files for viruses: Radan Computational will accept no 
liability for any damage caused by any virus transmitted by this email.
Index: src/modules/perl/mod_perl.c
===================================================================
--- src/modules/perl/mod_perl.c (revision 149511)
+++ src/modules/perl/mod_perl.c (working copy)
@@ -542,11 +542,14 @@
  */
 static apr_status_t modperl_sys_init(void)
 {
+    int argc = 0;
+    char **argv = NULL, env = NULL;
+
     MP_TRACE_i(MP_FUNC, "mod_perl sys init\n");
 
+    PERL_SYS_INIT3(&argc, &argv, &env);
+
 #if 0 /*XXX*/
-    PERL_SYS_INIT(0, NULL);
-
 #ifdef PTHREAD_ATFORK
     if (!ap_exists_config_define("PERL_PTHREAD_ATFORK_DONE")) {
         PTHREAD_ATFORK(Perl_atfork_lock,
@@ -581,9 +584,8 @@
 
     modperl_perl_pp_unset_all();
 
-#if 0 /*XXX*/
     PERL_SYS_TERM();
-#endif
+
     return APR_SUCCESS;
 }
 

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to