-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
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
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
-cfa65e23df8b6f33884f533492b84dd1985db4d4
\ No newline at end of file
+0de54891d4901dec929459d27004efe87106ffa2
\ No newline at end of file
** 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
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 ){
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){