123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 |
- # 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.20 2009/04/23 14:58:40 danielk1977 Exp $
- set testdir [file dirname $argv0]
- source $testdir/tester.tcl
- ifcapable !mutex {
- finish_test
- return
- }
- if {[info exists tester_do_binarylog]} {
- finish_test
- return
- }
- sqlite3_reset_auto_extension
- clear_mutex_counters
- 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.
- #
- ifcapable threadsafe&&shared_cache {
- set enable_shared_cache [sqlite3_enable_shared_cache 1]
- foreach {mode mutexes} {
- singlethread {}
- multithread {
- fast static_lru static_master static_mem static_open static_prng
- static_pmem
- }
- serialized {
- fast recursive static_lru static_master static_mem static_open
- static_prng static_pmem
- }
- } {
- 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 -fullmutex 0
- catchsql { CREATE TABLE abc(a, b, c) }
- db eval {
- INSERT INTO abc VALUES(1, 2, 3);
- }
- } {}
- ifcapable !memorymanage {
- regsub { static_lru} $mutexes {} mutexes
- }
- 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.
- 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}
- }
- # Test the sqlite3_db_mutex() function.
- #
- do_test mutex1.4.1 {
- catch {db close}
- sqlite3 db test.db
- enter_db_mutex db
- db eval {SELECT 1, 2, 3}
- } {1 2 3}
- do_test mutex1.4.2 {
- leave_db_mutex db
- db eval {SELECT 1, 2, 3}
- } {1 2 3}
- do_test mutex1.4.3 {
- catch {db close}
- sqlite3 db test.db -nomutex 1
- enter_db_mutex db
- db eval {SELECT 1, 2, 3}
- } {1 2 3}
- do_test mutex1.4.4 {
- leave_db_mutex db
- db eval {SELECT 1, 2, 3}
- } {1 2 3}
- 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
|