BEGIN {
$| = 1;
- print("1..103\n"); ### Number of tests that will be run ###
+ print("1..91\n"); ### Number of tests that will be run ###
};
use threads;
# RedHat users should see https://rhn.redhat.com/errata/RHBA-2003-136.html
# and consider upgrading their glibc.
+
sub forko (&$$); # To prevent deadlock from underlying pthread_* bugs (as in
# stock RH9 glibc/NPTL) or from our own errors, we run tests
# in separately forked and alarmed processes.
my $bump = $expected;
- $patience ||= 60;
-
unless (defined($pid = open(CHLD, "-|"))) {
die "fork: $!\n";
}
if (! $pid) { # Child -- run the test
- $patience ||= 60;
- alarm $patience;
+ alarm($patience || 60);
&$code;
exit;
}
close(CHLD);
while ($expected--) {
- $test_num++;
- print "not ok $test_num - child status $?\n";
+ ok(++$test_num, 0, "missing test result: child status $?");
}
$Base += $bump;
-
};
+
# - TEST basics
ok(1, defined &cond_wait, "cond_wait() present");
foreach (@wait_how) {
$test = "cond_wait [$_]";
threads->create(\&cw)->join;
- $Base += 6;
+ $Base += 5;
}
- }, 6*@wait_how, 90);
+ }, 5*@wait_how, 90);
sub cw {
- my $thr;
-
- { # -- begin lock scope; which lock to obtain?
+ # which lock to obtain?
$test =~ /twain/ ? lock($lock) : lock($cond);
ok(1,1, "$test: obtained initial lock");
- $thr = threads->create(\&signaller);
+ my $thr = threads->create(\&signaller);
for ($test) {
cond_wait($cond), last if /simple/;
cond_wait($cond, $cond), last if /repeat/;
cond_wait($cond, $lock), last if /twain/;
- die "$test: unknown test\n";
+ die "$test: unknown test\n";
}
+ $thr->join;
ok(5,1, "$test: condition obtained");
- } # -- end lock scope
-
- $thr->join;
- ok(6,1, "$test: join completed");
}
# - TEST cond_timedwait success
foreach (@wait_how) {
$test = "cond_timedwait [$_]";
threads->create(\&ctw, 5)->join;
- $Base += 6;
+ $Base += 5;
}
- }, 6*@wait_how, 90);
+ }, 5*@wait_how, 90);
sub ctw($) {
- my $to = shift;
- my $thr;
+ my $to = shift;
- { # -- begin lock scope; which lock to obtain?
+ # which lock to obtain?
$test =~ /twain/ ? lock($lock) : lock($cond);
ok(1,1, "$test: obtained initial lock");
- $thr = threads->create(\&signaller);
+ my $thr = threads->create(\&signaller);
my $ok = 0;
for ($test) {
$ok=cond_timedwait($cond, time() + $to), last if /simple/;
$ok=cond_timedwait($cond, time() + $to, $cond), last if /repeat/;
$ok=cond_timedwait($cond, time() + $to, $lock), last if /twain/;
- die "$test: unknown test\n";
+ die "$test: unknown test\n";
}
+ $thr->join;
ok(5,$ok, "$test: condition obtained");
- } # -- end lock scope
-
- $thr->join;
- ok(6,1, "$test: join completed");
}
# - TEST cond_timedwait timeout
$ok=cond_timedwait($cond, time() + $to), last if /simple/;
$ok=cond_timedwait($cond, time() + $to, $cond), last if /repeat/;
$ok=cond_timedwait($cond, time() + $to, $lock), last if /twain/;
- die "$test: unknown test\n";
+ die "$test: unknown test\n";
}
ok(2,!defined($ok), "$test: timeout");
}
SYNCH_REFS: {
my $test : shared; # simple|repeat|twain
-
+
my $true_cond; share($true_cond);
my $true_lock; share($true_lock);
foreach (@wait_how) {
$test = "cond_wait [$_]";
threads->create(\&cw2)->join;
- $Base += 6;
+ $Base += 5;
}
- }, 6*@wait_how, 90);
+ }, 5*@wait_how, 90);
sub cw2 {
- my $thr;
-
- { # -- begin lock scope; which lock to obtain?
+ # which lock to obtain?
$test =~ /twain/ ? lock($lock) : lock($cond);
ok(1,1, "$test: obtained initial lock");
- $thr = threads->create(\&signaller2);
+ my $thr = threads->create(\&signaller2);
for ($test) {
cond_wait($cond), last if /simple/;
cond_wait($cond, $cond), last if /repeat/;
cond_wait($cond, $lock), last if /twain/;
- die "$test: unknown test\n";
+ die "$test: unknown test\n";
}
+ $thr->join;
ok(5,1, "$test: condition obtained");
- } # -- end lock scope
-
- $thr->join;
- ok(6,1, "$test: join completed");
}
# - TEST cond_timedwait success
foreach (@wait_how) {
$test = "cond_timedwait [$_]";
threads->create(\&ctw2, 5)->join;
- $Base += 6;
+ $Base += 5;
}
- }, 6*@wait_how, 90);
+ }, 5*@wait_how, 90);
sub ctw2($) {
- my $to = shift;
- my $thr;
+ my $to = shift;
- { # -- begin lock scope; which lock to obtain?
+ # which lock to obtain?
$test =~ /twain/ ? lock($lock) : lock($cond);
ok(1,1, "$test: obtained initial lock");
- $thr = threads->create(\&signaller2);
+ my $thr = threads->create(\&signaller2);
my $ok = 0;
for ($test) {
$ok=cond_timedwait($cond, time() + $to), last if /simple/;
$ok=cond_timedwait($cond, time() + $to, $cond), last if /repeat/;
$ok=cond_timedwait($cond, time() + $to, $lock), last if /twain/;
- die "$test: unknown test\n";
+ die "$test: unknown test\n";
}
+ $thr->join;
ok(5,$ok, "$test: condition obtained");
- } # -- end lock scope
-
- $thr->join;
- ok(6,1, "$test: join completed");
}
# - TEST cond_timedwait timeout
$ok=cond_timedwait($cond, time() + $to), last if /simple/;
$ok=cond_timedwait($cond, time() + $to, $cond), last if /repeat/;
$ok=cond_timedwait($cond, time() + $to, $lock), last if /twain/;
- die "$test: unknown test\n";
+ die "$test: unknown test\n";
}
ok(2,!$ok, "$test: timeout");
}
BEGIN {
$| = 1;
- print("1..63\n"); ### Number of tests that will be run ###
+ print("1..57\n"); ### Number of tests that will be run ###
};
use threads;
# RedHat users should see https://rhn.redhat.com/errata/RHBA-2003-136.html
# and consider upgrading their glibc.
+
sub forko (&$$); # To prevent deadlock from underlying pthread_* bugs (as in
# stock RH9 glibc/NPTL) or from our own errors, we run tests
# in separately forked and alarmed processes.
my $bump = $expected;
- $patience ||= 60;
-
unless (defined($pid = open(CHLD, "-|"))) {
die "fork: $!\n";
}
if (! $pid) { # Child -- run the test
- $patience ||= 60;
- alarm $patience;
+ alarm($patience || 60);
&$code;
exit;
}
close(CHLD);
while ($expected--) {
- $test_num++;
- print "not ok $test_num - child status $?\n";
+ ok(++$test_num, 0, "missing test result: child status $?");
}
$Base += $bump;
-
};
+
# - TEST basics
my @wait_how = (
foreach (@wait_how) {
$test = "cond_timedwait [$_]";
threads->create(\&ctw, 0.05)->join;
- $Base += 6;
+ $Base += 5;
}
- }, 6*@wait_how, 5);
+ }, 5*@wait_how, 5);
sub ctw($) {
- my $to = shift;
- my $thr;
+ my $to = shift;
- { # -- begin lock scope; which lock to obtain?
+ # which lock to obtain?
$test =~ /twain/ ? lock($lock) : lock($cond);
ok(1,1, "$test: obtained initial lock");
- $thr = threads->create(\&signaller);
+ my $thr = threads->create(\&signaller);
my $ok = 0;
for ($test) {
$ok=cond_timedwait($cond, time() + $to), last if /simple/;
$ok=cond_timedwait($cond, time() + $to, $lock), last if /twain/;
die "$test: unknown test\n";
}
+ $thr->join;
ok(5,$ok, "$test: condition obtained");
- } # -- end lock scope
-
- $thr->join;
- ok(6,1, "$test: join completed");
}
# - TEST cond_timedwait timeout
foreach (@wait_how) {
$test = "cond_timedwait [$_]";
threads->create(\&ctw2, 0.05)->join;
- $Base += 6;
+ $Base += 5;
}
- }, 6*@wait_how, 5);
+ }, 5*@wait_how, 5);
sub ctw2($) {
- my $to = shift;
- my $thr;
+ my $to = shift;
- { # -- begin lock scope; which lock to obtain?
+ # which lock to obtain?
$test =~ /twain/ ? lock($lock) : lock($cond);
ok(1,1, "$test: obtained initial lock");
- $thr = threads->create(\&signaller2);
+ my $thr = threads->create(\&signaller2);
my $ok = 0;
for ($test) {
$ok=cond_timedwait($cond, time() + $to), last if /simple/;
$ok=cond_timedwait($cond, time() + $to, $lock), last if /twain/;
die "$test: unknown test\n";
}
+ $thr->join;
ok(5,$ok, "$test: condition obtained");
- } # -- end lock scope
-
- $thr->join;
- ok(6,1, "$test: join completed");
}
# - TEST cond_timedwait timeout