Annotation of embedaddon/sqlite3/test/thread004.test, revision 1.1.1.1

1.1       misho       1: # 2009 February 26
                      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: thread004.test,v 1.3 2009/06/05 17:09:12 drh Exp $
                     13: 
                     14: set testdir [file dirname $argv0]
                     15: 
                     16: source $testdir/tester.tcl
                     17: if {[run_thread_tests]==0} { finish_test ; return }
                     18: ifcapable !shared_cache {
                     19:   finish_test
                     20:   return
                     21: }
                     22: if { [info commands sqlite3_table_column_metadata] eq "" } {
                     23:   finish_test
                     24:   return
                     25: }
                     26: 
                     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
                     32: 
                     33: # Create a table in database test.db
                     34: #
                     35: sqlite3 db test.db
                     36: do_test thread004-1.1 {
                     37:   execsql { CREATE TABLE t1(a, b, c) }
                     38: } {}
                     39: 
                     40: do_test thread004-1.2 {
                     41: 
                     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:   }
                     75: 
                     76:   set finished(2)
                     77: } {0}
                     78: sqlite3_enable_shared_cache $::enable_shared_cache
                     79: finish_test

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>