xref: /sqlite-3.40.0/test/mutex1.test (revision 1e32bed3)
11a9ed0b2Sdanielk1977# 2008 June 17
21a9ed0b2Sdanielk1977#
31a9ed0b2Sdanielk1977# The author disclaims copyright to this source code.  In place of
41a9ed0b2Sdanielk1977# a legal notice, here is a blessing:
51a9ed0b2Sdanielk1977#
61a9ed0b2Sdanielk1977#    May you do good and not evil.
71a9ed0b2Sdanielk1977#    May you find forgiveness for yourself and forgive others.
81a9ed0b2Sdanielk1977#    May you share freely, never taking more than you give.
91a9ed0b2Sdanielk1977#
101a9ed0b2Sdanielk1977#***********************************************************************
111a9ed0b2Sdanielk1977#
12a3f06598Sdanielk1977# $Id: mutex1.test,v 1.20 2009/04/23 14:58:40 danielk1977 Exp $
131a9ed0b2Sdanielk1977
141a9ed0b2Sdanielk1977set testdir [file dirname $argv0]
151a9ed0b2Sdanielk1977source $testdir/tester.tcl
16185eac95Sdanielk1977
1718472fa7Sdrhifcapable !mutex {
1818472fa7Sdrh  finish_test
1918472fa7Sdrh  return
2018472fa7Sdrh}
21185eac95Sdanielk1977if {[info exists tester_do_binarylog]} {
22185eac95Sdanielk1977  finish_test
23185eac95Sdanielk1977  return
24185eac95Sdanielk1977}
25185eac95Sdanielk1977
2655b0cf00Sdrhsqlite3_reset_auto_extension
275807c4ccSdrhclear_mutex_counters
281a9ed0b2Sdanielk1977
291a9ed0b2Sdanielk1977proc mutex_counters {varname} {
301a9ed0b2Sdanielk1977  upvar $varname var
311a9ed0b2Sdanielk1977  set var(total) 0
321a9ed0b2Sdanielk1977  foreach {name value} [read_mutex_counters] {
331a9ed0b2Sdanielk1977    set var($name) $value
341a9ed0b2Sdanielk1977    incr var(total) $value
351a9ed0b2Sdanielk1977  }
361a9ed0b2Sdanielk1977}
371a9ed0b2Sdanielk1977
381a9ed0b2Sdanielk1977#-------------------------------------------------------------------------
391a9ed0b2Sdanielk1977# Tests mutex1-1.* test that sqlite3_config() returns SQLITE_MISUSE if
401a9ed0b2Sdanielk1977# is called at the wrong time. And that the first time sqlite3_initialize
41*1e32bed3Sdrh# is called it obtains the 'static_main' mutex 3 times and a recursive
4271bc31c6Sdanielk1977# mutex (sqlite3Config.pInitMutex) twice. Subsequent calls are no-ops
4371bc31c6Sdanielk1977# that do not require any mutexes.
441a9ed0b2Sdanielk1977#
451a9ed0b2Sdanielk1977do_test mutex1-1.0 {
461a9ed0b2Sdanielk1977  install_mutex_counters 1
471a9ed0b2Sdanielk1977} {SQLITE_MISUSE}
481a9ed0b2Sdanielk1977
491a9ed0b2Sdanielk1977do_test mutex1-1.1 {
501a9ed0b2Sdanielk1977  db close
511a9ed0b2Sdanielk1977  install_mutex_counters 1
521a9ed0b2Sdanielk1977} {SQLITE_MISUSE}
531a9ed0b2Sdanielk1977
541a9ed0b2Sdanielk1977do_test mutex1-1.2 {
551a9ed0b2Sdanielk1977  sqlite3_shutdown
561a9ed0b2Sdanielk1977  install_mutex_counters 1
571a9ed0b2Sdanielk1977} {SQLITE_OK}
581a9ed0b2Sdanielk1977
591a9ed0b2Sdanielk1977do_test mutex1-1.3 {
601a9ed0b2Sdanielk1977  install_mutex_counters 0
611a9ed0b2Sdanielk1977} {SQLITE_OK}
621a9ed0b2Sdanielk1977
631a9ed0b2Sdanielk1977do_test mutex1-1.4 {
641a9ed0b2Sdanielk1977  install_mutex_counters 1
651a9ed0b2Sdanielk1977} {SQLITE_OK}
661a9ed0b2Sdanielk1977
671a9ed0b2Sdanielk1977do_test mutex1-1.5 {
681a9ed0b2Sdanielk1977  mutex_counters counters
691a9ed0b2Sdanielk1977  set counters(total)
701a9ed0b2Sdanielk1977} {0}
711a9ed0b2Sdanielk1977
721a9ed0b2Sdanielk1977do_test mutex1-1.6 {
731a9ed0b2Sdanielk1977  sqlite3_initialize
741a9ed0b2Sdanielk1977} {SQLITE_OK}
751a9ed0b2Sdanielk1977
761a9ed0b2Sdanielk1977do_test mutex1-1.7 {
771a9ed0b2Sdanielk1977  mutex_counters counters
78*1e32bed3Sdrh  # list $counters(total) $counters(static_main)
79e339d65aSdanielk1977  expr {$counters(total)>0}
80e339d65aSdanielk1977} {1}
811a9ed0b2Sdanielk1977
821a9ed0b2Sdanielk1977do_test mutex1-1.8 {
831a9ed0b2Sdanielk1977  clear_mutex_counters
841a9ed0b2Sdanielk1977  sqlite3_initialize
851a9ed0b2Sdanielk1977} {SQLITE_OK}
861a9ed0b2Sdanielk1977
871a9ed0b2Sdanielk1977do_test mutex1-1.9 {
881a9ed0b2Sdanielk1977  mutex_counters counters
89*1e32bed3Sdrh  list $counters(total) $counters(static_main)
901a9ed0b2Sdanielk1977} {0 0}
911a9ed0b2Sdanielk1977
9259f8c08eSdanielk1977#-------------------------------------------------------------------------
9359f8c08eSdanielk1977# Tests mutex1-2.* test the three thread-safety related modes that
9459f8c08eSdanielk1977# can be selected using sqlite3_config:
9559f8c08eSdanielk1977#
9659f8c08eSdanielk1977#   * Serialized mode,
9759f8c08eSdanielk1977#   * Multi-threaded mode,
9859f8c08eSdanielk1977#   * Single-threaded mode.
9959f8c08eSdanielk1977#
100b99185f2Sdrhifcapable threadsafe1&&shared_cache {
101c8d75674Sdrh  set enable_shared_cache [sqlite3_enable_shared_cache 1]
10259f8c08eSdanielk1977  foreach {mode mutexes} {
10359f8c08eSdanielk1977    singlethread {}
1046d4fb833Sdan    multithread  {
10528ae577aSmistachkin      fast static_app1 static_app2 static_app3
106*1e32bed3Sdrh      static_lru static_main static_mem static_open
10728ae577aSmistachkin      static_prng static_pmem static_vfs1 static_vfs2
10828ae577aSmistachkin      static_vfs3
1096d4fb833Sdan    }
1106d4fb833Sdan    serialized  {
11128ae577aSmistachkin      fast recursive static_app1 static_app2
112*1e32bed3Sdrh      static_app3 static_lru static_main static_mem
11328ae577aSmistachkin      static_open static_prng static_pmem static_vfs1
11428ae577aSmistachkin      static_vfs2 static_vfs3
1156d4fb833Sdan    }
11659f8c08eSdanielk1977  } {
117c8d75674Sdrh
11859f8c08eSdanielk1977    do_test mutex1.2.$mode.1 {
11959f8c08eSdanielk1977      catch {db close}
12059f8c08eSdanielk1977      sqlite3_shutdown
12159f8c08eSdanielk1977      sqlite3_config $mode
12259f8c08eSdanielk1977    } SQLITE_OK
12359f8c08eSdanielk1977
12459f8c08eSdanielk1977    do_test mutex1.2.$mode.2 {
12571bc31c6Sdanielk1977      sqlite3_initialize
12659f8c08eSdanielk1977      clear_mutex_counters
127d9da78a2Sdrh      sqlite3 db test.db -nomutex 0 -fullmutex 0
12859f8c08eSdanielk1977      catchsql { CREATE TABLE abc(a, b, c) }
12959f8c08eSdanielk1977      db eval {
13059f8c08eSdanielk1977        INSERT INTO abc VALUES(1, 2, 3);
13159f8c08eSdanielk1977      }
13259f8c08eSdanielk1977    } {}
133986d3b95Sdrh    ifcapable !memorymanage {
134986d3b95Sdrh      regsub { static_lru} $mutexes {} mutexes
135986d3b95Sdrh    }
13628ae577aSmistachkin    if {$mode ne "singlethread"} {
13759f8c08eSdanielk1977      do_test mutex1.2.$mode.3 {
13828ae577aSmistachkin        #
13928ae577aSmistachkin        # NOTE: Make sure all the app and vfs mutexes get used.
14028ae577aSmistachkin        #
14128ae577aSmistachkin        enter_static_mutex static_app1
14228ae577aSmistachkin        leave_static_mutex static_app1
14328ae577aSmistachkin        enter_static_mutex static_app2
14428ae577aSmistachkin        leave_static_mutex static_app2
14528ae577aSmistachkin        enter_static_mutex static_app3
14628ae577aSmistachkin        leave_static_mutex static_app3
14728ae577aSmistachkin        enter_static_mutex static_vfs1
14828ae577aSmistachkin        leave_static_mutex static_vfs1
14928ae577aSmistachkin        enter_static_mutex static_vfs2
15028ae577aSmistachkin        leave_static_mutex static_vfs2
15128ae577aSmistachkin        enter_static_mutex static_vfs3
15228ae577aSmistachkin        leave_static_mutex static_vfs3
15328ae577aSmistachkin      } {}
15428ae577aSmistachkin    }
15528ae577aSmistachkin    do_test mutex1.2.$mode.4 {
15659f8c08eSdanielk1977      mutex_counters counters
15759f8c08eSdanielk1977
15859f8c08eSdanielk1977      set res [list]
15959f8c08eSdanielk1977      foreach {key value} [array get counters] {
16059f8c08eSdanielk1977        if {$key ne "total" && $value > 0} {
16159f8c08eSdanielk1977          lappend res $key
16259f8c08eSdanielk1977        }
16359f8c08eSdanielk1977      }
16459f8c08eSdanielk1977      lsort $res
165c8d75674Sdrh    } [lsort $mutexes]
16659f8c08eSdanielk1977  }
167c8d75674Sdrh  sqlite3_enable_shared_cache $enable_shared_cache
1681a9ed0b2Sdanielk1977
1699a6284c1Sdanielk1977  # Open and use a connection in "nomutex" mode. Test that no recursive
1709a6284c1Sdanielk1977  # mutexes are obtained.
1719a6284c1Sdanielk1977  do_test mutex1.3.1 {
1729a6284c1Sdanielk1977    catch {db close}
1739a6284c1Sdanielk1977    clear_mutex_counters
1749a6284c1Sdanielk1977    sqlite3 db test.db -nomutex 1
1759a6284c1Sdanielk1977    execsql { SELECT * FROM abc }
1769a6284c1Sdanielk1977  } {1 2 3 1 2 3 1 2 3}
1779a6284c1Sdanielk1977  do_test mutex1.3.2 {
1789a6284c1Sdanielk1977    mutex_counters counters
1799a6284c1Sdanielk1977    set counters(recursive)
1809a6284c1Sdanielk1977  } {0}
18185e9e22bSdrh}
1829a6284c1Sdanielk1977
1835f6d0268Sdanielk1977# Test the sqlite3_db_mutex() function.
1845f6d0268Sdanielk1977#
1855f6d0268Sdanielk1977do_test mutex1.4.1 {
1865f6d0268Sdanielk1977  catch {db close}
1875f6d0268Sdanielk1977  sqlite3 db test.db
1885f6d0268Sdanielk1977  enter_db_mutex db
1895f6d0268Sdanielk1977  db eval {SELECT 1, 2, 3}
1905f6d0268Sdanielk1977} {1 2 3}
1915f6d0268Sdanielk1977do_test mutex1.4.2 {
1925f6d0268Sdanielk1977  leave_db_mutex db
1935f6d0268Sdanielk1977  db eval {SELECT 1, 2, 3}
1945f6d0268Sdanielk1977} {1 2 3}
1955f6d0268Sdanielk1977do_test mutex1.4.3 {
1965f6d0268Sdanielk1977  catch {db close}
1975f6d0268Sdanielk1977  sqlite3 db test.db -nomutex 1
1985f6d0268Sdanielk1977  enter_db_mutex db
1995f6d0268Sdanielk1977  db eval {SELECT 1, 2, 3}
2005f6d0268Sdanielk1977} {1 2 3}
2015f6d0268Sdanielk1977do_test mutex1.4.4 {
2025f6d0268Sdanielk1977  leave_db_mutex db
2035f6d0268Sdanielk1977  db eval {SELECT 1, 2, 3}
2045f6d0268Sdanielk1977} {1 2 3}
2055f6d0268Sdanielk1977
2061a9ed0b2Sdanielk1977do_test mutex1-X {
20701bf2996Sdanielk1977  catch {db close}
2081a9ed0b2Sdanielk1977  sqlite3_shutdown
2091a9ed0b2Sdanielk1977  clear_mutex_counters
2101a9ed0b2Sdanielk1977  install_mutex_counters 0
21101bf2996Sdanielk1977  sqlite3_initialize
2121a9ed0b2Sdanielk1977} {SQLITE_OK}
2131a9ed0b2Sdanielk1977
21455b0cf00Sdrhautoinstall_test_functions
2151a9ed0b2Sdanielk1977finish_test
216