File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / sqlite3 / test / mutex1.test
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 17:04:16 2012 UTC (12 years, 4 months ago) by misho
Branches: sqlite3, MAIN
CVS tags: v3_7_10, HEAD
sqlite3

    1: # 2008 June 17
    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: mutex1.test,v 1.1.1.1 2012/02/21 17:04:16 misho Exp $
   13: 
   14: set testdir [file dirname $argv0]
   15: source $testdir/tester.tcl
   16: 
   17: ifcapable !mutex {
   18:   finish_test
   19:   return
   20: }
   21: if {[info exists tester_do_binarylog]} {
   22:   finish_test
   23:   return
   24: }
   25: 
   26: sqlite3_reset_auto_extension
   27: clear_mutex_counters
   28: 
   29: proc mutex_counters {varname} {
   30:   upvar $varname var
   31:   set var(total) 0
   32:   foreach {name value} [read_mutex_counters] {
   33:     set var($name) $value
   34:     incr var(total) $value
   35:   }
   36: }
   37: 
   38: #-------------------------------------------------------------------------
   39: # Tests mutex1-1.* test that sqlite3_config() returns SQLITE_MISUSE if
   40: # is called at the wrong time. And that the first time sqlite3_initialize 
   41: # is called it obtains the 'static_master' mutex 3 times and a recursive
   42: # mutex (sqlite3Config.pInitMutex) twice. Subsequent calls are no-ops 
   43: # that do not require any mutexes.
   44: #
   45: do_test mutex1-1.0 {
   46:   install_mutex_counters 1
   47: } {SQLITE_MISUSE}
   48: 
   49: do_test mutex1-1.1 {
   50:   db close
   51:   install_mutex_counters 1
   52: } {SQLITE_MISUSE}
   53: 
   54: do_test mutex1-1.2 {
   55:   sqlite3_shutdown
   56:   install_mutex_counters 1
   57: } {SQLITE_OK}
   58: 
   59: do_test mutex1-1.3 {
   60:   install_mutex_counters 0
   61: } {SQLITE_OK}
   62: 
   63: do_test mutex1-1.4 {
   64:   install_mutex_counters 1
   65: } {SQLITE_OK}
   66: 
   67: do_test mutex1-1.5 {
   68:   mutex_counters counters
   69:   set counters(total)
   70: } {0}
   71: 
   72: do_test mutex1-1.6 {
   73:   sqlite3_initialize
   74: } {SQLITE_OK}
   75: 
   76: do_test mutex1-1.7 {
   77:   mutex_counters counters
   78:   # list $counters(total) $counters(static_master)
   79:   expr {$counters(total)>0}
   80: } {1}
   81: 
   82: do_test mutex1-1.8 {
   83:   clear_mutex_counters
   84:   sqlite3_initialize
   85: } {SQLITE_OK}
   86: 
   87: do_test mutex1-1.9 {
   88:   mutex_counters counters
   89:   list $counters(total) $counters(static_master)
   90: } {0 0}
   91: 
   92: #-------------------------------------------------------------------------
   93: # Tests mutex1-2.* test the three thread-safety related modes that
   94: # can be selected using sqlite3_config:
   95: #
   96: #   * Serialized mode,
   97: #   * Multi-threaded mode,
   98: #   * Single-threaded mode.
   99: #
  100: ifcapable threadsafe&&shared_cache {
  101:   set enable_shared_cache [sqlite3_enable_shared_cache 1]
  102:   foreach {mode mutexes} {
  103:     singlethread {}
  104:     multithread  {
  105:       fast static_lru static_master static_mem static_open static_prng 
  106:       static_pmem
  107:     }
  108:     serialized  {
  109:       fast recursive static_lru static_master static_mem static_open 
  110:       static_prng static_pmem
  111:     }
  112:   } {
  113: 
  114:     do_test mutex1.2.$mode.1 {
  115:       catch {db close}
  116:       sqlite3_shutdown
  117:       sqlite3_config $mode
  118:     } SQLITE_OK
  119: 
  120:     do_test mutex1.2.$mode.2 {
  121:       sqlite3_initialize
  122:       clear_mutex_counters
  123:       sqlite3 db test.db -nomutex 0 -fullmutex 0
  124:       catchsql { CREATE TABLE abc(a, b, c) }
  125:       db eval {
  126:         INSERT INTO abc VALUES(1, 2, 3);
  127:       }
  128:     } {}
  129:     ifcapable !memorymanage {
  130:       regsub { static_lru} $mutexes {} mutexes
  131:     }
  132:     do_test mutex1.2.$mode.3 {
  133:       mutex_counters counters
  134:   
  135:       set res [list]
  136:       foreach {key value} [array get counters] {
  137:         if {$key ne "total" && $value > 0} {
  138:           lappend res $key
  139:         }
  140:       }
  141:       lsort $res
  142:     } [lsort $mutexes]
  143:   }
  144:   sqlite3_enable_shared_cache $enable_shared_cache
  145: 
  146:   # Open and use a connection in "nomutex" mode. Test that no recursive
  147:   # mutexes are obtained.
  148:   do_test mutex1.3.1 {
  149:     catch {db close}
  150:     clear_mutex_counters
  151:     sqlite3 db test.db -nomutex 1
  152:     execsql { SELECT * FROM abc }
  153:   } {1 2 3 1 2 3 1 2 3}
  154:   do_test mutex1.3.2 {
  155:     mutex_counters counters
  156:     set counters(recursive)
  157:   } {0}
  158: }
  159: 
  160: # Test the sqlite3_db_mutex() function.
  161: #
  162: do_test mutex1.4.1 {
  163:   catch {db close}
  164:   sqlite3 db test.db
  165:   enter_db_mutex db
  166:   db eval {SELECT 1, 2, 3}
  167: } {1 2 3}
  168: do_test mutex1.4.2 {
  169:   leave_db_mutex db
  170:   db eval {SELECT 1, 2, 3}
  171: } {1 2 3}
  172: do_test mutex1.4.3 {
  173:   catch {db close}
  174:   sqlite3 db test.db -nomutex 1
  175:   enter_db_mutex db
  176:   db eval {SELECT 1, 2, 3}
  177: } {1 2 3}
  178: do_test mutex1.4.4 {
  179:   leave_db_mutex db
  180:   db eval {SELECT 1, 2, 3}
  181: } {1 2 3}
  182: 
  183: do_test mutex1-X {
  184:   catch {db close}
  185:   sqlite3_shutdown
  186:   clear_mutex_counters
  187:   install_mutex_counters 0
  188:   sqlite3_initialize
  189: } {SQLITE_OK}
  190: 
  191: autoinstall_test_functions
  192: finish_test

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