perl-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Philippe M. Chiasson" <go...@ectoplasm.org>
Subject Re: [PATCH] Re: What Perl configuration is required for mp2 on Win32?
Date Mon, 31 Jan 2005 22:22:52 GMT
Steve Hay wrote:
> Stas Bekman wrote:
> 
>>Steve Hay wrote:
>>
>>>Stas Bekman 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.
>>>>
>>>>I'd ask Jan or some other ActiveState folks directly or via p5p (not sure

>>>>if there is a special activestate perl list).
>>>
>>>I believe Jan (and others at ActiveState?) read this list anyway, but 
>>>why would they know what is required for mp2?
>>
>>I was talking about the segfaults that you were getting. Those have 
>>nothing to do with mp2, I believe. Other than being a trigger.
>>
> 
> Thanks for kicking my butt on this.
> 
> 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 ?

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;
  }

--------------------------------------------------------------------------------
Philippe M. Chiasson m/gozer\@(apache|cpan|ectoplasm)\.org/ GPG KeyID : 88C3A5A5
http://gozer.ectoplasm.org/     F9BF E0C2 480E 7680 1AE5 3631 CB32 A107 88C3A5A5

Mime
View raw message