Hi, Teg,

On Mon, Jan 25, 2016 at 11:31 AM, Teg <Teg at djii.com> wrote:
> Hello Igor,
>
> MainFrame::~MainFrame()
> {
>     delete m_db;  // this is where the crash happens
> }
>
> I suspect you need to add a "Close" or destroy function to the DLL and
> pass the handle back to the DLL to let it get deleted in the DLL
> context and not in the context of the caller.

Does not make a difference.
I added that function and call it from the MainFrame destructor.

It still crashed.

Thank you.

>
>
> extern "C" __declspec(dllexport) void DestroyObject(Database *db)
> {
>       delete db;
> }
>
> It was my impression that each DLL got it's own heap so, memory
> allocated inside the DLL needs to be free'd inside the DLL. I use
> Sqlite in a static lib in my applications.
>
> I  treat  memory  allocated  in  DLL's as being owned by the DLL so, I
> typically  pass  it  back  to the DLL to be cleaned up.  It believe it
> depends  on what run time library you're using though. If you're using
> an RTL where all the DLL's end up using a DLL supplied allocator, this
> probably isn't an issue. I tend to dynamic load my DLL's so they don't
> all use the same allocator.
>
> C
>
>
>
> Monday, January 25, 2016, 11:16:57 AM, you wrote:
>
> IK> Hi, Peter,
>
> IK> On Mon, Jan 25, 2016 at 10:50 AM, Peter Aronson <pbaronson at att.net> 
> wrote:
>>> Igor,
>>>
>>> You can't safely pass a SQLite handle between different SQL DLLs that way if
>>> they're both built with their own copy of the amalgamation (or link to
>>> things built with different copies). SQLite uses a handful of global
>>> variables, but each DLL has its own copy of each of these global variables
>>> and they can and will have different values, which can mess things up.  I
>>> ran into a version of this problem when I tried to load a 2nd DLL built with
>>> its own copy of the sqlite3.c amalgamation.  I fixed that by exposing the
>>> SQLite3 entrypoints in the first DLL and linking the second DLL against it
>>> so there was only one copy of the amalgamation used for that SQLite3 handle.
>
> IK> The SQLite is built only once and with just one version of the code.
>
> IK> Consider following pseudo-code:
>
> IK> In DLL:
>
> IK> BOOL APIENTRY DLLMain()
> IK> {
> IK> }
>
> IK> extern "C" __declspec(dllexport) Database *CreateObject(Database *db)
> IK> {
> IK>     db = new SQLiteDatabase();
> IK>     db->Connect();
> IK>     return db;
> IK> }
>
> IK> In the main application:
>
> IK> mainframe.h:
>
> IK> class MainFrame
> IK> {
> IK> public:
> IK>      MainFrame();
> IK>      ~MainFrame();
> IK>      void ConnectToDb();
> IK> private:
> IK>      Database *m_db;
> IK> };
>
> IK> mainframe.cpp:
>
> IK> void MainFrame::ConnectToDb()
> IK> {
> IK>     Database *db = NULL;
> IK>     LoadLibrary();
> IK>     func = GetProcAddress();
> IK>     m_db = func( db );
> IK> }
>
> IK> MainFrame::~MainFrame()
> IK> {
> IK>     delete m_db;  // this is where the crash happens
> IK> }
>
> IK> The pointer address are the same in DLL and main application MainFrame 
> class.
> IK> And as I said the crash occurs when it tries to acquire the mutex lock.
>
> IK> Thank you.
>
>>>
>>> Peter
>>>
>>>
>>>
>>>
>>> On 1/24/2016 10:18 PM, Igor Korot wrote:
>>>>
>>>> Hi, ALL,
>>>> I have a strange problem.
>>>>
>>>> I am trying to use sqlite in my program. It has a main application and
>>>> couplef DLLs.
>>>>
>>>> I am getting the connection in one of the DLL, then the pointer is passed
>>>> up
>>>> to the main application.
>>>>
>>>> Upon exiting from the application I'm trying to close the connection and
>>>> delete all the memory.
>>>>
>>>> Unfortunately upon exiting the application it crashes inside
>>>> sqlite3_mutex_enter().
>>>> The comment above the function says:
>>>>
>>>> [quote]
>>>> /*
>>>> ** Obtain the mutex p. If some other thread already has the mutex, block
>>>> ** until it can be obtained.
>>>> */
>>>> [/quote]
>>>>
>>>> The DLL does not start any threads, in fact the application will be 1
>>>> thread only.
>>>> So is there some compile-time switch I should use to mitigate the issue?
>>>>
>>>> Moreover I don't understand why am I getting the assertion - there is no
>>>> MT
>>>> involved.
>>>>
>>>> Can someone shed some lights?
>>>>
>>>> Thank you.
>>>> _______________________________________________
>>>> sqlite-users mailing list
>>>> sqlite-users at mailinglists.sqlite.org
>>>> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
>>>>
>>>
>>> _______________________________________________
>>> sqlite-users mailing list
>>> sqlite-users at mailinglists.sqlite.org
>>> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
> IK> _______________________________________________
> IK> sqlite-users mailing list
> IK> sqlite-users at mailinglists.sqlite.org
> IK> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
>
>
>
> --
>  Teg                            mailto:Teg at djii.com
>

Reply via email to