proc mutex002 { } {
source ./include.tcl
puts "Mutex002: Basic synchronization"
env_cleanup $testdir
set nlocks 20
set f1 [open |$tclsh_path r+]
puts $f1 "source $test_path/test.tcl"
flush $f1
puts "\tMutex002.a: Open local and remote env"
set local_env [berkdb_env -create -mode 0644 -lock -home $testdir]
error_check_good env_open [is_valid_env $local_env] TRUE
set local_mutex [$local_env mutex 0644 $nlocks]
error_check_good \
mutex_init [is_valid_mutex $local_mutex $local_env] TRUE
set remote_env [send_cmd $f1 "berkdb_env -lock -home $testdir"]
error_check_good remote:env_open [is_valid_env $remote_env] TRUE
set remote_mutex [send_cmd $f1 "$remote_env mutex 0644 $nlocks"]
error_check_good \
mutex_init [is_valid_mutex $remote_mutex $remote_env] TRUE
puts "\tMutex002.b: Local and remote get/set"
set r [$local_mutex get 1]
error_check_good lock_get $r 0
set r [$local_mutex setval 1 [pid]]
error_check_good lock_get $r 0
send_timed_cmd $f1 1 "$remote_mutex get 1"
send_timed_cmd $f1 1 "set ret \[$remote_mutex getval 1\]"
tclsleep 5
set newv [expr [pid] - 1]
set r [$local_mutex setval 1 $newv]
error_check_good mutex_setval $r 0
set r [$local_mutex release 1]
error_check_good mutex_release $r 0
set result [rcv_result $f1]
error_check_good lock_get:remote_time [expr $result > 4] 1
set result [rcv_result $f1]
set result [send_cmd $f1 "puts \$ret"]
error_check_good lock_get:remote_getval $result $newv
puts "\tMutex002.c: Close remote"
set ret [send_cmd $f1 "$remote_mutex close" 5]
gets $f1 ret
error_check_good remote:mutex_close $ret 0
set ret [send_cmd $f1 "$remote_env close"]
error_check_good remote:env_close $ret 0
catch { close $f1 } result
set ret [$local_mutex close]
error_check_good local:mutex_close $ret 0
set ret [$local_env close]
error_check_good local:env_close $ret 0
}