12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- # 2009 February 26
- #
- # The author disclaims copyright to this source code. In place of
- # a legal notice, here is a blessing:
- #
- # May you do good and not evil.
- # May you find forgiveness for yourself and forgive others.
- # May you share freely, never taking more than you give.
- #
- #***********************************************************************
- #
- # $Id: thread004.test,v 1.3 2009/06/05 17:09:12 drh Exp $
- set testdir [file dirname $argv0]
- source $testdir/tester.tcl
- if {[run_thread_tests]==0} { finish_test ; return }
- ifcapable !shared_cache {
- finish_test
- return
- }
- if { [info commands sqlite3_table_column_metadata] eq "" } {
- finish_test
- return
- }
- # Use shared-cache mode for this test.
- #
- db close
- set ::enable_shared_cache [sqlite3_enable_shared_cache]
- sqlite3_enable_shared_cache 1
- # Create a table in database test.db
- #
- sqlite3 db test.db
- do_test thread004-1.1 {
- execsql { CREATE TABLE t1(a, b, c) }
- } {}
- do_test thread004-1.2 {
- set ThreadOne {
- set iStart [clock_seconds]
- while {[clock_seconds]<$iStart+20} {
- set ::DB [sqlite3_open test.db]
- sqlite3_close $::DB
- }
- }
- set ThreadTwo {
- set ::DB [sqlite3_open test.db]
- set iStart [clock_seconds]
- set nErr 0
- while {[clock_seconds] <$iStart+20} {
- incr nErr [catch {sqlite3_table_column_metadata $::DB main t1 a}]
- }
- sqlite3_close $::DB
- set nErr
- }
-
- # Run two threads. The first thread opens and closes database test.db
- # repeatedly. Each time this happens, the in-memory schema used by
- # all connections to test.db is discarded.
- #
- # The second thread calls sqlite3_table_column_metadata() over and
- # over again. Each time it is called, the database schema is loaded
- # if it is not already in memory. At one point this was crashing.
- #
- unset -nocomplain finished
- thread_spawn finished(1) $thread_procs $ThreadOne
- thread_spawn finished(2) $thread_procs $ThreadTwo
-
- foreach t {1 2} {
- if {![info exists finished($t)]} { vwait finished($t) }
- }
- set finished(2)
- } {0}
- sqlite3_enable_shared_cache $::enable_shared_cache
- finish_test
|