diff -r 000000000000 -r bde4ae8d615e os/persistentdata/persistentstorage/sqlite3api/TEST/TclScript/mutex1.test --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/os/persistentdata/persistentstorage/sqlite3api/TEST/TclScript/mutex1.test Fri Jun 15 03:10:57 2012 +0200 @@ -0,0 +1,158 @@ +# 2008 June 17 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# +# $Id: mutex1.test,v 1.14 2008/09/03 01:08:02 drh Exp $ + +set testdir [file dirname $argv0] +source $testdir/tester.tcl + +if {[info exists tester_do_binarylog]} { + finish_test + return +} + +sqlite3_reset_auto_extension + +proc mutex_counters {varname} { + upvar $varname var + set var(total) 0 + foreach {name value} [read_mutex_counters] { + set var($name) $value + incr var(total) $value + } +} + +#------------------------------------------------------------------------- +# Tests mutex1-1.* test that sqlite3_config() returns SQLITE_MISUSE if +# is called at the wrong time. And that the first time sqlite3_initialize +# is called it obtains the 'static_master' mutex 3 times and a recursive +# mutex (sqlite3Config.pInitMutex) twice. Subsequent calls are no-ops +# that do not require any mutexes. +# +do_test mutex1-1.0 { + install_mutex_counters 1 +} {SQLITE_MISUSE} + +do_test mutex1-1.1 { + db close + install_mutex_counters 1 +} {SQLITE_MISUSE} + +do_test mutex1-1.2 { + sqlite3_shutdown + install_mutex_counters 1 +} {SQLITE_OK} + +do_test mutex1-1.3 { + install_mutex_counters 0 +} {SQLITE_OK} + +do_test mutex1-1.4 { + install_mutex_counters 1 +} {SQLITE_OK} + +do_test mutex1-1.5 { + mutex_counters counters + set counters(total) +} {0} + +do_test mutex1-1.6 { + sqlite3_initialize +} {SQLITE_OK} + +do_test mutex1-1.7 { + mutex_counters counters + # list $counters(total) $counters(static_master) + expr {$counters(total)>0} +} {1} + +do_test mutex1-1.8 { + clear_mutex_counters + sqlite3_initialize +} {SQLITE_OK} + +do_test mutex1-1.9 { + mutex_counters counters + list $counters(total) $counters(static_master) +} {0 0} + +#------------------------------------------------------------------------- +# Tests mutex1-2.* test the three thread-safety related modes that +# can be selected using sqlite3_config: +# +# * Serialized mode, +# * Multi-threaded mode, +# * Single-threaded mode. +# +set enable_shared_cache [sqlite3_enable_shared_cache 1] +ifcapable threadsafe { + foreach {mode mutexes} { + singlethread {} + multithread {fast static_lru static_master static_mem static_prng } + serialized {fast recursive static_lru static_master static_mem static_prng} + } { + + do_test mutex1.2.$mode.1 { + catch {db close} + sqlite3_shutdown + sqlite3_config $mode + } SQLITE_OK + + do_test mutex1.2.$mode.2 { + sqlite3_initialize + clear_mutex_counters + sqlite3 db test.db -nomutex 0 + catchsql { CREATE TABLE abc(a, b, c) } + db eval { + INSERT INTO abc VALUES(1, 2, 3); + } + } {} + + do_test mutex1.2.$mode.3 { + mutex_counters counters + + set res [list] + foreach {key value} [array get counters] { + if {$key ne "total" && $value > 0} { + lappend res $key + } + } + lsort $res + } [lsort $mutexes] + } +} +sqlite3_enable_shared_cache $enable_shared_cache + +# Open and use a connection in "nomutex" mode. Test that no recursive +# mutexes are obtained. +ifcapable threadsafe { + do_test mutex1.3.1 { + catch {db close} + clear_mutex_counters + sqlite3 db test.db -nomutex 1 + execsql { SELECT * FROM abc } + } {1 2 3 1 2 3 1 2 3} + do_test mutex1.3.2 { + mutex_counters counters + set counters(recursive) + } {0} +} + +do_test mutex1-X { + catch {db close} + sqlite3_shutdown + clear_mutex_counters + install_mutex_counters 0 + sqlite3_initialize +} {SQLITE_OK} + +autoinstall_test_functions +finish_test