📄 mutexscript.tcl
字号:
# See the file LICENSE for redistribution information.## Copyright (c) 1996-2002# Sleepycat Software. All rights reserved.## $Id: mutexscript.tcl,v 11.16 2002/04/29 14:58:16 sandstro Exp $## Random mutex tester.# Usage: mutexscript dir numiters mlocks sleepint degree# dir: dir in which all the mutexes live.# numiters: Total number of iterations.# nmutex: Total number of mutexes.# sleepint: Maximum sleep interval.# degree: Maximum number of locks to acquire at oncesource ./include.tclsource $test_path/test.tclsource $test_path/testutils.tclset usage "mutexscript dir numiters nmutex sleepint degree"# Verify usageif { $argc != 5 } { puts stderr "FAIL:[timestamp] Usage: $usage" exit}# Initialize argumentsset dir [lindex $argv 0]set numiters [ lindex $argv 1 ]set nmutex [ lindex $argv 2 ]set sleepint [ lindex $argv 3 ]set degree [ lindex $argv 4 ]set locker [pid]set mypid [sanitized_pid]# Initialize seedglobal rand_initberkdb srand $rand_initputs -nonewline "Mutexscript: Beginning execution for $locker:"puts " $numiters $nmutex $sleepint $degree"flush stdout# Open the environment and the mutexset e [berkdb_env -create -mode 0644 -lock -home $dir]error_check_good evn_open [is_valid_env $e] TRUEset mutex [$e mutex 0644 $nmutex]error_check_good mutex_init [is_valid_mutex $mutex $e] TRUE# Sleep for awhile to make sure that everyone has gotten intclsleep 5for { set iter 0 } { $iter < $numiters } { incr iter } { set nlocks [berkdb random_int 1 $degree] # We will always lock objects in ascending order to avoid # deadlocks. set lastobj 1 set mlist {} for { set lnum 0 } { $lnum < $nlocks } { incr lnum } { # Pick lock parameters set obj [berkdb random_int $lastobj [expr $nmutex - 1]] set lastobj [expr $obj + 1] puts "[timestamp] $locker $lnum: $obj" # Do get, set its val to own pid, and then add to list error_check_good mutex_get:$obj [$mutex get $obj] 0 error_check_good mutex_setval:$obj [$mutex setval $obj $mypid] 0 lappend mlist $obj if {$lastobj >= $nmutex} { break } } # Sleep for 10 to (100*$sleepint) ms. after [berkdb random_int 10 [expr $sleepint * 100]] # Now release locks foreach i $mlist { error_check_good mutex_getval:$i [$mutex getval $i] $mypid error_check_good mutex_setval:$i \ [$mutex setval $i [expr 0 - $mypid]] 0 error_check_good mutex_release:$i [$mutex release $i] 0 } puts "[timestamp] $locker released mutexes" flush stdout}puts "[timestamp] $locker Complete"flush stdout
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -