]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add the sqlite3_close_v2() interface (from the deferred-close branch) that
authordrh <drh@noemail.net>
Thu, 21 Jun 2012 15:51:42 +0000 (15:51 +0000)
committerdrh <drh@noemail.net>
Thu, 21 Jun 2012 15:51:42 +0000 (15:51 +0000)
allows close operations to happen out-of-order in bindings to
garbage-collected langauges.

FossilOrigin-Name: fb8893abeefabe9de44e34dcf4327764481189f5

1  2 
manifest
manifest.uuid
src/backup.c
src/main.c
src/sqlite.h.in
src/sqliteInt.h

diff --cc manifest
index 2c6de2eea8efd27ee8a9ed5c619ea6ea3f6aaba9,6be83175c26ee6a48e1044c9251f8c6b3b5fc17d..3103353fbf8b8e05d4516e689b973d051d653435
+++ b/manifest
@@@ -1,12 -1,12 +1,12 @@@
- C Merge\schanges\sto\strunk\sthat\sensure\sthat\sfloating\spoint\svalues\sare\sexactly\npreserved\son\sa\sround-trip\sthrough\s".dump".
- D 2012-06-21T15:22:04.664
 -C Fix\scompiler\swarning.
 -D 2012-06-15T20:42:43.595
++C Add\sthe\ssqlite3_close_v2()\sinterface\s(from\sthe\sdeferred-close\sbranch)\sthat\nallows\sclose\soperations\sto\shappen\sout-of-order\sin\sbindings\sto\ngarbage-collected\slangauges.
++D 2012-06-21T15:51:42.711
  F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 -F Makefile.in 4f37eb61be9d38643cdd839a74b8e3bad724cfcf
 +F Makefile.in 8f6d858bf3df9978ba43df19985146a1173025e4
  F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
 -F Makefile.msc 0891f992d012d6b2976f86e80a82ae6839fa9ded
 -F Makefile.vxworks 3b7fe7a0571fdadc61363ebc1b23732d2d6363ca
 +F Makefile.msc 0100213e86c66ed5ac37ea98446406c06f012203
 +F Makefile.vxworks 879f034a64062a364b21000266bbd5bc6e0c19b9
  F README cd04a36fbc7ea56932a4052d7d0b7f09f27c33d6
 -F VERSION 3e857b9b826e818eec9411eafe2c3fa22c1dbb8a
 +F VERSION a71848df48082f1d6585d4b0819d530fc455485d
  F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50
  F addopcodes.awk 17dc593f791f874d2c23a0f9360850ded0286531
  F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2
@@@ -118,9 -118,9 +118,9 @@@ F sqlite3.1 6be1ad09113570e1fc8dcaff84c
  F sqlite3.pc.in ae6f59a76e862f5c561eb32a380228a02afc3cad
  F src/alter.c 149cc80d9257971b0bff34e58fb2263e01998289
  F src/analyze.c 70c46504c0d2543ea5cdca01140b2cd3e1d886e7
 -F src/attach.c 12c6957996908edc31c96d7c68d4942c2474405f
 +F src/attach.c 577bf5675b0c50495fc28549f2fcbdb1bac71143
  F src/auth.c 523da7fb4979469955d822ff9298352d6b31de34
- F src/backup.c d7fb4c6d2ad3fe51a4ce1a897fde7b00f4de5fef
 -F src/backup.c 641eab30db6c70c3393719c4c874ecf534eafb27
++F src/backup.c 5524df36810668b3b5a6de2d7e3910b98e721e33
  F src/bitvec.c af50f1c8c0ff54d6bdb7a80e2fceca5a93670bef
  F src/btmutex.c 976f45a12e37293e32cae0281b15a21d48a8aaa7
  F src/btree.c f0b71054103cb77eb5e782088c16998ec4f06624
@@@ -145,7 -145,7 +145,7 @@@ F src/journal.c 552839e54d1bf76fb8f7abe
  F src/legacy.c a199d7683d60cef73089e892409113e69c23a99f
  F src/lempar.c 0ee69fca0be54cd93939df98d2aca4ca46f44416
  F src/loadext.c f20382fbaeec832438a1ba7797bee3d3c8a6d51d
- F src/main.c 07e05ba330b5994fa20d3b2e8c1c146133587d68
 -F src/main.c aacb100c6bae0141b8afbc846b5e0cfc3c28236e
++F src/main.c 02255cf1da50956c5427c469abddb15bccc4ba09
  F src/malloc.c fe085aa851b666b7c375c1ff957643dc20a04bf6
  F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
  F src/mem1.c b3677415e69603d6a0e7c5410a1b3731d55beda1
@@@ -177,10 -179,10 +177,10 @@@ F src/random.c cd4a67b3953b88019f8cd4cc
  F src/resolve.c b3c70ab28cac60de33684c9aa9e5138dcf71d6dd
  F src/rowset.c f6a49f3e9579428024662f6e2931832511f831a1
  F src/select.c f6c4833c4d8e94714761d99013d74f381e084f1d
 -F src/shell.c c16f72e34f611f060546709564c121a67cb2b31b
 -F src/sqlite.h.in 238059420ea5e60deb6dacc3c46a44f47739060d
 +F src/shell.c 74e47ddb99bf7997985dc89bbdd5875637501ad1
- F src/sqlite.h.in 34640d183e570e81ae1e057a668fdbb55625e802
++F src/sqlite.h.in 310ae7e538883fa1619ab0638c775ce11ad43015
  F src/sqlite3ext.h 6904f4aadf976f95241311fbffb00823075d9477
- F src/sqliteInt.h 4e092561a4d9c384c3b9dfeebdef868a3566561c
 -F src/sqliteInt.h d3b7409a510f7aeb0f9e6a2c74a18db3c659435c
++F src/sqliteInt.h 2bc2ebc2ff1a2b530ee5ed9ffd46c6fce93b244c
  F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d
  F src/status.c 35939e7e03abf1b7577ce311f48f682c40de3208
  F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e
@@@ -235,13 -237,13 +235,13 @@@ F src/tokenize.c 1e86210d3976717a19238e
  F src/trigger.c ee7e178fb9188f44b532cebd449a7c1df90fb684
  F src/update.c d3076782c887c10e882996550345da9c4c9f9dea
  F src/utf.c 890c67dcfcc7a74623c95baac7535aadfe265e84
 -F src/util.c 4f6cfad661b2e3454b0cdd5b1b9d39a54942d0e3
 -F src/vacuum.c bfd53f9bd20a8fdb70b0fa8e77182b866875c0d8
 -F src/vdbe.c b6cb2ac43263843a5612892c0ad2309609b32c26
 +F src/util.c 0af2e515dc0dabacec931bca39525f6c3f1c5455
 +F src/vacuum.c 587a52bb8833d7ac15af8916f25437e2575028bd
 +F src/vdbe.c f5ad3c06dc3fe647097065829c013f3f1b9eadca
  F src/vdbe.h 18f581cac1f4339ec3299f3e0cc6e11aec654cdb
  F src/vdbeInt.h 6ff4180a05683566a8835d12f7ec504b22932c82
- F src/vdbeapi.c 3662b6a468a2a4605a15dfab313baa6dff81ad91
- F src/vdbeaux.c d52c8a424fdd4b1d5cf1ac93cc7cd20da023ec5c
+ F src/vdbeapi.c f8ba09132fe654ffd068058cef490426aca9fca6
+ F src/vdbeaux.c dce80038c3c41f2680e5ab4dd0f7e0d8b7ff9071
  F src/vdbeblob.c 32f2a4899d67f69634ea4dd93e3f651936d732cb
  F src/vdbemem.c cb55e84b8e2c15704968ee05f0fae25883299b74
  F src/vdbesort.c b25814d385895544ebc8118245c8311ded7f81c9
@@@ -1002,9 -1002,9 +1002,9 @@@ F tool/symbols-mingw.sh 4dbcea7e7476830
  F tool/symbols.sh fec58532668296d7c7dc48be9c87f75ccdb5814f
  F tool/tostr.awk e75472c2f98dd76e06b8c9c1367f4ab07e122d06
  F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
 -F tool/warnings-clang.sh a8a0a3babda96dfb1ff51adda3cbbf3dfb7266c2
 +F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
  F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381
- P 6131a0002fea5d6f3b416a63a466bf2b69d1e12d 0f706acfc7181f2714a06b2c232677ebeede3a44
- R 24446b639b8f30cdeaec2dbb61cdf6f2
 -P c4b8621125ce77308b06692d92f70586b10055a9
 -R 57c11cdb4c652e2e66fa754b88986502
 -U mistachkin
 -Z bfc433cff95e9f96663878f602826ba1
++P 4cebd60704f92bb3689c126f46feadc3516d3d45 37d9bc061d5ecfe37ccbd6f559986d7ae0449179
++R 41d5610ed2033955b4202ff788697dde
 +U drh
- Z b1dc391973e1c634a2e4e6388b5cc239
++Z c18db60333d2fd8d859babd08906006b
diff --cc manifest.uuid
index 2091a4931f4d0f2dd3a3cd8828a94ca0a79ce1d0,15f9187211826b7c5f032e998de4aa73bc4bf722..9e7abc1ff8a94f26a2cc6fa6ff116bcc9370cd42
@@@ -1,1 -1,1 +1,1 @@@
- 4cebd60704f92bb3689c126f46feadc3516d3d45
 -37d9bc061d5ecfe37ccbd6f559986d7ae0449179
++fb8893abeefabe9de44e34dcf4327764481189f5
diff --cc src/backup.c
index 0ada33c3be332fe49dfbec97d464b7f0163bff20,6655ee39162a11da878f9292953852d47b3fcb9a..527ecb57448d76053140ed1e41cb56ca7ed99102
@@@ -543,14 -543,13 +543,14 @@@ int sqlite3_backup_step(sqlite3_backup 
  */
  int sqlite3_backup_finish(sqlite3_backup *p){
    sqlite3_backup **pp;                 /* Ptr to head of pagers backup list */
-   MUTEX_LOGIC( sqlite3_mutex *mutex; ) /* Mutex to protect source database */
 -  sqlite3 *pSrcDb = p->pSrcDb;         /* Source database connection */
++  sqlite3 *pSrcDb;                     /* Source database connection */
    int rc;                              /* Value to return */
  
    /* Enter the mutexes */
    if( p==0 ) return SQLITE_OK;
--  sqlite3_mutex_enter(p->pSrcDb->mutex);
++  pSrcDb = p->pSrcDb;
++  sqlite3_mutex_enter(pSrcDb->mutex);
    sqlite3BtreeEnter(p->pSrc);
-   MUTEX_LOGIC( mutex = p->pSrcDb->mutex; )
    if( p->pDestDb ){
      sqlite3_mutex_enter(p->pDestDb->mutex);
    }
diff --cc src/main.c
index 7ecb4f2617613717e6f44fb4a3c57347da6eb300,c9872f7bc0e0bc87e9cbab9799f78ce0cbd90343..16294a619977abac0edd5dd980716eb756526f4b
@@@ -741,37 -720,25 +741,49 @@@ static void functionDestroy(sqlite3 *db
    }
  }
  
 +/*
 +** Disconnect all sqlite3_vtab objects that belong to database connection
 +** db. This is called when db is being closed.
 +*/
 +static void disconnectAllVtab(sqlite3 *db){
 +#ifndef SQLITE_OMIT_VIRTUALTABLE
 +  int i;
 +  sqlite3BtreeEnterAll(db);
 +  for(i=0; i<db->nDb; i++){
 +    Schema *pSchema = db->aDb[i].pSchema;
 +    if( db->aDb[i].pSchema ){
 +      HashElem *p;
 +      for(p=sqliteHashFirst(&pSchema->tblHash); p; p=sqliteHashNext(p)){
 +        Table *pTab = (Table *)sqliteHashData(p);
 +        if( IsVirtual(pTab) ) sqlite3VtabDisconnect(db, pTab);
 +      }
 +    }
 +  }
 +  sqlite3BtreeLeaveAll(db);
 +#else
 +  UNUSED_PARAMETER(db);
 +#endif
 +}
 +
  /*
- ** Close an existing SQLite database
+ ** Return TRUE if database connection db has unfinalized prepared
+ ** statements or unfinished sqlite3_backup objects.  
  */
- int sqlite3_close(sqlite3 *db){
-   HashElem *i;                    /* Hash table iterator */
+ static int connectionIsBusy(sqlite3 *db){
    int j;
+   assert( sqlite3_mutex_held(db->mutex) );
+   if( db->pVdbe ) return 1;
+   for(j=0; j<db->nDb; j++){
+     Btree *pBt = db->aDb[j].pBt;
+     if( pBt && sqlite3BtreeIsInBackup(pBt) ) return 1;
+   }
+   return 0;
+ }
  
+ /*
+ ** Close an existing SQLite database
+ */
+ static int sqlite3Close(sqlite3 *db, int forceZombie){
    if( !db ){
      return SQLITE_OK;
    }
diff --cc src/sqlite.h.in
Simple merge
diff --cc src/sqliteInt.h
Simple merge