> The idea is that the copy and nulling happens very quickly where the
> sqlite3_close is more expensive, do the copy/null very quickly so that if
> another thread calls Close during the first threads execution of
> sqlite3_close, the second thread finds m_db null and will not call
> sqlite3_close.

Wow, if you really relied on that then you did too few of
mutli-threaded programming. The rule of thumb is: no matter how fast
you think 2 different operations execute there always will be a
situation when another thread executes something between those 2
operations (and that "something" can be a very big chunk of code). So
you must protect it with some mutex or you can use atomic swaps (but
they are platform- and compiler-dependent).

Another problem with this code (which is not related to the crash): do
you know that sqlite3_close can return SQLITE_BUSY when there are some
statements or BLOB handles still open and not finalized?


Pavel

On Tue, Jun 22, 2010 at 3:27 AM, Sam Carleton
<scarle...@miltonstreet.com> wrote:
> Jay,
>
> Thank you!  I believe you pointed me at the correct direction.  The logic I
> am using of copying the m_db to a temp var, setting the m_db to null prior
> to calling the close method comes from my days of working with Microsoft
> COM.  The idea is that the copy and nulling happens very quickly where the
> sqlite3_close is more expensive, do the copy/null very quickly so that if
> another thread calls Close during the first threads execution of
> sqlite3_close, the second thread finds m_db null and will not call
> sqlite3_close.  Of course it would help if I actually NULLed out m_db,
> rather than did a compare on it!  I shake my head at myself sometimes.
> Thanks a million Jay, I really appreciate it!
>
> Sam
>
> On Tue, Jun 22, 2010 at 12:06 AM, Jay A. Kreibich <j...@kreibi.ch> wrote:
>
>> On Mon, Jun 21, 2010 at 11:56:09PM -0400, Sam Carleton scratched on the
>> wall:
>>
>> > I am NEVER capturing anything in the log file, so it looks like
>> everything
>> > is returning the correct. I am a bit stumped right now, so if it is
>> alright,
>> > I am going to post my code:
>>
>>   If you're doing a double close, it won't log an error, it will just
>> crash.
>>
>> > void CSQLiteDB::Close()
>> > {
>> >     if(m_db)
>> >     {
>> >         sqlite3 *db = m_db;
>> >         m_db == NULL;
>>
>>   No.
>>
>> >         sqlite3_close(db);
>> >     }
>> > }
>>
>>  If you're manually calling ::Close() anywhere, when the object is
>>  destroyed it will do a double close.
>>
>>   -j
>>
>> --
>> Jay A. Kreibich < J A Y  @  K R E I B I.C H >
>>
>> "Intelligence is like underwear: it is important that you have it,
>>  but showing it to the wrong people has the tendency to make them
>>  feel uncomfortable." -- Angela Johnson
>> _______________________________________________
>> sqlite-users mailing list
>> sqlite-users@sqlite.org
>> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
>>
> _______________________________________________
> sqlite-users mailing list
> sqlite-users@sqlite.org
> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
>
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to