1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-08-08 14:02:16 +03:00

Change the name of the VdbeMemRelease() macro to VdbeMemReleaseExtern() to

more accurately reflect what it does.  Performance enhancement to the
sqlite3VdbeMemRelease() function.

FossilOrigin-Name: 3ca5846da7da5e08192a4c96288197be3b7ab6f7
This commit is contained in:
drh
2014-08-25 11:20:27 +00:00
parent 4274dae9e9
commit 12b7c7d8c3
5 changed files with 44 additions and 23 deletions

View File

@@ -1,5 +1,5 @@
C The\ssqlite3VdbeChangeEncoding()\sroutine\sgoes\sabout\s3x\sfaster\sif\sthe\nsqlite3VdbeMemTranslate()\ssubroutine\sis\snot\sinlined. C Change\sthe\sname\sof\sthe\sVdbeMemRelease()\smacro\sto\sVdbeMemReleaseExtern()\sto\nmore\saccurately\sreflect\swhat\sit\sdoes.\s\sPerformance\senhancement\sto\sthe\nsqlite3VdbeMemRelease()\sfunction.
D 2014-08-24T02:53:23.646 D 2014-08-25T11:20:27.189
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
F Makefile.in 5eb79e334a5de69c87740edd56af6527dd219308 F Makefile.in 5eb79e334a5de69c87740edd56af6527dd219308
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -284,13 +284,13 @@ F src/update.c ea336ce7b8b3fc5e316ba8f082e6445babf81059
F src/utf.c 77abb5e6d27f3d236e50f7c8fff1d00e15262359 F src/utf.c 77abb5e6d27f3d236e50f7c8fff1d00e15262359
F src/util.c 068dcd26354a3898ccc64ad5c4bdb95a7a15d33a F src/util.c 068dcd26354a3898ccc64ad5c4bdb95a7a15d33a
F src/vacuum.c 3728d74919d4fb1356f9e9a13e27773db60b7179 F src/vacuum.c 3728d74919d4fb1356f9e9a13e27773db60b7179
F src/vdbe.c 52ee5d589cbb171a8b096f210b69deb4a33c4369 F src/vdbe.c 0fe4b47668b36a50bd9f7fd7b15cbeeb69d54b37
F src/vdbe.h c63fad052c9e7388d551e556e119c0bcf6bebdf8 F src/vdbe.h c63fad052c9e7388d551e556e119c0bcf6bebdf8
F src/vdbeInt.h 764a055bc9a3e61a30ba37cd4c1826f62bcf8759 F src/vdbeInt.h 20056cd59ff93ef9eb91009ece726d65dd7ed322
F src/vdbeapi.c cda974083d7597f807640d344ffcf76d872201ce F src/vdbeapi.c cda974083d7597f807640d344ffcf76d872201ce
F src/vdbeaux.c dba006f67c9fd1b1d07ee7fb0fb38aa1905161d1 F src/vdbeaux.c dba006f67c9fd1b1d07ee7fb0fb38aa1905161d1
F src/vdbeblob.c 848238dc73e93e48432991bb5651bf87d865eca4 F src/vdbeblob.c 848238dc73e93e48432991bb5651bf87d865eca4
F src/vdbemem.c f2e162888521a9af35d608ac4c13db4991dfb417 F src/vdbemem.c 4c9d686da474957d2e78834f13cc5f141fe6b87f
F src/vdbesort.c f7f5563bf7d4695ca8f3203f3bf9de96d04ed0b3 F src/vdbesort.c f7f5563bf7d4695ca8f3203f3bf9de96d04ed0b3
F src/vdbetrace.c 6f52bc0c51e144b7efdcfb2a8f771167a8816767 F src/vdbetrace.c 6f52bc0c51e144b7efdcfb2a8f771167a8816767
F src/vtab.c 019dbfd0406a7447c990e1f7bd1dfcdb8895697f F src/vtab.c 019dbfd0406a7447c990e1f7bd1dfcdb8895697f
@@ -1188,7 +1188,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
P c63311e2f3344363a5ed99838fb5850004eaee30 P 0c7e1b875a14ff9d71af7bb125a0272a23d57353
R 195c0a9c31ce9f43b0d460b5ca896167 R 3449942ddb4a22bfe8e7f1684bd27e8b
U drh U drh
Z 7685d4da1bf506f63008f6a3d5e2d0bd Z c7041d8c52f909d88b499b4a5f3227aa

View File

@@ -1 +1 @@
0c7e1b875a14ff9d71af7bb125a0272a23d57353 3ca5846da7da5e08192a4c96288197be3b7ab6f7

View File

@@ -640,7 +640,7 @@ int sqlite3VdbeExec(
assert( pOp->p2<=(p->nMem-p->nCursor) ); assert( pOp->p2<=(p->nMem-p->nCursor) );
pOut = &aMem[pOp->p2]; pOut = &aMem[pOp->p2];
memAboutToChange(p, pOut); memAboutToChange(p, pOut);
VdbeMemRelease(pOut); VdbeMemReleaseExtern(pOut);
pOut->flags = MEM_Int; pOut->flags = MEM_Int;
} }
@@ -1079,7 +1079,7 @@ case OP_Null: { /* out2-prerelease */
while( cnt>0 ){ while( cnt>0 ){
pOut++; pOut++;
memAboutToChange(p, pOut); memAboutToChange(p, pOut);
VdbeMemRelease(pOut); VdbeMemReleaseExtern(pOut);
pOut->flags = nullFlag; pOut->flags = nullFlag;
cnt--; cnt--;
} }
@@ -1165,7 +1165,7 @@ case OP_Move: {
assert( pIn1<=&aMem[(p->nMem-p->nCursor)] ); assert( pIn1<=&aMem[(p->nMem-p->nCursor)] );
assert( memIsValid(pIn1) ); assert( memIsValid(pIn1) );
memAboutToChange(p, pOut); memAboutToChange(p, pOut);
VdbeMemRelease(pOut); VdbeMemReleaseExtern(pOut);
zMalloc = pOut->zMalloc; zMalloc = pOut->zMalloc;
memcpy(pOut, pIn1, sizeof(Mem)); memcpy(pOut, pIn1, sizeof(Mem));
#ifdef SQLITE_DEBUG #ifdef SQLITE_DEBUG
@@ -2538,7 +2538,7 @@ case OP_Column: {
if( pC->szRow>=aOffset[p2+1] ){ if( pC->szRow>=aOffset[p2+1] ){
/* This is the common case where the desired content fits on the original /* This is the common case where the desired content fits on the original
** page - where the content is not on an overflow page */ ** page - where the content is not on an overflow page */
VdbeMemRelease(pDest); VdbeMemReleaseExtern(pDest);
sqlite3VdbeSerialGet(pC->aRow+aOffset[p2], aType[p2], pDest); sqlite3VdbeSerialGet(pC->aRow+aOffset[p2], aType[p2], pDest);
}else{ }else{
/* This branch happens only when content is on overflow pages */ /* This branch happens only when content is on overflow pages */

View File

@@ -430,7 +430,7 @@ void sqlite3VdbeMemRelease(Mem *p);
void sqlite3VdbeMemReleaseExternal(Mem *p); void sqlite3VdbeMemReleaseExternal(Mem *p);
#define VdbeMemDynamic(X) \ #define VdbeMemDynamic(X) \
(((X)->flags&(MEM_Agg|MEM_Dyn|MEM_RowSet|MEM_Frame))!=0) (((X)->flags&(MEM_Agg|MEM_Dyn|MEM_RowSet|MEM_Frame))!=0)
#define VdbeMemRelease(X) \ #define VdbeMemReleaseExtern(X) \
if( VdbeMemDynamic(X) ) sqlite3VdbeMemReleaseExternal(X); if( VdbeMemDynamic(X) ) sqlite3VdbeMemReleaseExternal(X);
int sqlite3VdbeMemFinalize(Mem*, FuncDef*); int sqlite3VdbeMemFinalize(Mem*, FuncDef*);
const char *sqlite3OpcodeName(int); const char *sqlite3OpcodeName(int);

View File

@@ -121,7 +121,7 @@ int sqlite3VdbeMemGrow(Mem *pMem, int n, int bPreserve){
pMem->zMalloc = sqlite3DbMallocRaw(pMem->db, n); pMem->zMalloc = sqlite3DbMallocRaw(pMem->db, n);
} }
if( pMem->zMalloc==0 ){ if( pMem->zMalloc==0 ){
VdbeMemRelease(pMem); VdbeMemReleaseExtern(pMem);
pMem->z = 0; pMem->z = 0;
pMem->flags = MEM_Null; pMem->flags = MEM_Null;
return SQLITE_NOMEM; return SQLITE_NOMEM;
@@ -300,6 +300,9 @@ int sqlite3VdbeMemFinalize(Mem *pMem, FuncDef *pFunc){
** If the memory cell contains a string value that must be freed by ** If the memory cell contains a string value that must be freed by
** invoking an external callback, free it now. Calling this function ** invoking an external callback, free it now. Calling this function
** does not free any Mem.zMalloc buffer. ** does not free any Mem.zMalloc buffer.
**
** The VdbeMemReleaseExtern() macro invokes this routine if only if there
** is work for this routine to do.
*/ */
void sqlite3VdbeMemReleaseExternal(Mem *p){ void sqlite3VdbeMemReleaseExternal(Mem *p){
assert( p->db==0 || sqlite3_mutex_held(p->db->mutex) ); assert( p->db==0 || sqlite3_mutex_held(p->db->mutex) );
@@ -319,6 +322,25 @@ void sqlite3VdbeMemReleaseExternal(Mem *p){
} }
} }
/*
** Release memory held by the Mem p, both external memory cleared
** by p->xDel and memory in p->zMalloc.
**
** This is a helper routine invoked by sqlite3VdbeMemRelease() in
** the uncommon case when there really is memory in p that is
** need of freeing.
*/
static SQLITE_NOINLINE void vdbeMemRelease(Mem *p){
if( VdbeMemDynamic(p) ){
sqlite3VdbeMemReleaseExternal(p);
}
if( p->zMalloc ){
sqlite3DbFree(p->db, p->zMalloc);
p->zMalloc = 0;
}
p->z = 0;
}
/* /*
** Release any memory held by the Mem. This may leave the Mem in an ** Release any memory held by the Mem. This may leave the Mem in an
** inconsistent state, for example with (Mem.z==0) and ** inconsistent state, for example with (Mem.z==0) and
@@ -326,13 +348,12 @@ void sqlite3VdbeMemReleaseExternal(Mem *p){
*/ */
void sqlite3VdbeMemRelease(Mem *p){ void sqlite3VdbeMemRelease(Mem *p){
assert( sqlite3VdbeCheckMemInvariants(p) ); assert( sqlite3VdbeCheckMemInvariants(p) );
VdbeMemRelease(p); if( VdbeMemDynamic(p) || p->zMalloc ){
if( p->zMalloc ){ vdbeMemRelease(p);
sqlite3DbFree(p->db, p->zMalloc); }else{
p->zMalloc = 0; p->z = 0;
} }
p->z = 0; assert( p->xDel==0 );
assert( p->xDel==0 ); /* Zeroed by VdbeMemRelease() above */
} }
/* /*
@@ -638,7 +659,7 @@ void sqlite3VdbeMemAboutToChange(Vdbe *pVdbe, Mem *pMem){
*/ */
void sqlite3VdbeMemShallowCopy(Mem *pTo, const Mem *pFrom, int srcType){ void sqlite3VdbeMemShallowCopy(Mem *pTo, const Mem *pFrom, int srcType){
assert( (pFrom->flags & MEM_RowSet)==0 ); assert( (pFrom->flags & MEM_RowSet)==0 );
VdbeMemRelease(pTo); VdbeMemReleaseExtern(pTo);
memcpy(pTo, pFrom, MEMCELLSIZE); memcpy(pTo, pFrom, MEMCELLSIZE);
pTo->xDel = 0; pTo->xDel = 0;
if( (pFrom->flags&MEM_Static)==0 ){ if( (pFrom->flags&MEM_Static)==0 ){
@@ -656,7 +677,7 @@ int sqlite3VdbeMemCopy(Mem *pTo, const Mem *pFrom){
int rc = SQLITE_OK; int rc = SQLITE_OK;
assert( (pFrom->flags & MEM_RowSet)==0 ); assert( (pFrom->flags & MEM_RowSet)==0 );
VdbeMemRelease(pTo); VdbeMemReleaseExtern(pTo);
memcpy(pTo, pFrom, MEMCELLSIZE); memcpy(pTo, pFrom, MEMCELLSIZE);
pTo->flags &= ~MEM_Dyn; pTo->flags &= ~MEM_Dyn;
pTo->xDel = 0; pTo->xDel = 0;