Annotation of embedaddon/sqlite3/test/thread_common.tcl, revision 1.1.1.1

1.1       misho       1: # 2007 September 10
                      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: thread_common.tcl,v 1.5 2009/03/26 14:48:07 danielk1977 Exp $
                     13: 
                     14: if {[info exists ::thread_procs]} {
                     15:   return 0
                     16: }
                     17: 
                     18: # The following script is sourced by every thread spawned using 
                     19: # [sqlthread spawn]:
                     20: set thread_procs {
                     21: 
                     22:   # Execute the supplied SQL using database handle $::DB.
                     23:   #
                     24:   proc execsql {sql} {
                     25: 
                     26:     set rc SQLITE_LOCKED
                     27:     while {$rc eq "SQLITE_LOCKED" 
                     28:         || $rc eq "SQLITE_BUSY" 
                     29:         || $rc eq "SQLITE_SCHEMA"} {
                     30:       set res [list]
                     31: 
                     32:       enter_db_mutex $::DB
                     33:       set err [catch {
                     34:         set ::STMT [sqlite3_prepare_v2 $::DB $sql -1 dummy_tail]
                     35:       } msg]
                     36: 
                     37:       if {$err == 0} {
                     38:         while {[set rc [sqlite3_step $::STMT]] eq "SQLITE_ROW"} {
                     39:           for {set i 0} {$i < [sqlite3_column_count $::STMT]} {incr i} {
                     40:             lappend res [sqlite3_column_text $::STMT 0]
                     41:           }
                     42:         }
                     43:         set rc [sqlite3_finalize $::STMT]
                     44:       } else {
                     45:         if {[lindex $msg 0]=="(6)"} {
                     46:           set rc SQLITE_LOCKED
                     47:         } else {
                     48:           set rc SQLITE_ERROR
                     49:         }
                     50:       }
                     51: 
                     52:       if {[string first locked [sqlite3_errmsg $::DB]]>=0} {
                     53:         set rc SQLITE_LOCKED
                     54:       }
                     55:       if {$rc ne "SQLITE_OK"} {
                     56:         set errtxt "$rc - [sqlite3_errmsg $::DB] (debug1)"
                     57:       }
                     58:       leave_db_mutex $::DB
                     59: 
                     60:       if {$rc eq "SQLITE_LOCKED" || $rc eq "SQLITE_BUSY"} {
                     61:         #sqlthread parent "puts \"thread [sqlthread id] is busy.  rc=$rc\""
                     62:         after 200
                     63:       } else {
                     64:         #sqlthread parent "puts \"thread [sqlthread id] ran $sql\""
                     65:       }
                     66:     }
                     67: 
                     68:     if {$rc ne "SQLITE_OK"} {
                     69:       error $errtxt
                     70:     }
                     71:     set res
                     72:   }
                     73: 
                     74:   proc do_test {name script result} {
                     75:     set res [eval $script]
                     76:     if {$res ne $result} {
                     77:       error "$name failed: expected \"$result\" got \"$res\""
                     78:     }
                     79:   }
                     80: }
                     81: 
                     82: proc thread_spawn {varname args} {
                     83:   sqlthread spawn $varname [join $args {;}]
                     84: }
                     85: 
                     86: # Return true if this build can run the multi-threaded tests.
                     87: #
                     88: proc run_thread_tests {{print_warning 0}} {
                     89:   ifcapable !mutex { 
                     90:     set zProblem "SQLite build is not threadsafe"
                     91:   }
                     92:   ifcapable mutex_noop { 
                     93:     set zProblem "SQLite build uses SQLITE_MUTEX_NOOP"
                     94:   }
                     95:   if {[info commands sqlthread] eq ""} {
                     96:     set zProblem "SQLite build is not threadsafe"
                     97:   }
                     98:   if {![info exists ::tcl_platform(threaded)]} {
                     99:     set zProblem "Linked against a non-threadsafe Tcl build"
                    100:   }
                    101:   if {[info exists zProblem]} {
                    102:     puts "WARNING: Multi-threaded tests skipped: $zProblem"
                    103:     return 0
                    104:   }
                    105:   set ::run_thread_tests_called 1
                    106:   return 1;
                    107: }
                    108: 
                    109: return 0
                    110: 

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