github.com/jdgcs/sqlite3@v1.12.1-0.20210908114423-bc5f96e4dd51/testdata/tcl/thread004.test (about)

     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