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