I've encountered a similar problem with alarm().
Here's a piece of working production code that
succesfully uses alarm() with DBI.
----------------------------------------
my $dbh = '';
# database connection will cause perl to 'die'
# will just exit the eval block so we can check
# the value of $dbh
eval {
local $SIG{ALRM} = sub {
$logFile->printflush("Connection to $db timed out\n");
die "connection timeout\n";
};
alarm $dbup::parms{connectionTimeOut};
$dbh = new PDBA::CM(
DATABASE => $db,
USERNAME => $dbup::uptime{$db}->{username},
PASSWORD => $password
);
};
# the alarm reset must be outside the eval{}
alarm 0;
------------------------------------
The trick is to use eval to create the connection.
Set the alarm inside the eval block, reset it outside the eval block.
Jared
On Wednesday 27 November 2002 01:49, Tim Bunce wrote:
> Got a moment to gve this more thought...
>
> > ----
> > #!/usr/SD/perl/bin/perl
> >
> > #use DBD::Oracle;
> > use DBI;
> >
> > $SIG{ALRM} = sub { print "Caught alarm\n"; };
> >
> > alarm (2);
> > $dbh = DBI->connect('dbi:Oracle:eman', 'eman', 'eman');
> > alarm (0);
> >
> > sleep(5);
> > print "Success\n";
> >
> > ----
> > If the "use DBD::Oracle" line is uncommented, the script succeeds. If
> > commented out, it fails, and the $SIG{ALRM} handler doesn't work either-
> > it just prints "Alarm Clock" and exits.
> >
> > It appears that the oracle libraries are monkeying with the signal
> > handlers?
>
> May actually be Solaris when it dynamically loads a library that
> uses threading into an application that wasn't linked for threading.
>
> > I'm not really happy with the "use DBD::Oracle" workaround at this point-
> > i'd hate to miss some script somewhere while trying to add it.
> >
> > If there's a way to fix this in DBD, i'd prefer that, certainly.
>
> Try reconfiguring (and rebuilding) perl to support threads. Don't
> actually _use_ the threads support, but the fact it's there (ie
> perl was linked with -lthread) may be enough to avoid the problem.
>
> Please let us know if it helps.
>
> Tim.