Roll src/third_party/WebKit a3b4a2e:7441784 (svn 202551:202552)
[chromium-blink-merge.git] / third_party / sqlite / src / test / thread004.test
blobb2adc460d008a85446bab42c65e7643a70a78fde
1 # 2009 February 26
3 # The author disclaims copyright to this source code.  In place of
4 # a legal notice, here is a blessing:
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.
10 #***********************************************************************
12 # $Id: thread004.test,v 1.3 2009/06/05 17:09:12 drh Exp $
14 set testdir [file dirname $argv0]
16 source $testdir/tester.tcl
17 if {[run_thread_tests]==0} { finish_test ; return }
18 ifcapable !shared_cache {
19   finish_test
20   return
22 if { [info commands sqlite3_table_column_metadata] eq "" } {
23   finish_test
24   return
27 # Use shared-cache mode for this test.
28
29 db close
30 set ::enable_shared_cache [sqlite3_enable_shared_cache]
31 sqlite3_enable_shared_cache 1
33 # Create a table in database test.db
35 sqlite3 db test.db
36 do_test thread004-1.1 {
37   execsql { CREATE TABLE t1(a, b, c) }
38 } {}
40 do_test thread004-1.2 {
42   set ThreadOne {
43     set iStart [clock_seconds]
44     while {[clock_seconds]<$iStart+20} {
45       set ::DB [sqlite3_open test.db]
46       sqlite3_close $::DB
47     }
48   }
49   set ThreadTwo {
50     set ::DB [sqlite3_open test.db]
51     set iStart [clock_seconds]
52     set nErr 0
53     while {[clock_seconds] <$iStart+20} {
54       incr nErr [catch {sqlite3_table_column_metadata $::DB main t1 a}]
55     }
56     sqlite3_close $::DB
57     set nErr
58   }
59   
60   # Run two threads. The first thread opens and closes database test.db
61   # repeatedly. Each time this happens, the in-memory schema used by
62   # all connections to test.db is discarded.
63   #
64   # The second thread calls sqlite3_table_column_metadata() over and
65   # over again. Each time it is called, the database schema is loaded
66   # if it is not already in memory. At one point this was crashing.
67   #
68   unset -nocomplain finished
69   thread_spawn finished(1) $thread_procs $ThreadOne
70   thread_spawn finished(2) $thread_procs $ThreadTwo
71   
72   foreach t {1 2} {
73     if {![info exists finished($t)]} { vwait finished($t) }
74   }
76   set finished(2)
77 } {0}
78 sqlite3_enable_shared_cache $::enable_shared_cache
79 finish_test