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.1.1.1 2012/02/21 17:04:16 misho 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
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>