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_app1 static_app2 static_app3 | |
106 static_lru static_master static_mem static_open | |
107 static_prng static_pmem static_vfs1 static_vfs2 | |
108 static_vfs3 | |
109 } | |
110 serialized { | |
111 fast recursive static_app1 static_app2 | |
112 static_app3 static_lru static_master static_mem | |
113 static_open static_prng static_pmem static_vfs1 | |
114 static_vfs2 static_vfs3 | |
115 } | |
116 } { | |
117 | |
118 do_test mutex1.2.$mode.1 { | |
119 catch {db close} | |
120 sqlite3_shutdown | |
121 sqlite3_config $mode | |
122 } SQLITE_OK | |
123 | |
124 do_test mutex1.2.$mode.2 { | |
125 sqlite3_initialize | |
126 clear_mutex_counters | |
127 sqlite3 db test.db -nomutex 0 -fullmutex 0 | |
128 catchsql { CREATE TABLE abc(a, b, c) } | |
129 db eval { | |
130 INSERT INTO abc VALUES(1, 2, 3); | |
131 } | |
132 } {} | |
133 ifcapable !memorymanage { | |
134 regsub { static_lru} $mutexes {} mutexes | |
135 } | |
136 if {$mode ne "singlethread"} { | |
137 do_test mutex1.2.$mode.3 { | |
138 # | |
139 # NOTE: Make sure all the app and vfs mutexes get used. | |
140 # | |
141 enter_static_mutex static_app1 | |
142 leave_static_mutex static_app1 | |
143 enter_static_mutex static_app2 | |
144 leave_static_mutex static_app2 | |
145 enter_static_mutex static_app3 | |
146 leave_static_mutex static_app3 | |
147 enter_static_mutex static_vfs1 | |
148 leave_static_mutex static_vfs1 | |
149 enter_static_mutex static_vfs2 | |
150 leave_static_mutex static_vfs2 | |
151 enter_static_mutex static_vfs3 | |
152 leave_static_mutex static_vfs3 | |
153 } {} | |
154 } | |
155 do_test mutex1.2.$mode.4 { | |
156 mutex_counters counters | |
157 | |
158 set res [list] | |
159 foreach {key value} [array get counters] { | |
160 if {$key ne "total" && $value > 0} { | |
161 lappend res $key | |
162 } | |
163 } | |
164 lsort $res | |
165 } [lsort $mutexes] | |
166 } | |
167 sqlite3_enable_shared_cache $enable_shared_cache | |
168 | |
169 # Open and use a connection in "nomutex" mode. Test that no recursive | |
170 # mutexes are obtained. | |
171 do_test mutex1.3.1 { | |
172 catch {db close} | |
173 clear_mutex_counters | |
174 sqlite3 db test.db -nomutex 1 | |
175 execsql { SELECT * FROM abc } | |
176 } {1 2 3 1 2 3 1 2 3} | |
177 do_test mutex1.3.2 { | |
178 mutex_counters counters | |
179 set counters(recursive) | |
180 } {0} | |
181 } | |
182 | |
183 # Test the sqlite3_db_mutex() function. | |
184 # | |
185 do_test mutex1.4.1 { | |
186 catch {db close} | |
187 sqlite3 db test.db | |
188 enter_db_mutex db | |
189 db eval {SELECT 1, 2, 3} | |
190 } {1 2 3} | |
191 do_test mutex1.4.2 { | |
192 leave_db_mutex db | |
193 db eval {SELECT 1, 2, 3} | |
194 } {1 2 3} | |
195 do_test mutex1.4.3 { | |
196 catch {db close} | |
197 sqlite3 db test.db -nomutex 1 | |
198 enter_db_mutex db | |
199 db eval {SELECT 1, 2, 3} | |
200 } {1 2 3} | |
201 do_test mutex1.4.4 { | |
202 leave_db_mutex db | |
203 db eval {SELECT 1, 2, 3} | |
204 } {1 2 3} | |
205 | |
206 do_test mutex1-X { | |
207 catch {db close} | |
208 sqlite3_shutdown | |
209 clear_mutex_counters | |
210 install_mutex_counters 0 | |
211 sqlite3_initialize | |
212 } {SQLITE_OK} | |
213 | |
214 autoinstall_test_functions | |
215 finish_test | |
OLD | NEW |