SQLite Forum

SQLIte 3.37.0 breaks SQLITE_OPEN_NOMUTEX - TSAN failure
Login
Switching from SQLITE 3.36.0 to 3.37.0 on UNIX with TSAN produces race errors.

— it appears each connection is locking its own mutex when accessing COMMON data structures (shared between threads).

- From the TSAN report, the issue appears to be:

  Read of size 4 at 0x55c2f79772f8 by thread T4 (mutexes: write M509514):#0 sqlite3VdbeExec /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/IntermediateFiles/g++-debug-sanitize_thread/ThirdPartyComponents/sqlite/sqlite3.c:88607 (Test36+0x492c1b1)

  withPrevious write of size 4 at 0x55c2f79772f8 by thread T3 (mutexes: write M508861):#0 sqlite3WritableSchema /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/IntermediateFiles/g++-debug-sanitize_thread/ThirdPartyComponents/sqlite/sqlite3.c:114046 (Test36+0x4a111a5)


The conflict appears as follows:testcase( pIn1->flags & MEM_Int );  // READ IN ONE THREAD

after write:testcase( (db->flags&(SQLITE_WriteSchema|SQLITE_Defensive))==0 ); IN ANOTHER THREAD

NOTE - there ARE MUTEX locks used. But each thread has its own mutex, and TSAN correctly reports this as a (likely) thread bug, that no single mutex is used to protect this data structure.

NOTE WORKAROUNDS INCLUDE:
  > reverting to earlier version of sqlite
  > Using SQLITE_OPEN_FULLMUTEX instead of SQLITE_OPEN_NOMUTEX


---- TSAN FAILURE BELOW:

—

~~~
[Succeeded]  (1  seconds)  [34]  Foundation::DataExchange::XML::SaxParser  (TSAN_OPTIONS=suppressions=/home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64//Tests/ThreadSanitizerSuppressions.supp ../Builds/g++-debug-sanitize_thread/Tests/Test34)[Succeeded]  (17 seconds)  [35]  Foundation::DataExchange::Other  (TSAN_OPTIONS=suppressions=/home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64//Tests/ThreadSanitizerSuppressions.supp ../Builds/g++-debug-sanitize_thread/Tests/Test35)==================WARNING: ThreadSanitizer: data race (pid=2108449)Read of size 4 at 0x55c2f79772f8 by thread T4 (mutexes: write M509514):#0 sqlite3VdbeExec /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/IntermediateFiles/g++-debug-sanitize_thread/ThirdPartyComponents/sqlite/sqlite3.c:88607 (Test36+0x492c1b1)#1 sqlite3Step /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/IntermediateFiles/g++-debug-sanitize_thread/ThirdPartyComponents/sqlite/sqlite3.c:85145 (Test36+0x4910021)#2 sqlite3_step /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/IntermediateFiles/g++-debug-sanitize_thread/ThirdPartyComponents/sqlite/sqlite3.c:85202 (Test36+0x4910d5b)#3 Stroika::Foundation::Database::SQL::SQLite::Statement::MyRep_::GetNextRow() <null> (Test36+0x2cbcdf8)#4 Stroika::Foundation::Database::SQL::Statement::GetNextRow() /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/Library/Sources/Stroika/Foundation/Database/SQL/Statement.inl:61 (Test36+0x2989550)#5 Stroika::Foundation::Database::SQL::Statement::GetAllRemainingRows() /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/Library/Sources/Stroika/Foundation/Database/SQL/Statement.cpp:69 (Test36+0x2d13fd2)#6 Stroika::Foundation::Database::SQL::Statement::GetAllRows() <null> (Test36+0x2989a6e)#7 GetAll /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/Library/Sources/Stroika/Foundation/Database/SQL/ORM/TableConnection.inl:78 (Test36+0x291da3a)#8 PeriodicallyWriteChecksForEmployeesTable_ /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/Tests/36/Test.cpp:720 (Test36+0x2918bc3)#9 operator() /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/Tests/36/Test.cpp:744 (Test36+0x291936e)#10 _M_invoke /usr/include/c++/8/bits/std_function.h:297 (Test36+0x292cea4)#11 std::function<void ()>::operator()() const /usr/include/c++/8/bits/std_function.h:687 (Test36+0x319cb2c)#12 Stroika::Foundation::Execution::Thread::Ptr::Rep_::Run_() /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/Library/Sources/Stroika/Foundation/Execution/Thread.cpp:366 (Test36+0x3185e08)#13 Stroika::Foundation::Execution::Thread::Ptr::Rep_::ThreadMain_(std::shared_ptr<Stroika::Foundation::Execution::Thread::Ptr::Rep_> const*) /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/Library/Sources/Stroika/Foundation/Execution/Thread.cpp:659 (Test36+0x3187ca8)#14 operator() /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/Library/Sources/Stroika/Foundation/Execution/Thread.cpp:328 (Test36+0x31853a7)#15 _invoke_impl<void, Stroika::Foundation::Execution::Thread::Ptr::Rep::DoCreate(const std::shared_ptr<Stroika::Foundation::Execution::Thread::Ptr::Rep_>*)::<lambda()> > /usr/include/c++/8/bits/invoke.h:60 (Test36+0x31909fe)#16 _invoke<Stroika::Foundation::Execution::Thread::Ptr::Rep::DoCreate(const std::shared_ptr<Stroika::Foundation::Execution::Thread::Ptr::Rep_>*)::<lambda()> > /usr/include/c++/8/bits/invoke.h:95 (Test36+0x318ef2b)#17 _M_invoke<0> /usr/include/c++/8/thread:244 (Test36+0x3194a51)#18 operator() /usr/include/c++/8/thread:253 (Test36+0x3194969)#19 _M_run /usr/include/c++/8/thread:196 (Test36+0x31948fe)#20 execute_native_thread_routine <null> (Test36+0x3784f6e)

Previous write of size 4 at 0x55c2f79772f8 by thread T3 (mutexes: write M508861):#0 sqlite3WritableSchema /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/IntermediateFiles/g++-debug-sanitize_thread/ThirdPartyComponents/sqlite/sqlite3.c:114046 (Test36+0x4a111a5)#1 lockBtree /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/IntermediateFiles/g++-debug-sanitize_thread/ThirdPartyComponents/sqlite/sqlite3.c:68788 (Test36+0x48755bd)#2 sqlite3BtreeBeginTrans /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/IntermediateFiles/g++-debug-sanitize_thread/ThirdPartyComponents/sqlite/sqlite3.c:69061 (Test36+0x4877ff5)#3 sqlite3VdbeExec /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/IntermediateFiles/g++-debug-sanitize_thread/ThirdPartyComponents/sqlite/sqlite3.c:90380 (Test36+0x493ff9b)#4 sqlite3Step /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/IntermediateFiles/g++-debug-sanitize_thread/ThirdPartyComponents/sqlite/sqlite3.c:85145 (Test36+0x4910021)#5 sqlite3_step /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/IntermediateFiles/g++-debug-sanitize_thread/ThirdPartyComponents/sqlite/sqlite3.c:85202 (Test36+0x4910d5b)#6 Stroika::Foundation::Database::SQL::SQLite::Statement::MyRep_::GetNextRow() <null> (Test36+0x2cbcdf8)#7 Stroika::Foundation::Database::SQL::Statement::GetNextRow() /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/Library/Sources/Stroika/Foundation/Database/SQL/Statement.inl:61 (Test36+0x2989550)#8 Stroika::Foundation::Database::SQL::Statement::GetAllRemainingRows() /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/Library/Sources/Stroika/Foundation/Database/SQL/Statement.cpp:69 (Test36+0x2d13fd2)#9 Stroika::Foundation::Database::SQL::Statement::GetAllRows() <null> (Test36+0x2989a6e)#10 GetAll /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/Library/Sources/Stroika/Foundation/Database/SQL/ORM/TableConnection.inl:78 (Test36+0x291da3a)#11 PeriodicallyUpdateEmployeesTable_ /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/Tests/36/Test.cpp:689 (Test36+0x29182b0)#12 operator() /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/Tests/36/Test.cpp:743 (Test36+0x29191fe)#13 _M_invoke /usr/include/c++/8/bits/std_function.h:297 (Test36+0x292cbba)#14 std::function<void ()>::operator()() const /usr/include/c++/8/bits/std_function.h:687 (Test36+0x319cb2c)#15 Stroika::Foundation::Execution::Thread::Ptr::Rep_::Run_() /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/Library/Sources/Stroika/Foundation/Execution/Thread.cpp:366 (Test36+0x3185e08)#16 Stroika::Foundation::Execution::Thread::Ptr::Rep_::ThreadMain_(std::shared_ptr<Stroika::Foundation::Execution::Thread::Ptr::Rep_> const*) /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/Library/Sources/Stroika/Foundation/Execution/Thread.cpp:659 (Test36+0x3187ca8)#17 operator() /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/Library/Sources/Stroika/Foundation/Execution/Thread.cpp:328 (Test36+0x31853a7)#18 _invoke_impl<void, Stroika::Foundation::Execution::Thread::Ptr::Rep::DoCreate(const std::shared_ptr<Stroika::Foundation::Execution::Thread::Ptr::Rep_>*)::<lambda()> > /usr/include/c++/8/bits/invoke.h:60 (Test36+0x31909fe)#19 _invoke<Stroika::Foundation::Execution::Thread::Ptr::Rep::DoCreate(const std::shared_ptr<Stroika::Foundation::Execution::Thread::Ptr::Rep_>*)::<lambda()> > /usr/include/c++/8/bits/invoke.h:95 (Test36+0x318ef2b)#20 _M_invoke<0> /usr/include/c++/8/thread:244 (Test36+0x3194a51)#21 operator() /usr/include/c++/8/thread:253 (Test36+0x3194969)#22 _M_run /usr/include/c++/8/thread:196 (Test36+0x31948fe)#23 execute_native_thread_routine <null> (Test36+0x3784f6e)

Location is global 'sqlite3CoverageCounter' of size 4 at 0x55c2f79772f8 (Test36+0x0000083cb2f8)

Mutex M509514 (0x7b14000005a8) created at:#0 pthread_mutex_init <null> (Test36+0x2885c9d)#1 pthreadMutexAlloc /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/IntermediateFiles/g++-debug-sanitize_thread/ThirdPartyComponents/sqlite/sqlite3.c:27382 (Test36+0x47b3747)#2 sqlite3MutexAlloc /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/IntermediateFiles/g++-debug-sanitize_thread/ThirdPartyComponents/sqlite/sqlite3.c:26902 (Test36+0x47b271e)#3 sqlite3BtreeOpen /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/IntermediateFiles/g++-debug-sanitize_thread/ThirdPartyComponents/sqlite/sqlite3.c:68144 (Test36+0x48707b6)#4 openDatabase /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/IntermediateFiles/g++-debug-sanitize_thread/ThirdPartyComponents/sqlite/sqlite3.c:169926 (Test36+0x4bcb770)#5 sqlite3_open_v2 /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/IntermediateFiles/g++-debug-sanitize_thread/ThirdPartyComponents/sqlite/sqlite3.c:170049 (Test36+0x4bcc52b)#6 Stroika::Foundation::Database::SQL::SQLite::Connection::Rep_::Rep_(Stroika::Foundation::Database::SQL::SQLite::Options const&) /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/Library/Sources/Stroika/Foundation/Database/SQL/SQLite.cpp:203 (Test36+0x2cb3055)#7 void _gnu_cxx::new_allocator<Stroika::Foundation::Database::SQL::SQLite::Connection::Rep>::construct<Stroika::Foundation::Database::SQL::SQLite::Connection::Rep_, Stroika::Foundation::Database::SQL::SQLite::Options const&>(Stroika::Foundation::Database::SQL::SQLite::Connection::Rep_*, Stroika::Foundation::Database::SQL::SQLite::Options const&) /usr/include/c++/8/ext/new_allocator.h:136 (Test36+0x2ce1395)#8 void std::allocator_traits<std::allocator<Stroika::Foundation::Database::SQL::SQLite::Connection::Rep_> >::construct<Stroika::Foundation::Database::SQL::SQLite::Connection::Rep_, Stroika::Foundation::Database::SQL::SQLite::Options const&>(std::allocator<Stroika::Foundation::Database::SQL::SQLite::Connection::Rep_>&, Stroika::Foundation::Database::SQL::SQLite::Connection::Rep_*, Stroika::Foundation::Database::SQL::SQLite::Options const&) /usr/include/c++/8/bits/alloc_traits.h:475 (Test36+0x2cde617)#9 std::Sp_counted_ptr_inplace<Stroika::Foundation::Database::SQL::SQLite::Connection::Rep, std::allocator<Stroika::Foundation::Database::SQL::SQLite::Connection::Rep_>, (_gnu_cxx::_Lock_policy)2>::_Sp_counted_ptr_inplace<Stroika::Foundation::Database::SQL::SQLite::Options const&>(std::allocator<Stroika::Foundation::Database::SQL::SQLite::Connection::Rep>, Stroika::Foundation::Database::SQL::SQLite::Options const&) /usr/include/c++/8/bits/shared_ptr_base.h:545 (Test36+0x2cdb1a9)#10 std::_shared_count<(gnu_cxx::_Lock_policy)2>::shared_count<Stroika::Foundation::Database::SQL::SQLite::Connection::Rep, std::allocator<Stroika::Foundation::Database::SQL::SQLite::Connection::Rep_>, Stroika::Foundation::Database::SQL::SQLite::Options const&>(Stroika::Foundation::Database::SQL::SQLite::Connection::Rep_*&, std::Sp_alloc_shared_tag<std::allocator<Stroika::Foundation::Database::SQL::SQLite::Connection::Rep> >, Stroika::Foundation::Database::SQL::SQLite::Options const&) /usr/include/c++/8/bits/shared_ptr_base.h:677 (Test36+0x2cd67b1)#11 std::_shared_ptr<Stroika::Foundation::Database::SQL::SQLite::Connection::Rep, (_gnu_cxx::_Lock_policy)2>::shared_ptr<std::allocator<Stroika::Foundation::Database::SQL::SQLite::Connection::Rep>, Stroika::Foundation::Database::SQL::SQLite::Options const&>(std::Sp_alloc_shared_tag<std::allocator<Stroika::Foundation::Database::SQL::SQLite::Connection::Rep> >, Stroika::Foundation::Database::SQL::SQLite::Options const&) /usr/include/c++/8/bits/shared_ptr_base.h:1342 (Test36+0x2cd0ac3)#12 std::shared_ptr<Stroika::Foundation::Database::SQL::SQLite::Connection::Rep_>::shared_ptr<std::allocator<Stroika::Foundation::Database::SQL::SQLite::Connection::Rep_>, Stroika::Foundation::Database::SQL::SQLite::Options const&>(std::Sp_alloc_shared_tag<std::allocator<Stroika::Foundation::Database::SQL::SQLite::Connection::Rep> >, Stroika::Foundation::Database::SQL::SQLite::Options const&) /usr/include/c++/8/bits/shared_ptr.h:359 (Test36+0x2ccc4d5)#13 std::shared_ptr<Stroika::Foundation::Database::SQL::SQLite::Connection::Rep_> std::allocate_shared<Stroika::Foundation::Database::SQL::SQLite::Connection::Rep_, std::allocator<Stroika::Foundation::Database::SQL::SQLite::Connection::Rep_>, Stroika::Foundation::Database::SQL::SQLite::Options const&>(std::allocator<Stroika::Foundation::Database::SQL::SQLite::Connection::Rep_> const&, Stroika::Foundation::Database::SQL::SQLite::Options const&) <null> (Test36+0x2cc69a1)#14 std::shared_ptr<Stroika::Foundation::Database::SQL::SQLite::Connection::Rep_> std::make_shared<Stroika::Foundation::Database::SQL::SQLite::Connection::Rep_, Stroika::Foundation::Database::SQL::SQLite::Options const&>(Stroika::Foundation::Database::SQL::SQLite::Options const&) <null> (Test36+0x2cc1954)#15 Stroika::Foundation::Database::SQL::SQLite::Connection::New(Stroika::Foundation::Database::SQL::SQLite::Options const&) /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/Library/Sources/Stroika/Foundation/Database/SQL/SQLite.cpp:335 (Test36+0x2caa150)#16 SetupDB_ /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/Tests/36/Test.cpp:637 (Test36+0x291693f)#17 ThreadTest_ /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/Tests/36/Test.cpp:742 (Test36+0x29194dd)#18 DoIt /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/Tests/36/Test.cpp:758 (Test36+0x2919b98)#19 DoRegressionTests_ /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/Tests/36/Test.cpp:771 (Test36+0x2919c83)#20 Stroika::TestHarness::PrintPassOrFail(void (*)()) ../TestHarness/TestHarness.cpp:75 (Test36+0x2ba92f8)#21 main /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/Tests/36/Test.cpp:779 (Test36+0x2919cd1)

Mutex M508861 (0x7b1400000288) created at:#0 pthread_mutex_init <null> (Test36+0x2885c9d)#1 pthreadMutexAlloc /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/IntermediateFiles/g++-debug-sanitize_thread/ThirdPartyComponents/sqlite/sqlite3.c:27382 (Test36+0x47b3747)#2 sqlite3MutexAlloc /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/IntermediateFiles/g++-debug-sanitize_thread/ThirdPartyComponents/sqlite/sqlite3.c:26902 (Test36+0x47b271e)#3 sqlite3BtreeOpen /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/IntermediateFiles/g++-debug-sanitize_thread/ThirdPartyComponents/sqlite/sqlite3.c:68144 (Test36+0x48707b6)#4 openDatabase /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/IntermediateFiles/g++-debug-sanitize_thread/ThirdPartyComponents/sqlite/sqlite3.c:169926 (Test36+0x4bcb770)#5 sqlite3_open_v2 /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/IntermediateFiles/g++-debug-sanitize_thread/ThirdPartyComponents/sqlite/sqlite3.c:170049 (Test36+0x4bcc52b)#6 Stroika::Foundation::Database::SQL::SQLite::Connection::Rep_::Rep_(Stroika::Foundation::Database::SQL::SQLite::Options const&) /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/Library/Sources/Stroika/Foundation/Database/SQL/SQLite.cpp:209 (Test36+0x2cb37bd)#7 void _gnu_cxx::new_allocator<Stroika::Foundation::Database::SQL::SQLite::Connection::Rep>::construct<Stroika::Foundation::Database::SQL::SQLite::Connection::Rep_, Stroika::Foundation::Database::SQL::SQLite::Options const&>(Stroika::Foundation::Database::SQL::SQLite::Connection::Rep_*, Stroika::Foundation::Database::SQL::SQLite::Options const&) /usr/include/c++/8/ext/new_allocator.h:136 (Test36+0x2ce1395)#8 void std::allocator_traits<std::allocator<Stroika::Foundation::Database::SQL::SQLite::Connection::Rep_> >::construct<Stroika::Foundation::Database::SQL::SQLite::Connection::Rep_, Stroika::Foundation::Database::SQL::SQLite::Options const&>(std::allocator<Stroika::Foundation::Database::SQL::SQLite::Connection::Rep_>&, Stroika::Foundation::Database::SQL::SQLite::Connection::Rep_*, Stroika::Foundation::Database::SQL::SQLite::Options const&) /usr/include/c++/8/bits/alloc_traits.h:475 (Test36+0x2cde617)#9 std::Sp_counted_ptr_inplace<Stroika::Foundation::Database::SQL::SQLite::Connection::Rep, std::allocator<Stroika::Foundation::Database::SQL::SQLite::Connection::Rep_>, (_gnu_cxx::_Lock_policy)2>::_Sp_counted_ptr_inplace<Stroika::Foundation::Database::SQL::SQLite::Options const&>(std::allocator<Stroika::Foundation::Database::SQL::SQLite::Connection::Rep>, Stroika::Foundation::Database::SQL::SQLite::Options const&) /usr/include/c++/8/bits/shared_ptr_base.h:545 (Test36+0x2cdb1a9)#10 std::_shared_count<(gnu_cxx::_Lock_policy)2>::shared_count<Stroika::Foundation::Database::SQL::SQLite::Connection::Rep, std::allocator<Stroika::Foundation::Database::SQL::SQLite::Connection::Rep_>, Stroika::Foundation::Database::SQL::SQLite::Options const&>(Stroika::Foundation::Database::SQL::SQLite::Connection::Rep_*&, std::Sp_alloc_shared_tag<std::allocator<Stroika::Foundation::Database::SQL::SQLite::Connection::Rep> >, Stroika::Foundation::Database::SQL::SQLite::Options const&) /usr/include/c++/8/bits/shared_ptr_base.h:677 (Test36+0x2cd67b1)#11 std::_shared_ptr<Stroika::Foundation::Database::SQL::SQLite::Connection::Rep, (_gnu_cxx::_Lock_policy)2>::shared_ptr<std::allocator<Stroika::Foundation::Database::SQL::SQLite::Connection::Rep>, Stroika::Foundation::Database::SQL::SQLite::Options const&>(std::Sp_alloc_shared_tag<std::allocator<Stroika::Foundation::Database::SQL::SQLite::Connection::Rep> >, Stroika::Foundation::Database::SQL::SQLite::Options const&) /usr/include/c++/8/bits/shared_ptr_base.h:1342 (Test36+0x2cd0ac3)#12 std::shared_ptr<Stroika::Foundation::Database::SQL::SQLite::Connection::Rep_>::shared_ptr<std::allocator<Stroika::Foundation::Database::SQL::SQLite::Connection::Rep_>, Stroika::Foundation::Database::SQL::SQLite::Options const&>(std::Sp_alloc_shared_tag<std::allocator<Stroika::Foundation::Database::SQL::SQLite::Connection::Rep> >, Stroika::Foundation::Database::SQL::SQLite::Options const&) /usr/include/c++/8/bits/shared_ptr.h:359 (Test36+0x2ccc4d5)#13 std::shared_ptr<Stroika::Foundation::Database::SQL::SQLite::Connection::Rep_> std::allocate_shared<Stroika::Foundation::Database::SQL::SQLite::Connection::Rep_, std::allocator<Stroika::Foundation::Database::SQL::SQLite::Connection::Rep_>, Stroika::Foundation::Database::SQL::SQLite::Options const&>(std::allocator<Stroika::Foundation::Database::SQL::SQLite::Connection::Rep_> const&, Stroika::Foundation::Database::SQL::SQLite::Options const&) <null> (Test36+0x2cc69a1)#14 std::shared_ptr<Stroika::Foundation::Database::SQL::SQLite::Connection::Rep_> std::make_shared<Stroika::Foundation::Database::SQL::SQLite::Connection::Rep_, Stroika::Foundation::Database::SQL::SQLite::Options const&>(Stroika::Foundation::Database::SQL::SQLite::Options const&) <null> (Test36+0x2cc1954)#15 Stroika::Foundation::Database::SQL::SQLite::Connection::New(Stroika::Foundation::Database::SQL::SQLite::Options const&) /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/Library/Sources/Stroika/Foundation/Database/SQL/SQLite.cpp:335 (Test36+0x2caa150)#16 SetupDB_ /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/Tests/36/Test.cpp:637 (Test36+0x291693f)#17 ThreadTest_ /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/Tests/36/Test.cpp:741 (Test36+0x29194c4)#18 DoIt /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/Tests/36/Test.cpp:758 (Test36+0x2919b98)#19 DoRegressionTests_ /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/Tests/36/Test.cpp:771 (Test36+0x2919c83)#20 Stroika::TestHarness::PrintPassOrFail(void (*)()) ../TestHarness/TestHarness.cpp:75 (Test36+0x2ba92f8)#21 main /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/Tests/36/Test.cpp:779 (Test36+0x2919cd1)

Thread T4 'Write Checks' (tid=2108454, running) created by main thread at:#0 pthread_create <null> (Test36+0x28853de)#1 std::thread::_M_start_thread(std::unique_ptr<std::thread::_State, std::default_delete<std::thread::_State> >, void (*)()) <null> (Test36+0x3785224)#2 Stroika::Foundation::Execution::Thread::Ptr::Rep_::DoCreate(std::shared_ptr<Stroika::Foundation::Execution::Thread::Ptr::Rep_> const*) /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/Library/Sources/Stroika/Foundation/Execution/Thread.cpp:328 (Test36+0x318557f)#3 Stroika::Foundation::Execution::Thread::Ptr::Start() const /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/Library/Sources/Stroika/Foundation/Execution/Thread.cpp:880 (Test36+0x318ab86)#4 Stroika::Foundation::Execution::Thread::New(std::function<void ()> const&, Stroika::Foundation::Execution::Thread::AutoStartFlag, std::optional<Stroika::Foundation::Characters::String> const&, std::optional<Stroika::Foundation::Execution::Thread::Configuration> const&) /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/Library/Sources/Stroika/Foundation/Execution/Thread.inl:332 (Test36+0x298fd6f)#5 ThreadTest_ /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/Tests/36/Test.cpp:744 (Test36+0x2919712)#6 DoIt /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/Tests/36/Test.cpp:758 (Test36+0x2919b98)#7 DoRegressionTests_ /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/Tests/36/Test.cpp:771 (Test36+0x2919c83)#8 Stroika::TestHarness::PrintPassOrFail(void (*)()) ../TestHarness/TestHarness.cpp:75 (Test36+0x2ba92f8)#9 main /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/Tests/36/Test.cpp:779 (Test36+0x2919cd1)

Thread T3 'Update Employee' (tid=2108453, running) created by main thread at:#0 pthread_create <null> (Test36+0x28853de)#1 std::thread::_M_start_thread(std::unique_ptr<std::thread::_State, std::default_delete<std::thread::_State> >, void (*)()) <null> (Test36+0x3785224)#2 Stroika::Foundation::Execution::Thread::Ptr::Rep_::DoCreate(std::shared_ptr<Stroika::Foundation::Execution::Thread::Ptr::Rep_> const*) /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/Library/Sources/Stroika/Foundation/Execution/Thread.cpp:328 (Test36+0x318557f)#3 Stroika::Foundation::Execution::Thread::Ptr::Start() const /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/Library/Sources/Stroika/Foundation/Execution/Thread.cpp:880 (Test36+0x318ab86)#4 Stroika::Foundation::Execution::Thread::New(std::function<void ()> const&, Stroika::Foundation::Execution::Thread::AutoStartFlag, std::optional<Stroika::Foundation::Characters::String> const&, std::optional<Stroika::Foundation::Execution::Thread::Configuration> const&) /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/Library/Sources/Stroika/Foundation/Execution/Thread.inl:332 (Test36+0x298fd6f)#5 ThreadTest_ /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/Tests/36/Test.cpp:743 (Test36+0x29195cc)#6 DoIt /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/Tests/36/Test.cpp:758 (Test36+0x2919b98)#7 DoRegressionTests_ /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/Tests/36/Test.cpp:771 (Test36+0x2919c83)#8 Stroika::TestHarness::PrintPassOrFail(void (*)()) ../TestHarness/TestHarness.cpp:75 (Test36+0x2ba92f8)#9 main /home/lewis/Sandbox/Stroika-Build-Dir-Ubuntu1804_x86_64/Tests/36/Test.cpp:779 (Test36+0x2919cd1)

~~~