I solved the prob I had some time ago (see below) by adding "PerlModule
BerkeleyDB" to the httpd.conf:

  ...
  # Load Apache::Registry
  PerlModule Apache::Registry

  # Load Berkeley DB
  PerlModule BerkeleyDB
  ...

It runs fine now.

But I'm not exactly sure what went wrong in the old situation. The
environment var $Env is a global var that should be persistent across
calls (and it is), but apparently something within BerkeleyDB is not.
Anyone?

Rick

Rick said on 15/4/05 11:09:
> I'm converting an existing CGI-script that uses Berkely DB with CDB to a
> mod_perl version, and I'm running into a problem. The first run works
> fine, but the second hit causes a "child pid ... exit signal
> Segmentation fault (11)" in the following line, UNLESS I close the
> environment after each run, and re-open it for the next run. Alas, this
> causes overhead that I'd rather get rid of:
> 
>   sub Something {
> 
>     # crashes:
>     my $DB_Object = new BerkeleyDB::Hash
>                       -Filename => $DB,
>                     -Env  => $Env,
>                       -Flags => DB_RDONLY ...
>   }
> 
> To avoid name collisions the application is split in a main program
> calling a run-routine from a separate module, as follows:
> 
>   use strict;
>   use Appl::ApplMain;
> 
>   Appl::ApplMain::run();
> 
> 
> This is the separate module Appl/ApplMain.pm:
> 
>   package Appl::ApplMain;
> 
>   my $Env = new BerkeleyDB::Env ....
> 
>   sub run {
>     <open env if not open>
>     <processing>
>     <*close env*>
>   }
> 
>   1;
> 
> If I leave out the <close env> the child gets killed on the second run,
> if I close the environment it runs fine.
> 
> Interestingly, if I don't put the run-subroutine in a separate module,
> but in a *library* that is require-d in the main program, it runs fine,
> but this has other implications for name space collisions.
> 
> What obvious thing am I missing? Thanks for ideas!
> 
> (Apache 1.33, Perl 5.8.6, mod_perl 1.29, BerkeleyDB 4.2.52, Perl
> interface 0.25)
> 

Reply via email to