From: danielk1977 Date: Fri, 25 Jul 2008 10:40:18 +0000 (+0000) Subject: Speed up the xFree() method of the mem6.c allocator by storing the offset from the... X-Git-Tag: version-3.6.10~702 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=da17af08fd1badfc16650e9704f533e31d4425a0;p=thirdparty%2Fsqlite.git Speed up the xFree() method of the mem6.c allocator by storing the offset from the pointer to the start of its chunk in a header field. (CVS 5475) FossilOrigin-Name: 0de54891d4901dec929459d27004efe87106ffa2 --- diff --git a/manifest b/manifest index 02561d667c..d8ba2c531a 100644 --- 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 diff --git a/manifest.uuid b/manifest.uuid index 60544f9f23..010bac3b70 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -cfa65e23df8b6f33884f533492b84dd1985db4d4 \ No newline at end of file +0de54891d4901dec929459d27004efe87106ffa2 \ No newline at end of file diff --git a/src/mem6.c b/src/mem6.c index 9a152d1aca..5b734cc186 100644 --- a/src/mem6.c +++ b/src/mem6.c @@ -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){