-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On 11/05/2014 02:05 PM, nicolas riesch wrote: > This means that EACH SUCCESSIVE function in the sequence above can > be processed on a DIFFERENT OS THREAD.
That works just fine with SQLite, with one caveat. You should also make sure the wrapper itself is threadsafe. For example what does the wrapper do if you call close/finalize in one thread and step in another concurrently? The caveat is an implementation decision in SQLite and its error apis. Usually the OS error model is to have the errors be per thread. SQLite instead has them be attached to the connection. This means the error apis return the most recent error for a connection no matter which thread it happened on. (In your case that is possibly desireable.) An example of how this can give the wrong information is if thread 1 does a step followed by looking at the error info, but between those two calls thread 2 does a sqlite operation on the same database connection. The error info thread 1 looks at could be from its earlier call or from the the thread 2 call. The second error issue is the api that returns a pointer to the error string (sqlite3_errmsg). By the time the pointer is used it could be pointing to garbage or even now unmapped memory because a SQLite call elsewhere on the connection caused that pointer to be freed. Unmapped memory will cause a crash, and who knows what the garbage will result in. You can tell if a wrapper got multithreading right if the code looks like this around every SQLite API call: // acquire db mutex sqlite3_db_mutex(db) // make sqlite call sqlite3_step() // copy error details if previous gave an error if (error) { // make a copy of the error message saved=strdup(sqlite3_errmsg(db)); } // release mutex Note this has to be done for every sqlite call that can set the error message which is approximately all of them. Here for example is the macro I use in my Python wrapper to do this: https://github.com/rogerbinns/apsw/blob/master/src/util.c#L36 Roger -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iEYEARECAAYFAlRbsk0ACgkQmOOfHg372QQMNQCfTfLUpodmuqnqUhe3tlXRAUBf N7EAoJeUlu4Ir2h5WCHY9k1Ey9U7icm/ =vmiH -----END PGP SIGNATURE----- _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users