]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Use an inline asm "ret stosp" instruction instead of a memset() when a writer is...
authordan <Dan Kennedy>
Thu, 5 Dec 2024 16:52:52 +0000 (16:52 +0000)
committerdan <Dan Kennedy>
Thu, 5 Dec 2024 16:52:52 +0000 (16:52 +0000)
FossilOrigin-Name: c10fa6af8bd8d64a6e528f3e71999d1631e66a8dd483a83c1fc30d65ccaf0f6d

manifest
manifest.uuid
src/vdbe.c
src/vdbeaux.c
src/wal.c

index 9bfd40255361ba5a1cef2e5cd4d23b333a2fa706..b79e46b4ed81e68c696ec314cf361705b98bea22 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Temporarily\senable\szeroing\sof\swal2-mode\shash\stables\swithin\sPASSIVE,\sas\swell\sas\snon-PASSIVE,\scheckpoints.
-D 2024-12-04T11:01:20.907
+C Use\san\sinline\sasm\s"ret\sstosp"\sinstruction\sinstead\sof\sa\smemset()\swhen\sa\swriter\sis\srequired\sto\szero\sa\shash\stable.
+D 2024-12-05T16:52:52.457
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -845,11 +845,11 @@ F src/upsert.c 215328c3f91623c520ec8672c44323553f12caeb4f01b1090ebdca99fdf7b4f1
 F src/utf.c f23165685a67b4caf8ec08fb274cb3f319103decfb2a980b7cfd55d18dfa855e
 F src/util.c 5d1a0134cf4240648d1c6bb5cc8efaca0ea2b5d5c840985aec7e947271f04375
 F src/vacuum.c 25e407a6dc8b288fa4295b3d92fa9ce9318503e84df53cdf403a50fccbc1ba31
-F src/vdbe.c c451ef4ca11be023f5ad53bfae57cd7b32b455020b82729f44f4481973767480
+F src/vdbe.c fa31aa6525e34b51763702d246a69c3877436f0bbf6be5f6351cdcb770b9b7ab
 F src/vdbe.h b74bfd9cb1fa895e545a5286ee1cac6d75f706d325f89be0e3bf3c5107eb8a78
 F src/vdbeInt.h 92b7eabbaadbe8127741cd96e7e39c4834c2bb0b75987d5f6251975f47233690
 F src/vdbeapi.c 80235ac380e9467fec1cb0883354d841f2a771976e766995f7e0c77f845406df
-F src/vdbeaux.c 05820cd1ffdb0006c8b8d70ede17137a76805a1ecb811fd795088a5eaae50086
+F src/vdbeaux.c ea544580ce7ae7c814af632cb0ee13b3e5871527e813e5c4e5153ffee353688a
 F src/vdbeblob.c 255be187436da38b01f276c02e6a08103489bbe2a7c6c21537b7aecbe0e1f797
 F src/vdbemem.c 831a244831eaa45335f9ae276b50a7a82ee10d8c46c2c72492d4eb8c98d94d89
 F src/vdbesort.c d0a3c7056c081703c8b6d91ad60f17da5e062a5c64bf568ed0fa1b5f4cae311f
@@ -857,7 +857,7 @@ F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf8
 F src/vdbevtab.c fc46b9cbd759dc013f0b3724549cc0d71379183c667df3a5988f7e2f1bd485f3
 F src/vtab.c 5fb499d20494b7eecaadb7584634af9afcb374cb0524912b475fcb1712458a1b
 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
-F src/wal.c 0f3a659ad867b40fea8909462cf5c3598f8360a061e7ffc6ff2b991243d672e2
+F src/wal.c 83decd78a90b841e1dde30326308f9afa3342efac8bd4da0011c39b3a18d4ff1
 F src/wal.h 8c59ee7a835574396d7cbd04626d11fd849613e361a46e7e9519091ab03bdb29
 F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014
 F src/where.c c046dd58c3410f7b7528e1e6317cb876398557bad346d568ed8562321a7d002d
@@ -2250,8 +2250,8 @@ F vsixtest/vsixtest.tcl 6195aba1f12a5e10efc2b8c0009532167be5e301abe5b31385638080
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 442167b86ad6b5a7ec4862ca91c3bb0b4b8e4843aa55193b96c2daadc2e7336b
-R 81105e65accbb195d53943cfcf8e5ae2
+P a97a2b0da1f9e93a7cf5a4f08ded96d0d3511f84329524b4805b7481393c397e
+R 90ad610f7d217008d6c0831f4b0d961d
 U dan
-Z 3af5dca54f4f026f78fb56e0fd82e10f
+Z f13b6a18351017b8a025ae005190ad9a
 # Remove this line to create a well-formed Fossil manifest.
index ad88f78660b37ea4fdf96923c7c2cf964495727a..3f1e33fffd77a1495aa0ca7caebb885d82c58968 100644 (file)
@@ -1 +1 @@
-a97a2b0da1f9e93a7cf5a4f08ded96d0d3511f84329524b4805b7481393c397e
+c10fa6af8bd8d64a6e528f3e71999d1631e66a8dd483a83c1fc30d65ccaf0f6d
index 01e218a8c72901253f46477ff78d9062707477b3..96c26a2e7a4f1682de6f7d8bba44aa10de43fe16 100644 (file)
@@ -3958,7 +3958,9 @@ case OP_AutoCommit: {
 
     u64 aCommit[COMMIT_TIME_N];
     memset(aCommit, 0, sizeof(aCommit));
-    sqlite3CommitTimeSet(aCommit, COMMIT_TIME_START);
+    if( iRollback==0 ){
+      sqlite3CommitTimeSet(aCommit, COMMIT_TIME_START);
+    }
 
     if( iRollback ){
       assert( desiredAutoCommit==1 );
index 686f9b2c5653058ff95d564b7d8680881deb96ea..0fadd65e806f6872e9d26d0b460926d5f7bbad54 100644 (file)
@@ -5499,7 +5499,7 @@ void sqlite3CommitTimeLog(u64 *aCommit){
       }
       zStr = sqlite3_mprintf("%z%s%s%d%s", zStr, (zStr?", ":""),zHash,iVal,zU);
     }
-    sqlite3_log(SQLITE_WARNING, "slow commit (v=13): (%s)", zStr);
+    sqlite3_log(SQLITE_WARNING, "slow commit (v=14): (%s)", zStr);
     sqlite3_free(zStr);
   }
 }
@@ -5527,7 +5527,7 @@ void sqlite3PrepareTimeLog(const char *zSql, int nSql, u64 *aPrepare){
     }
     if( nByte<0 ){ nByte = sqlite3Strlen30(zSql); }
     sqlite3_log(SQLITE_WARNING, 
-        "slow prepare (v=13): (%s) [%.*s]", zStr, nByte, zSql
+        "slow prepare (v=14): (%s) [%.*s]", zStr, nByte, zSql
     );
     sqlite3_free(zStr);
   }
@@ -5543,7 +5543,7 @@ void sqlite3SchemaTimeLog(u64 *aSchema){
         (aSchema[ii]==0 ? 0 : (int)(aSchema[ii] - i1))
       );
     }
-    sqlite3_log(SQLITE_WARNING, "slow schema (v=13): (%s)", zStr);
+    sqlite3_log(SQLITE_WARNING, "slow schema (v=14): (%s)", zStr);
     sqlite3_free(zStr);
   }
 }
index 8e4a6659acdcf1565e54123722c419d7bbc53670..751d0864f730693835b30f4eab3b2f066661eed2 100644 (file)
--- a/src/wal.c
+++ b/src/wal.c
@@ -1631,6 +1631,25 @@ static void walCleanupHash(Wal *pWal){
 #endif /* SQLITE_ENABLE_EXPENSIVE_ASSERT */
 }
 
+/*
+** Zero the n byte block indicated by pointer p. n Must be a multiple of
+** 8, and p must be aligned to an 8-byte boundary.
+*/
+static void zero64(void *p, int n){
+  size_t c = n / sizeof(u64);
+  void *d = p;
+
+  assert( (n & 0x7)==0 );
+  assert( EIGHT_BYTE_ALIGNMENT(p) );
+
+  __asm__ volatile (
+      "rep stosq"
+        : "+D" (d), "+c" (c)
+        : "a" (0)
+        : "memory"
+  );
+}
+
 /*
 ** Set an entry in the wal-index that will map database page number
 ** pPage into WAL frame iFrame.
@@ -1671,8 +1690,8 @@ static int walIndexAppend(Wal *pWal, int iWal, u32 iFrame, u32 iPage){
     if( pWal->aCommitTime ) t = sqlite3STimeNow();
     if( idx==1 && sLoc.aPgno[0]!=0 ){
       int nByte = (int)((u8*)&sLoc.aHash[HASHTABLE_NSLOT] - (u8*)sLoc.aPgno);
-      assert( nByte>=0 );
-      memset((void*)sLoc.aPgno, 0, nByte);
+      assert( nByte>=0 && (nByte & 0x07)==0 );
+      zero64((void*)sLoc.aPgno, nByte);
     }
     if( pWal->aCommitTime ){
       pWal->aCommitTime[COMMIT_TIME_WALINDEX_MEMSETUS]+=sqlite3STimeNow()-t;
@@ -2971,7 +2990,7 @@ static int walCheckpoint(
       }
     }
 
-    if( bWal2 && rc==SQLITE_OK /* && eMode!=SQLITE_CHECKPOINT_PASSIVE */ ){
+    if( bWal2 && rc==SQLITE_OK && eMode!=SQLITE_CHECKPOINT_PASSIVE ){
       /* In wal2 mode, a non-passive checkpoint waits for all readers of
       ** the wal file just checkpointed to finish, then zeroes the hash
       ** tables associated with that wal file. This is because in some