Hi Igor,
I don't think you understood what I was trying to get at.  Please
allow me to rephrase:  There isn't enough information about how things
are being cleaned up to point out a problem, only make general
suggestions about good practice.

This is why I was asking about where you would ensure you are properly
shutting down the database before deleting your wrapper.  I had
expected to see something of the form:


//private: sqlite3 *db;
BOOL SomeWrapperClass::Closedb()
{
    if(db==NULL){
        b_sqlite_db_open = false;//Ensure state variable of wrapper is correct
        return TRUE; // db wasn't open, so Closed is OK
    }

    int ret=sqlite3_close(db);
    if (ret==SQLITE_OK){
        db = NULL;
        b_sqlite_db_open = false;
        return TRUE;  //properly closed my db connection, no errors
    }
    return FALSE; //if we got here, there is an error; break-point hit
; What didn't get finalized? How did this happen?
}

I would have expect you to, before delete m_db to do something like
if(m_db != NULL) {
      if(!m_db->Closedb() ){ //assumes that queries have already been
finalized ;
          ;//error handle code, break point, how did we fail to close?
       }
delete m_db;
 }

or a method of your dll that is some exported DestroyObject(Database *db) ;

or at least tell us that you are ensuring sqlite_close is called via
the destructor of m_db;

While in C++ one may choose to not check if the thing being deleted is
NULL before doing it, it is a clutter/style thing. For debugging
purposes  finding out that the thing that should have been null isn't
as expected.  It can often lead to one saying "hey, that should have
got deleted already!... oh somehow  delete x instead of safe_delete(x)
got used so while it got deleted earlier and x should have been null
at this point"

Are you unit testing the trivial cases?
Create+Destroy
Create+Connect+Destroy
Create+Connect+DoBasicQuery+Destroy


regards,
Adam

On Mon, Jan 25, 2016 at 2:02 PM, Igor Korot <ikorot01 at gmail.com> wrote:
> Hi, Adam,
>
> On Mon, Jan 25, 2016 at 11:27 AM, Adam Devita <adevita at verifeye.com> wrote:
>> Where do you pass to the dll something that goes to sqlite3_close(db); ?
>> ( https://www.sqlite.org/c3ref/close.html )
>> When that happens, does m_db get set to NULL (or now refers to memory
>> that is now NULL)
>> Do you check for m_db == NULL before deleting it?
>
> SQLiteDatabase class is just a wrapper around the SQLite interface.
> The constructor is empty, but in the Connect() function of the class I call
>
> sqlite3_open().
>
> And here is the code that you are asking for:
>
> void MainFrame::ConnectToDb()
> {
>     Database *db = NULL;
>     LoadLibrary();
>     func = GetProcAddress();
>     m_db = func( db );
> }
>
> Also, in C++ delete'ing NULL is perfectly normal operation.
>
> Thank you.
>
>>
>> regards,
>> Adam DeVita
>>
>> On Mon, Jan 25, 2016 at 11:16 AM, Igor Korot <ikorot01 at gmail.com> wrote:
>>> Hi, Peter,
>>>
>>> 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.
>>>
>>> The SQLite is built only once and with just one version of the code.
>>>
>>> Consider following pseudo-code:
>>>
>>> In DLL:
>>>
>>> BOOL APIENTRY DLLMain()
>>> {
>>> }
>>>
>>> extern "C" __declspec(dllexport) Database *CreateObject(Database *db)
>>> {
>>>     db = new SQLiteDatabase();
>>>     db->Connect();
>>>     return db;
>>> }
>>>
>>> In the main application:
>>>
>>> mainframe.h:
>>>
>>> class MainFrame
>>> {
>>> public:
>>>      MainFrame();
>>>      ~MainFrame();
>>>      void ConnectToDb();
>>> private:
>>>      Database *m_db;
>>> };
>>>
>>> mainframe.cpp:
>>>
>>> void MainFrame::ConnectToDb()
>>> {
>>>     Database *db = NULL;
>>>     LoadLibrary();
>>>     func = GetProcAddress();
>>>     m_db = func( db );
>>> }
>>>
>>> MainFrame::~MainFrame()
>>> {
>>>     delete m_db;  // this is where the crash happens
>>> }
>>>
>>> The pointer address are the same in DLL and main application MainFrame 
>>> class.
>>> And as I said the crash occurs when it tries to acquire the mutex lock.
>>>
>>> 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
>>> _______________________________________________
>>> sqlite-users mailing list
>>> sqlite-users at mailinglists.sqlite.org
>>> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
>>
>>
>>
>> --
>> --------------
>> VerifEye Technologies Inc.
>> 151 Whitehall Dr. Unit 2
>> Markham, ON
>> L3R 9T1
>> _______________________________________________
>> 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



-- 
--------------
VerifEye Technologies Inc.
151 Whitehall Dr. Unit 2
Markham, ON
L3R 9T1

Reply via email to