proc lock003 { {iter 500} {max 1000} {procs 5} } {
source ./include.tcl
global lock_curid
global lock_maxid
set ldegree 5
set objs 75
set reads 65
set wait 1
set conflicts { 0 0 0 0 0 1 0 1 1}
set seeds {}
puts "Lock003: Multi-process random lock test"
env_cleanup $testdir
puts "\tLock003.a: Create environment"
set e [berkdb_env -create -lock -home $testdir]
error_check_good env_open [is_substr $e env] 1
$e lock_id_set $lock_curid $lock_maxid
error_check_good env_close [$e close] 0
set pidlist {}
for { set i 0 } {$i < $procs} {incr i} {
if { [llength $seeds] == $procs } {
set s [lindex $seeds $i]
}
set p [exec $tclsh_path $test_path/wrap.tcl \
lockscript.tcl $testdir/lock003.$i.out \
$testdir $iter $objs $wait $ldegree $reads &]
lappend pidlist $p
}
puts "\tLock003.b: $procs independent processes now running"
watch_procs $pidlist 30 10800
set errstrings [eval findfail [glob $testdir/lock003.*.out]]
foreach str $errstrings {
puts "FAIL: error message in .out file: $str"
}
for { set i 0 } {$i < $procs} {incr i} {
fileremove -f $testdir/lock003.$i.out
}
}
proc lock003_create { rw obj } {
source ./include.tcl
set pref $testdir/L3FLAG
set f [open $pref.$rw.[pid].$obj w]
close $f
}
proc lock003_destroy { obj } {
source ./include.tcl
set pref $testdir/L3FLAG
set f [glob -nocomplain $pref.*.[pid].$obj]
error_check_good l3_destroy [llength $f] 1
fileremove $f
}
proc lock003_vrfy { rw obj } {
source ./include.tcl
set pref $testdir/L3FLAG
if { [string compare $rw "write"] == 0 } {
set fs [glob -nocomplain $pref.*.*.$obj]
error_check_good "number of other locks on $obj" [llength $fs] 0
} else {
set fs [glob -nocomplain $pref.write.*.$obj]
error_check_good "number of write locks on $obj" [llength $fs] 0
}
}