Hi, Teg,

On Mon, Jan 25, 2016 at 4:51 PM, Teg <Teg at djii.com> wrote:
> Hello Igor,
>
> Then  I'd  note  the address of the object (make a copy of the pointer
> right  as  it's  allocated)  and  then  verify that the address you're
> deleting  is  the same as the address that was allocated.  I've verify
> that the correct calling convention is being used throughout too.

Yes, pointers (addresses) are the same.

>
>
> I'd single step into the destructor and see what's actually happening to
> make  it  crash. I'd pay attention to the "this" pointer and see if it
> makes sense.
>
> Assuming you're using visual studio and have the source to the wrapper
> if  should be easy to simply step in and see exactly what line of code
> makes it crash.

Yes, MSVC 2010 and the code is mine. ;-)

Thank you.
>
> C
>
>
> Monday, January 25, 2016, 1:00:53 PM, you wrote:
>
> IK> Hi, Teg,
>
> IK> 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.
>
> IK> Does not make a difference.
> IK> I added that function and call it from the MainFrame destructor.
>
> IK> It still crashed.
>
> IK> 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
>>>
>
>
>
> --
>  Teg                            mailto:Teg at djii.com
>

Reply via email to