]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Speed up the xFree() method of the mem6.c allocator by storing the offset from the...
authordanielk1977 <danielk1977@noemail.net>
Fri, 25 Jul 2008 10:40:18 +0000 (10:40 +0000)
committerdanielk1977 <danielk1977@noemail.net>
Fri, 25 Jul 2008 10:40:18 +0000 (10:40 +0000)
FossilOrigin-Name: 0de54891d4901dec929459d27004efe87106ffa2

manifest
manifest.uuid
src/mem6.c

index 02561d667cd06e40e98ab99550994f19ef16500d..d8ba2c531a06aaa5bd5ade425341a974c69aefaf 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Change\smem6.c\sto\suse\sthe\smalloc()\sand\sfree()\sfunctions\sdirectly,\sinstead\sof\sgoing\svia\sanother\ssqlite3_mem_methods\sstructure.\s(CVS\s5474)
-D 2008-07-25T09:24:13
+C Speed\sup\sthe\sxFree()\smethod\sof\sthe\smem6.c\sallocator\sby\sstoring\sthe\soffset\sfrom\sthe\spointer\sto\sthe\sstart\sof\sits\schunk\sin\sa\sheader\sfield.\s(CVS\s5475)
+D 2008-07-25T10:40:19
 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
 F Makefile.in 77ff156061bb870aa0a8b3d545c670d08070f7e6
 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@@ -123,7 +123,7 @@ F src/mem2.c 87381b143530cc377592e868bd548e881c2498a3
 F src/mem3.c c73e935d0b900abc51d5fa45f880937b062f4a9f
 F src/mem4.c 6703adb1717b26d9d70a1c2586b4b7b7ffee7909
 F src/mem5.c 0b0ba1c2a02d86eb812dea6debacee841e3856f7
-F src/mem6.c 52b0812f666a387b8b3e4528c60f6003708a2172
+F src/mem6.c c3987f7f63327338e0645bccfd923cbe6a2ef6c1
 F src/mutex.c a485a0eac8ee2cd95f66e565b4c6696c18db968f
 F src/mutex.h e52ffa1dfc6a6077e8b1823d2c2b7dfcbcf85594
 F src/mutex_os2.c 9c5637aa4c307c552566d0f0b3bd206245b54a97
@@ -612,7 +612,7 @@ F tool/speedtest16.c c8a9c793df96db7e4933f0852abb7a03d48f2e81
 F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
 F tool/speedtest8.c 1dbced29de5f59ba2ebf877edcadf171540374d1
 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
-P 43a4cae2acea33d1a17c0037516e9c27fb7e8e91
-R 6b9773f158bf3ee83a8701deeafc08e6
+P cfa65e23df8b6f33884f533492b84dd1985db4d4
+R 009b92e01fa490443d6d24fe83f1d669
 U danielk1977
-Z 8490bacca10c0ed9d136bc3e11db83be
+Z 4cbc1b51c05feddec296e687ec7109a3
index 60544f9f23a4cf32b607762375355e5f570a4713..010bac3b7071f51127d570b5c71fe713804e62fa 100644 (file)
@@ -1 +1 @@
-cfa65e23df8b6f33884f533492b84dd1985db4d4
\ No newline at end of file
+0de54891d4901dec929459d27004efe87106ffa2
\ No newline at end of file
index 9a152d1aca8d46dec401e736fc013e20e53fa338..5b734cc186f00193bdfd3799ed33914c52f9f458 100644 (file)
@@ -32,7 +32,7 @@
 ** fragmentation. On some systems, heap fragmentation can cause a 
 ** significant real-time slowdown.
 **
-** $Id: mem6.c,v 1.4 2008/07/25 09:24:13 danielk1977 Exp $
+** $Id: mem6.c,v 1.5 2008/07/25 10:40:19 danielk1977 Exp $
 */
 
 #ifdef SQLITE_ENABLE_MEMSYS6
@@ -364,13 +364,17 @@ static void *memsys6Malloc(int nByte){
   Mem6Chunk *pChunk;
   void *p = 0;
   int nTotal = nByte+8;
+  int iOffset = 0;
 
   mem6Enter();
   if( nTotal>mem6.nThreshold ){
     p = malloc(nTotal);
   }else{
-    for(pChunk=mem6.pChunk; !p && pChunk; pChunk=pChunk->pNext){
+    for(pChunk=mem6.pChunk; pChunk; pChunk=pChunk->pNext){
       p = chunkMalloc(pChunk, nTotal);
+      if( p ){
+        break;
+      }
     }
   
     if( !p ){
@@ -384,36 +388,39 @@ static void *memsys6Malloc(int nByte){
         assert(p);
       }
     }
+
+    iOffset = ((u8*)p - (u8*)pChunk);
   }
   mem6Leave();
 
-  ((sqlite3_int64 *)p)[0] = nByte;
-  return &((sqlite3_int64 *)p)[1];
+  if( !p ){
+    return 0;
+  }
+  ((u32 *)p)[0] = iOffset;
+  ((u32 *)p)[1] = nByte;
+  return &((u32 *)p)[2];
 }
 
 static int memsys6Size(void *pPrior){
-  sqlite3_int64 *p;
   if( pPrior==0 ) return 0;
-  p = (sqlite3_int64*)pPrior;
-  p--;
-  return p[0];
+  return ((u32*)pPrior)[-1];
 }
 
 static void memsys6Free(void *pPrior){
-  Mem6Chunk *pChunk;
-  void *p = &((sqlite3_int64 *)pPrior)[-1];
-
-  mem6Enter();
-  pChunk = findChunk(p);
-  if( pChunk ){
+  int iSlot;
+  void *p = &((u32 *)pPrior)[-2];
+  iSlot = ((u32 *)p)[0];
+  if( iSlot ){
+    mem6Enter();
+    Mem6Chunk *pChunk = (Mem6Chunk *)(&((u8 *)p)[-1 * iSlot]);
     chunkFree(pChunk, p);
     if( chunkIsEmpty(pChunk) ){
       freeChunk(pChunk);
     }
+    mem6Leave();
   }else{
     free(p);
   }
-  mem6Leave();
 }
 
 static void *memsys6Realloc(void *p, int nByte){