perl-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Steve Hay <steve....@uk.radan.com>
Subject Re: [PATCH] Re: What Perl configuration is required for mp2 on Win32?
Date Tue, 01 Feb 2005 09:09:19 GMT
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 :(

Firstly, it complains about "Illegal indirection".  Also, 
PERL_SYS_INIT() is not documented anyway -- perlembed only refers to 
PERL_SYS_INIT3() (although that's just a wrapper to PERL_SYS_INIT 
anyway), so I changed

    PERL_SYS_INIT(0, NULL)

to

    PERL_SYS_INIT3(&argc, &argv, NULL)

where I have declared

    int argc = 1;
    char **argv;

However, it then crashes as follows on server startup:

Perl_mfree(void * 0x018fcfa0) line 2092
Perl_sv_clear(interpreter * 0x04cf9bd8, sv * 0x00000000) line 5232
Perl_sv_free(interpreter * 0x04cf9bd8, sv * 0x018d1298) line 5377
Perl_av_clear(interpreter * 0x04cf9bd8, av * 0x018e7984) line 470 + 9 bytes
modperl_xs_dl_handles_get(interpreter * 0x04cf9bd8) line 300 + 13 bytes
modperl_interp_destroy(modperl_interp_t * 0x04cdf400) line 143 + 9 bytes
modperl_interp_pool_destroy(void * 0x0098abc0) line 201 + 12 bytes
run_cleanups(cleanup_t * * 0x00982508) line 1952
apr_pool_destroy(apr_pool_t * 0x00401585) line 733
main(int 4201858, const char * const * 0x00000009) line 576
APACHE! mainCRTStartup + 227 bytes
KERNEL32! 77e8141a()

Have I done the PERL_SYS_INIT3() call wrong, or is this just no good anyway?

- Steve

>Index: src/modules/perl/mod_perl.c
>===================================================================
>--- src/modules/perl/mod_perl.c	(revision 149209)
>+++ src/modules/perl/mod_perl.c	(working copy)
>@@ -544,8 +544,8 @@
>  {
>      MP_TRACE_i(MP_FUNC, "mod_perl sys init\n");
>
>-#if 0 /*XXX*/
>      PERL_SYS_INIT(0, NULL);
>+#if 0 /*XXX*/
>
>  #ifdef PTHREAD_ATFORK
>      if (!ap_exists_config_define("PERL_PTHREAD_ATFORK_DONE")) {
>@@ -581,9 +581,7 @@
>
>      modperl_perl_pp_unset_all();
>
>-#if 0 /*XXX*/
>      PERL_SYS_TERM();
>-#endif
>      return APR_SUCCESS;
>  }
>  
>



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


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@perl.apache.org
For additional commands, e-mail: dev-help@perl.apache.org


Mime
View raw message