[odb-users] Mutex may not be released Re: It was blocked by odb::sqlite::connection_pool_factory::create()

Boris Kolpackov boris at codesynthesis.com
Tue Jun 25 06:39:52 EDT 2024


Sunny Sun <sunny.sun at ringcentral.com> writes:

> We encountered a problem that was the thread was blocked by
> odb::sqlite::connection_pool_factory::create().
> 
> We created a new db file with odb::sqlite::database, then we call
> db->schema_version() which will call
> odb::sqlite::connection_pool_factory::create().

Are you sure it is connection_pool_factory::create() that is blocking
and not connection_pool_factory::connect()?

connection_pool_factory::create() essentially calls sqlite3_open_v2()
and then executes a couple of PRAGMA statements, which I don't see how
they can block, at least not at the ODB level. Perhaps the file is locked
on the filesystem level or some such?


> I noticed the following code snippet:
> 
> signal ()
>     {
> 
> 
> 
>       if (waiters_ > signals_)
>       {
>         if (signals_++ == 0)
>         {
>           if (SetEvent (event_) == 0)
>             throw win32_exception ();
>         }
>       }
> 
> 
>       mutex_.unlock ();
>     }
> 
> 
> If it throw win32_exception(), it will not unlock mutex.

If the Win32 SetEvent() function fails, it means there is something
fundamentally broken with synchronization primitives in the process
and whether you unlock a mutex or not doesn't really matter.

Are you observing this exception being thrown in your case?

Also, I don't see how it is connected to the create() function
above. Can you explain how this code is relevant to the problem
at hand?



More information about the odb-users mailing list