gitlab.com/CoiaPrant/sqlite3@v1.19.1/testdata/tcl/mutex1.test (about)

     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.20 2009/04/23 14:58:40 danielk1977 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_main' 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_main)
    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_main)
    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 threadsafe1&&shared_cache {
   101    set enable_shared_cache [sqlite3_enable_shared_cache 1]
   102    foreach {mode mutexes} {
   103      singlethread {}
   104      multithread  {
   105        fast static_app1 static_app2 static_app3
   106        static_lru static_main static_mem static_open
   107        static_prng static_pmem static_vfs1 static_vfs2
   108        static_vfs3
   109      }
   110      serialized  {
   111        fast recursive static_app1 static_app2
   112        static_app3 static_lru static_main static_mem
   113        static_open static_prng static_pmem static_vfs1
   114        static_vfs2 static_vfs3
   115      }
   116    } {
   117  
   118      do_test mutex1.2.$mode.1 {
   119        catch {db close}
   120        sqlite3_shutdown
   121        sqlite3_config $mode
   122      } SQLITE_OK
   123  
   124      do_test mutex1.2.$mode.2 {
   125        sqlite3_initialize
   126        clear_mutex_counters
   127        sqlite3 db test.db -nomutex 0 -fullmutex 0
   128        catchsql { CREATE TABLE abc(a, b, c) }
   129        db eval {
   130          INSERT INTO abc VALUES(1, 2, 3);
   131        }
   132      } {}
   133      ifcapable !memorymanage {
   134        regsub { static_lru} $mutexes {} mutexes
   135      }
   136      if {$mode ne "singlethread"} {
   137        do_test mutex1.2.$mode.3 {
   138          #
   139          # NOTE: Make sure all the app and vfs mutexes get used.
   140          #
   141          enter_static_mutex static_app1
   142          leave_static_mutex static_app1
   143          enter_static_mutex static_app2
   144          leave_static_mutex static_app2
   145          enter_static_mutex static_app3
   146          leave_static_mutex static_app3
   147          enter_static_mutex static_vfs1
   148          leave_static_mutex static_vfs1
   149          enter_static_mutex static_vfs2
   150          leave_static_mutex static_vfs2
   151          enter_static_mutex static_vfs3
   152          leave_static_mutex static_vfs3
   153        } {}
   154      }
   155      do_test mutex1.2.$mode.4 {
   156        mutex_counters counters
   157  
   158        set res [list]
   159        foreach {key value} [array get counters] {
   160          if {$key ne "total" && $value > 0} {
   161            lappend res $key
   162          }
   163        }
   164        lsort $res
   165      } [lsort $mutexes]
   166    }
   167    sqlite3_enable_shared_cache $enable_shared_cache
   168  
   169    # Open and use a connection in "nomutex" mode. Test that no recursive
   170    # mutexes are obtained.
   171    do_test mutex1.3.1 {
   172      catch {db close}
   173      clear_mutex_counters
   174      sqlite3 db test.db -nomutex 1
   175      execsql { SELECT * FROM abc }
   176    } {1 2 3 1 2 3 1 2 3}
   177    do_test mutex1.3.2 {
   178      mutex_counters counters
   179      set counters(recursive)
   180    } {0}
   181  }
   182  
   183  # Test the sqlite3_db_mutex() function.
   184  #
   185  do_test mutex1.4.1 {
   186    catch {db close}
   187    sqlite3 db test.db
   188    enter_db_mutex db
   189    db eval {SELECT 1, 2, 3}
   190  } {1 2 3}
   191  do_test mutex1.4.2 {
   192    leave_db_mutex db
   193    db eval {SELECT 1, 2, 3}
   194  } {1 2 3}
   195  do_test mutex1.4.3 {
   196    catch {db close}
   197    sqlite3 db test.db -nomutex 1
   198    enter_db_mutex db
   199    db eval {SELECT 1, 2, 3}
   200  } {1 2 3}
   201  do_test mutex1.4.4 {
   202    leave_db_mutex db
   203    db eval {SELECT 1, 2, 3}
   204  } {1 2 3}
   205  
   206  do_test mutex1-X {
   207    catch {db close}
   208    sqlite3_shutdown
   209    clear_mutex_counters
   210    install_mutex_counters 0
   211    sqlite3_initialize
   212  } {SQLITE_OK}
   213  
   214  autoinstall_test_functions
   215  finish_test