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

Attachment: signature.asc
Description: OpenPGP digital signature



Reply via email to