it is not necessary to send your question multible times... ;)
to answer: what makes you think that sqlite3_finalize can't
free the prepared statement ?
liubin liu wrote:
> Is there any memory leak in the code?
>
> Below is the code. Is there any memory leak in the pthread2?
>
> While pthread1 is using test.db exclusively, the sqlite3_prepare_v2() of
> pthread2 still prepares the p_stmt pointer to a piece of memory malloced by
> sqlite3_preapare_v2(). And then the sqlite3_finalize() can't free the memory
> still because pthread1 is using test.db exclusively. Does it cause a memory
> leak?
>
>
>
> ______code__________________________________________________________
>
> #include <stdio.h>
> #include <unistd.h> // for usleep()
> #include <sys/time.h> // for gettimeofday()
> #include <pthread.h>
> #include <sqlite3.h>
>
> void pthread1 (void);
> void pthread2 (void);
>
>
> int main (void)
> {
> int ret = -1;
>
> sqlite3 *g_db = NULL;
> ret = sqlite3_open ("test.db", &g_db);
> ret = sqlite3_exec (g_db, "CREATE TABLE t1 (id INTEGER PRIMARY KEY, d1
> TEXT)", NULL,NULL,NULL);
> ret = sqlite3_close (g_db);
>
> usleep (500000);
>
>
> pthread_t pthr1, pthr2;
> ret = pthread_create (&pthr1, NULL, (void *) pthread1, NULL);
> ret = pthread_create (&pthr2, NULL, (void *) pthread2, NULL);
>
>
> ret = pthread_join (pthr1, NULL);
> printf ("thread1 end\n");
> ret = pthread_join (pthr2, NULL);
> printf ("thread2 end\n");
>
> return 0;
> }
>
>
> void pthread1 (void)
> {
> int ret = -1;
> sqlite3 *db1 = NULL;
> ret = sqlite3_open ("test.db", &db1);
>
> char *sql_f = "INSERT OR REPLACE INTO t1 VALUES (%d,
> 'aaabbbcccddd1122')";
> char *sql = NULL;
>
> sqlite3_stmt *p_stmt = NULL;
>
> struct timeval tv1, tv2;
> ret = gettimeofday (&tv1, NULL);
>
> ret = sqlite3_prepare_v2 (db1, "BEGIN TRANSACTION", -1, &p_stmt, NULL);
> ret = sqlite3_step (p_stmt);
> ret = sqlite3_finalize (p_stmt);
>
> // n=1000000, test.db is 25843712 bytes, 25M;
> int i=0, n=1000000;
> for (i=0; i<n; i++)
> {
> sql = sqlite3_mprintf (sql_f, i);
> ret = sqlite3_prepare_v2 (db1, sql, -1, &p_stmt, NULL);
> ret = sqlite3_step (p_stmt);
> ret = sqlite3_finalize (p_stmt);
> }
>
> printf ("pthread1: ret: %d\n", ret);
> ret = sqlite3_prepare_v2 (db1, "COMMIT TRANSACTION", -1, &p_stmt, NULL);
> ret = sqlite3_step (p_stmt);
> ret = sqlite3_finalize (p_stmt);
>
> ret = gettimeofday (&tv2, NULL);
> printf ("time is : %ds\n", (int) (tv2.tv_sec - tv1.tv_sec));
>
>
> ret = sqlite3_close (db1);
> }
>
>
>
> void pthread2 (void)
> {
> int ret = -1;
>
> sqlite3 *db2 = NULL;
> ret = sqlite3_open ("test.db", &db2);
>
> usleep (2000000);
>
>
> sqlite3_stmt *p_stmt = NULL;
> int i=0, n=10;
> for (i=0; i<n; i++)
> {
> char *sql_f = "INSERT OR REPLACE INTO t1 VALUES (%d,
> 'bbbbbbbbbbbb1122')";
> char *sql = NULL;
>
> sql = sqlite3_mprintf (sql_f, i);
> ret = sqlite3_prepare_v2 (db2, sql, -1, &p_stmt, NULL);
> printf ("pthread2: prepare: %d, p_stmt: %p, errmsg: %s\n", ret,
> p_stmt, sqlite3_errmsg(db2));
> ret = sqlite3_step (p_stmt);
> printf ("pthread2: step: %d, p_stmt: %p, errmsg: %s\n", ret,
> p_stmt, sqlite3_errmsg(db2));
> ret = sqlite3_finalize (p_stmt);
> printf ("pthread2: finalize: %d, p_stmt: %p, errmsg: %s\n", ret,
> p_stmt, sqlite3_errmsg(db2));
> printf ("\n");
>
> usleep (300000);
> }
>
> ret = sqlite3_close (db2);
> printf ("pthread2: close: %d, p_stmt: %p, errmsg: %s\n", ret,
> p_stmt, sqlite3_errmsg(db2));
> }
_______________________________________________
sqlite-users mailing list
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users