OLD | NEW |
| (Empty) |
1 # 2008 June 17 | |
2 # | |
3 # The author disclaims copyright to this source code. In place of | |
4 # a legal notice, here is a blessing: | |
5 # | |
6 # May you do good and not evil. | |
7 # May you find forgiveness for yourself and forgive others. | |
8 # May you share freely, never taking more than you give. | |
9 # | |
10 #*********************************************************************** | |
11 # | |
12 # $Id: mutex1.test,v 1.20 2009/04/23 14:58:40 danielk1977 Exp $ | |
13 | |
14 set testdir [file dirname $argv0] | |
15 source $testdir/tester.tcl | |
16 | |
17 ifcapable !mutex { | |
18 finish_test | |
19 return | |
20 } | |
21 if {[info exists tester_do_binarylog]} { | |
22 finish_test | |
23 return | |
24 } | |
25 | |
26 sqlite3_reset_auto_extension | |
27 clear_mutex_counters | |
28 | |
29 proc mutex_counters {varname} { | |
30 upvar $varname var | |
31 set var(total) 0 | |
32 foreach {name value} [read_mutex_counters] { | |
33 set var($name) $value | |
34 incr var(total) $value | |
35 } | |
36 } | |
37 | |
38 #------------------------------------------------------------------------- | |
39 # Tests mutex1-1.* test that sqlite3_config() returns SQLITE_MISUSE if | |
40 # is called at the wrong time. And that the first time sqlite3_initialize | |
41 # is called it obtains the 'static_master' mutex 3 times and a recursive | |
42 # mutex (sqlite3Config.pInitMutex) twice. Subsequent calls are no-ops | |
43 # that do not require any mutexes. | |
44 # | |
45 do_test mutex1-1.0 { | |
46 install_mutex_counters 1 | |
47 } {SQLITE_MISUSE} | |
48 | |
49 do_test mutex1-1.1 { | |
50 db close | |
51 install_mutex_counters 1 | |
52 } {SQLITE_MISUSE} | |
53 | |
54 do_test mutex1-1.2 { | |
55 sqlite3_shutdown | |
56 install_mutex_counters 1 | |
57 } {SQLITE_OK} | |
58 | |
59 do_test mutex1-1.3 { | |
60 install_mutex_counters 0 | |
61 } {SQLITE_OK} | |
62 | |
63 do_test mutex1-1.4 { | |
64 install_mutex_counters 1 | |
65 } {SQLITE_OK} | |
66 | |
67 do_test mutex1-1.5 { | |
68 mutex_counters counters | |
69 set counters(total) | |
70 } {0} | |
71 | |
72 do_test mutex1-1.6 { | |
73 sqlite3_initialize | |
74 } {SQLITE_OK} | |
75 | |
76 do_test mutex1-1.7 { | |
77 mutex_counters counters | |
78 # list $counters(total) $counters(static_master) | |
79 expr {$counters(total)>0} | |
80 } {1} | |
81 | |
82 do_test mutex1-1.8 { | |
83 clear_mutex_counters | |
84 sqlite3_initialize | |
85 } {SQLITE_OK} | |
86 | |
87 do_test mutex1-1.9 { | |
88 mutex_counters counters | |
89 list $counters(total) $counters(static_master) | |
90 } {0 0} | |
91 | |
92 #------------------------------------------------------------------------- | |
93 # Tests mutex1-2.* test the three thread-safety related modes that | |
94 # can be selected using sqlite3_config: | |
95 # | |
96 # * Serialized mode, | |
97 # * Multi-threaded mode, | |
98 # * Single-threaded mode. | |
99 # | |
100 ifcapable threadsafe&&shared_cache { | |
101 set enable_shared_cache [sqlite3_enable_shared_cache 1] | |
102 foreach {mode mutexes} { | |
103 singlethread {} | |
104 multithread { | |
105 fast static_lru static_master static_mem static_open static_prng | |
106 static_pmem | |
107 } | |
108 serialized { | |
109 fast recursive static_lru static_master static_mem static_open | |
110 static_prng static_pmem | |
111 } | |
112 } { | |
113 | |
114 do_test mutex1.2.$mode.1 { | |
115 catch {db close} | |
116 sqlite3_shutdown | |
117 sqlite3_config $mode | |
118 } SQLITE_OK | |
119 | |
120 do_test mutex1.2.$mode.2 { | |
121 sqlite3_initialize | |
122 clear_mutex_counters | |
123 sqlite3 db test.db -nomutex 0 -fullmutex 0 | |
124 catchsql { CREATE TABLE abc(a, b, c) } | |
125 db eval { | |
126 INSERT INTO abc VALUES(1, 2, 3); | |
127 } | |
128 } {} | |
129 ifcapable !memorymanage { | |
130 regsub { static_lru} $mutexes {} mutexes | |
131 } | |
132 do_test mutex1.2.$mode.3 { | |
133 mutex_counters counters | |
134 | |
135 set res [list] | |
136 foreach {key value} [array get counters] { | |
137 if {$key ne "total" && $value > 0} { | |
138 lappend res $key | |
139 } | |
140 } | |
141 lsort $res | |
142 } [lsort $mutexes] | |
143 } | |
144 sqlite3_enable_shared_cache $enable_shared_cache | |
145 | |
146 # Open and use a connection in "nomutex" mode. Test that no recursive | |
147 # mutexes are obtained. | |
148 do_test mutex1.3.1 { | |
149 catch {db close} | |
150 clear_mutex_counters | |
151 sqlite3 db test.db -nomutex 1 | |
152 execsql { SELECT * FROM abc } | |
153 } {1 2 3 1 2 3 1 2 3} | |
154 do_test mutex1.3.2 { | |
155 mutex_counters counters | |
156 set counters(recursive) | |
157 } {0} | |
158 } | |
159 | |
160 # Test the sqlite3_db_mutex() function. | |
161 # | |
162 do_test mutex1.4.1 { | |
163 catch {db close} | |
164 sqlite3 db test.db | |
165 enter_db_mutex db | |
166 db eval {SELECT 1, 2, 3} | |
167 } {1 2 3} | |
168 do_test mutex1.4.2 { | |
169 leave_db_mutex db | |
170 db eval {SELECT 1, 2, 3} | |
171 } {1 2 3} | |
172 do_test mutex1.4.3 { | |
173 catch {db close} | |
174 sqlite3 db test.db -nomutex 1 | |
175 enter_db_mutex db | |
176 db eval {SELECT 1, 2, 3} | |
177 } {1 2 3} | |
178 do_test mutex1.4.4 { | |
179 leave_db_mutex db | |
180 db eval {SELECT 1, 2, 3} | |
181 } {1 2 3} | |
182 | |
183 do_test mutex1-X { | |
184 catch {db close} | |
185 sqlite3_shutdown | |
186 clear_mutex_counters | |
187 install_mutex_counters 0 | |
188 sqlite3_initialize | |
189 } {SQLITE_OK} | |
190 | |
191 autoinstall_test_functions | |
192 finish_test | |
OLD | NEW |