11a9ed0b2Sdanielk1977# 2008 June 17 21a9ed0b2Sdanielk1977# 31a9ed0b2Sdanielk1977# The author disclaims copyright to this source code. In place of 41a9ed0b2Sdanielk1977# a legal notice, here is a blessing: 51a9ed0b2Sdanielk1977# 61a9ed0b2Sdanielk1977# May you do good and not evil. 71a9ed0b2Sdanielk1977# May you find forgiveness for yourself and forgive others. 81a9ed0b2Sdanielk1977# May you share freely, never taking more than you give. 91a9ed0b2Sdanielk1977# 101a9ed0b2Sdanielk1977#*********************************************************************** 111a9ed0b2Sdanielk1977# 12a3f06598Sdanielk1977# $Id: mutex1.test,v 1.20 2009/04/23 14:58:40 danielk1977 Exp $ 131a9ed0b2Sdanielk1977 141a9ed0b2Sdanielk1977set testdir [file dirname $argv0] 151a9ed0b2Sdanielk1977source $testdir/tester.tcl 16185eac95Sdanielk1977 1718472fa7Sdrhifcapable !mutex { 1818472fa7Sdrh finish_test 1918472fa7Sdrh return 2018472fa7Sdrh} 21185eac95Sdanielk1977if {[info exists tester_do_binarylog]} { 22185eac95Sdanielk1977 finish_test 23185eac95Sdanielk1977 return 24185eac95Sdanielk1977} 25185eac95Sdanielk1977 2655b0cf00Sdrhsqlite3_reset_auto_extension 275807c4ccSdrhclear_mutex_counters 281a9ed0b2Sdanielk1977 291a9ed0b2Sdanielk1977proc mutex_counters {varname} { 301a9ed0b2Sdanielk1977 upvar $varname var 311a9ed0b2Sdanielk1977 set var(total) 0 321a9ed0b2Sdanielk1977 foreach {name value} [read_mutex_counters] { 331a9ed0b2Sdanielk1977 set var($name) $value 341a9ed0b2Sdanielk1977 incr var(total) $value 351a9ed0b2Sdanielk1977 } 361a9ed0b2Sdanielk1977} 371a9ed0b2Sdanielk1977 381a9ed0b2Sdanielk1977#------------------------------------------------------------------------- 391a9ed0b2Sdanielk1977# Tests mutex1-1.* test that sqlite3_config() returns SQLITE_MISUSE if 401a9ed0b2Sdanielk1977# is called at the wrong time. And that the first time sqlite3_initialize 41*1e32bed3Sdrh# is called it obtains the 'static_main' mutex 3 times and a recursive 4271bc31c6Sdanielk1977# mutex (sqlite3Config.pInitMutex) twice. Subsequent calls are no-ops 4371bc31c6Sdanielk1977# that do not require any mutexes. 441a9ed0b2Sdanielk1977# 451a9ed0b2Sdanielk1977do_test mutex1-1.0 { 461a9ed0b2Sdanielk1977 install_mutex_counters 1 471a9ed0b2Sdanielk1977} {SQLITE_MISUSE} 481a9ed0b2Sdanielk1977 491a9ed0b2Sdanielk1977do_test mutex1-1.1 { 501a9ed0b2Sdanielk1977 db close 511a9ed0b2Sdanielk1977 install_mutex_counters 1 521a9ed0b2Sdanielk1977} {SQLITE_MISUSE} 531a9ed0b2Sdanielk1977 541a9ed0b2Sdanielk1977do_test mutex1-1.2 { 551a9ed0b2Sdanielk1977 sqlite3_shutdown 561a9ed0b2Sdanielk1977 install_mutex_counters 1 571a9ed0b2Sdanielk1977} {SQLITE_OK} 581a9ed0b2Sdanielk1977 591a9ed0b2Sdanielk1977do_test mutex1-1.3 { 601a9ed0b2Sdanielk1977 install_mutex_counters 0 611a9ed0b2Sdanielk1977} {SQLITE_OK} 621a9ed0b2Sdanielk1977 631a9ed0b2Sdanielk1977do_test mutex1-1.4 { 641a9ed0b2Sdanielk1977 install_mutex_counters 1 651a9ed0b2Sdanielk1977} {SQLITE_OK} 661a9ed0b2Sdanielk1977 671a9ed0b2Sdanielk1977do_test mutex1-1.5 { 681a9ed0b2Sdanielk1977 mutex_counters counters 691a9ed0b2Sdanielk1977 set counters(total) 701a9ed0b2Sdanielk1977} {0} 711a9ed0b2Sdanielk1977 721a9ed0b2Sdanielk1977do_test mutex1-1.6 { 731a9ed0b2Sdanielk1977 sqlite3_initialize 741a9ed0b2Sdanielk1977} {SQLITE_OK} 751a9ed0b2Sdanielk1977 761a9ed0b2Sdanielk1977do_test mutex1-1.7 { 771a9ed0b2Sdanielk1977 mutex_counters counters 78*1e32bed3Sdrh # list $counters(total) $counters(static_main) 79e339d65aSdanielk1977 expr {$counters(total)>0} 80e339d65aSdanielk1977} {1} 811a9ed0b2Sdanielk1977 821a9ed0b2Sdanielk1977do_test mutex1-1.8 { 831a9ed0b2Sdanielk1977 clear_mutex_counters 841a9ed0b2Sdanielk1977 sqlite3_initialize 851a9ed0b2Sdanielk1977} {SQLITE_OK} 861a9ed0b2Sdanielk1977 871a9ed0b2Sdanielk1977do_test mutex1-1.9 { 881a9ed0b2Sdanielk1977 mutex_counters counters 89*1e32bed3Sdrh list $counters(total) $counters(static_main) 901a9ed0b2Sdanielk1977} {0 0} 911a9ed0b2Sdanielk1977 9259f8c08eSdanielk1977#------------------------------------------------------------------------- 9359f8c08eSdanielk1977# Tests mutex1-2.* test the three thread-safety related modes that 9459f8c08eSdanielk1977# can be selected using sqlite3_config: 9559f8c08eSdanielk1977# 9659f8c08eSdanielk1977# * Serialized mode, 9759f8c08eSdanielk1977# * Multi-threaded mode, 9859f8c08eSdanielk1977# * Single-threaded mode. 9959f8c08eSdanielk1977# 100b99185f2Sdrhifcapable threadsafe1&&shared_cache { 101c8d75674Sdrh set enable_shared_cache [sqlite3_enable_shared_cache 1] 10259f8c08eSdanielk1977 foreach {mode mutexes} { 10359f8c08eSdanielk1977 singlethread {} 1046d4fb833Sdan multithread { 10528ae577aSmistachkin fast static_app1 static_app2 static_app3 106*1e32bed3Sdrh static_lru static_main static_mem static_open 10728ae577aSmistachkin static_prng static_pmem static_vfs1 static_vfs2 10828ae577aSmistachkin static_vfs3 1096d4fb833Sdan } 1106d4fb833Sdan serialized { 11128ae577aSmistachkin fast recursive static_app1 static_app2 112*1e32bed3Sdrh static_app3 static_lru static_main static_mem 11328ae577aSmistachkin static_open static_prng static_pmem static_vfs1 11428ae577aSmistachkin static_vfs2 static_vfs3 1156d4fb833Sdan } 11659f8c08eSdanielk1977 } { 117c8d75674Sdrh 11859f8c08eSdanielk1977 do_test mutex1.2.$mode.1 { 11959f8c08eSdanielk1977 catch {db close} 12059f8c08eSdanielk1977 sqlite3_shutdown 12159f8c08eSdanielk1977 sqlite3_config $mode 12259f8c08eSdanielk1977 } SQLITE_OK 12359f8c08eSdanielk1977 12459f8c08eSdanielk1977 do_test mutex1.2.$mode.2 { 12571bc31c6Sdanielk1977 sqlite3_initialize 12659f8c08eSdanielk1977 clear_mutex_counters 127d9da78a2Sdrh sqlite3 db test.db -nomutex 0 -fullmutex 0 12859f8c08eSdanielk1977 catchsql { CREATE TABLE abc(a, b, c) } 12959f8c08eSdanielk1977 db eval { 13059f8c08eSdanielk1977 INSERT INTO abc VALUES(1, 2, 3); 13159f8c08eSdanielk1977 } 13259f8c08eSdanielk1977 } {} 133986d3b95Sdrh ifcapable !memorymanage { 134986d3b95Sdrh regsub { static_lru} $mutexes {} mutexes 135986d3b95Sdrh } 13628ae577aSmistachkin if {$mode ne "singlethread"} { 13759f8c08eSdanielk1977 do_test mutex1.2.$mode.3 { 13828ae577aSmistachkin # 13928ae577aSmistachkin # NOTE: Make sure all the app and vfs mutexes get used. 14028ae577aSmistachkin # 14128ae577aSmistachkin enter_static_mutex static_app1 14228ae577aSmistachkin leave_static_mutex static_app1 14328ae577aSmistachkin enter_static_mutex static_app2 14428ae577aSmistachkin leave_static_mutex static_app2 14528ae577aSmistachkin enter_static_mutex static_app3 14628ae577aSmistachkin leave_static_mutex static_app3 14728ae577aSmistachkin enter_static_mutex static_vfs1 14828ae577aSmistachkin leave_static_mutex static_vfs1 14928ae577aSmistachkin enter_static_mutex static_vfs2 15028ae577aSmistachkin leave_static_mutex static_vfs2 15128ae577aSmistachkin enter_static_mutex static_vfs3 15228ae577aSmistachkin leave_static_mutex static_vfs3 15328ae577aSmistachkin } {} 15428ae577aSmistachkin } 15528ae577aSmistachkin do_test mutex1.2.$mode.4 { 15659f8c08eSdanielk1977 mutex_counters counters 15759f8c08eSdanielk1977 15859f8c08eSdanielk1977 set res [list] 15959f8c08eSdanielk1977 foreach {key value} [array get counters] { 16059f8c08eSdanielk1977 if {$key ne "total" && $value > 0} { 16159f8c08eSdanielk1977 lappend res $key 16259f8c08eSdanielk1977 } 16359f8c08eSdanielk1977 } 16459f8c08eSdanielk1977 lsort $res 165c8d75674Sdrh } [lsort $mutexes] 16659f8c08eSdanielk1977 } 167c8d75674Sdrh sqlite3_enable_shared_cache $enable_shared_cache 1681a9ed0b2Sdanielk1977 1699a6284c1Sdanielk1977 # Open and use a connection in "nomutex" mode. Test that no recursive 1709a6284c1Sdanielk1977 # mutexes are obtained. 1719a6284c1Sdanielk1977 do_test mutex1.3.1 { 1729a6284c1Sdanielk1977 catch {db close} 1739a6284c1Sdanielk1977 clear_mutex_counters 1749a6284c1Sdanielk1977 sqlite3 db test.db -nomutex 1 1759a6284c1Sdanielk1977 execsql { SELECT * FROM abc } 1769a6284c1Sdanielk1977 } {1 2 3 1 2 3 1 2 3} 1779a6284c1Sdanielk1977 do_test mutex1.3.2 { 1789a6284c1Sdanielk1977 mutex_counters counters 1799a6284c1Sdanielk1977 set counters(recursive) 1809a6284c1Sdanielk1977 } {0} 18185e9e22bSdrh} 1829a6284c1Sdanielk1977 1835f6d0268Sdanielk1977# Test the sqlite3_db_mutex() function. 1845f6d0268Sdanielk1977# 1855f6d0268Sdanielk1977do_test mutex1.4.1 { 1865f6d0268Sdanielk1977 catch {db close} 1875f6d0268Sdanielk1977 sqlite3 db test.db 1885f6d0268Sdanielk1977 enter_db_mutex db 1895f6d0268Sdanielk1977 db eval {SELECT 1, 2, 3} 1905f6d0268Sdanielk1977} {1 2 3} 1915f6d0268Sdanielk1977do_test mutex1.4.2 { 1925f6d0268Sdanielk1977 leave_db_mutex db 1935f6d0268Sdanielk1977 db eval {SELECT 1, 2, 3} 1945f6d0268Sdanielk1977} {1 2 3} 1955f6d0268Sdanielk1977do_test mutex1.4.3 { 1965f6d0268Sdanielk1977 catch {db close} 1975f6d0268Sdanielk1977 sqlite3 db test.db -nomutex 1 1985f6d0268Sdanielk1977 enter_db_mutex db 1995f6d0268Sdanielk1977 db eval {SELECT 1, 2, 3} 2005f6d0268Sdanielk1977} {1 2 3} 2015f6d0268Sdanielk1977do_test mutex1.4.4 { 2025f6d0268Sdanielk1977 leave_db_mutex db 2035f6d0268Sdanielk1977 db eval {SELECT 1, 2, 3} 2045f6d0268Sdanielk1977} {1 2 3} 2055f6d0268Sdanielk1977 2061a9ed0b2Sdanielk1977do_test mutex1-X { 20701bf2996Sdanielk1977 catch {db close} 2081a9ed0b2Sdanielk1977 sqlite3_shutdown 2091a9ed0b2Sdanielk1977 clear_mutex_counters 2101a9ed0b2Sdanielk1977 install_mutex_counters 0 21101bf2996Sdanielk1977 sqlite3_initialize 2121a9ed0b2Sdanielk1977} {SQLITE_OK} 2131a9ed0b2Sdanielk1977 21455b0cf00Sdrhautoinstall_test_functions 2151a9ed0b2Sdanielk1977finish_test 216