aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/alter.c6
-rw-r--r--src/attach.c6
-rw-r--r--src/build.c25
-rw-r--r--src/callback.c4
-rw-r--r--src/delete.c4
-rw-r--r--src/expr.c12
-rw-r--r--src/insert.c6
-rw-r--r--src/main.c24
-rw-r--r--src/os_unix.c22
-rw-r--r--src/os_win.c2
-rw-r--r--src/pager.c4
-rw-r--r--src/prepare.c18
-rw-r--r--src/select.c13
-rw-r--r--src/sqliteInt.h43
-rw-r--r--src/test1.c15
-rw-r--r--src/tokenize.c6
-rw-r--r--src/trigger.c8
-rw-r--r--src/update.c4
-rw-r--r--src/util.c93
-rw-r--r--src/vacuum.c4
-rw-r--r--src/vdbe.c12
-rw-r--r--src/vdbeapi.c2
-rw-r--r--src/vdbeaux.c12
-rw-r--r--src/vdbemem.c2
-rw-r--r--src/where.c8
25 files changed, 170 insertions, 185 deletions
diff --git a/src/alter.c b/src/alter.c
index 378c1288b..b33b0e71e 100644
--- a/src/alter.c
+++ b/src/alter.c
@@ -12,7 +12,7 @@
** This file contains C code routines that used to generate VDBE code
** that implements the ALTER TABLE command.
**
-** $Id: alter.c,v 1.17 2006/01/17 13:21:40 danielk1977 Exp $
+** $Id: alter.c,v 1.18 2006/01/18 16:51:35 danielk1977 Exp $
*/
#include "sqliteInt.h"
#include <ctype.h>
@@ -267,7 +267,7 @@ void sqlite3AlterRenameTable(
char *zWhere = 0; /* Where clause to locate temp triggers */
#endif
- if( sqlite3ThreadDataReadOnly()->mallocFailed ) goto exit_rename_table;
+ if( sqlite3MallocFailed() ) goto exit_rename_table;
assert( pSrc->nSrc==1 );
pTab = sqlite3LocateTable(pParse, pSrc->a[0].zName, pSrc->a[0].zDatabase);
@@ -501,7 +501,7 @@ void sqlite3AlterBeginAddColumn(Parse *pParse, SrcList *pSrc){
/* Look up the table being altered. */
assert( pParse->pNewTable==0 );
- if( sqlite3ThreadDataReadOnly()->mallocFailed ) goto exit_begin_add_column;
+ if( sqlite3MallocFailed() ) goto exit_begin_add_column;
pTab = sqlite3LocateTable(pParse, pSrc->a[0].zName, pSrc->a[0].zDatabase);
if( !pTab ) goto exit_begin_add_column;
diff --git a/src/attach.c b/src/attach.c
index 65628f5c8..26fc53101 100644
--- a/src/attach.c
+++ b/src/attach.c
@@ -11,7 +11,7 @@
*************************************************************************
** This file contains code used to implement the ATTACH and DETACH commands.
**
-** $Id: attach.c,v 1.47 2006/01/17 13:21:40 danielk1977 Exp $
+** $Id: attach.c,v 1.48 2006/01/18 16:51:35 danielk1977 Exp $
*/
#include "sqliteInt.h"
@@ -272,7 +272,7 @@ static void codeAttach(
sqlite3* db = pParse->db;
#ifndef SQLITE_OMIT_AUTHORIZATION
- assert( sqlite3ThreadDataReadOnly()->mallocFailed || pAuthArg );
+ assert( sqlite3MallocFailed() || pAuthArg );
if( pAuthArg ){
char *zAuthArg = sqlite3NameFromToken(&pAuthArg->span);
if( !zAuthArg ){
@@ -303,7 +303,7 @@ static void codeAttach(
sqlite3ExprCode(pParse, pDbname);
sqlite3ExprCode(pParse, pKey);
- assert(v || sqlite3ThreadDataReadOnly()->mallocFailed);
+ assert( v || sqlite3MallocFailed() );
if( v ){
sqlite3VdbeAddOp(v, OP_Function, 0, nFunc);
pFunc = sqlite3FindFunction(db, zFunc, strlen(zFunc), nFunc, SQLITE_UTF8,0);
diff --git a/src/build.c b/src/build.c
index f54c8d933..56be58dba 100644
--- a/src/build.c
+++ b/src/build.c
@@ -22,7 +22,7 @@
** COMMIT
** ROLLBACK
**
-** $Id: build.c,v 1.381 2006/01/16 15:14:28 danielk1977 Exp $
+** $Id: build.c,v 1.382 2006/01/18 16:51:35 danielk1977 Exp $
*/
#include "sqliteInt.h"
#include <ctype.h>
@@ -130,7 +130,7 @@ void sqlite3FinishCoding(Parse *pParse){
sqlite3 *db;
Vdbe *v;
- if( sqlite3ThreadDataReadOnly()->mallocFailed ) return;
+ if( sqlite3MallocFailed() ) return;
if( pParse->nested ) return;
if( !pParse->pVdbe ){
if( pParse->rc==SQLITE_OK && pParse->nErr ){
@@ -1364,8 +1364,7 @@ void sqlite3EndTable(
sqlite3 *db = pParse->db;
int iDb;
- if( (pEnd==0 && pSelect==0) ||
- pParse->nErr || sqlite3ThreadDataReadOnly()->mallocFailed ) {
+ if( (pEnd==0 && pSelect==0) || pParse->nErr || sqlite3MallocFailed() ) {
return;
}
p = pParse->pNewTable;
@@ -1607,7 +1606,7 @@ void sqlite3CreateView(
*/
p->pSelect = sqlite3SelectDup(pSelect);
sqlite3SelectDelete(pSelect);
- if( sqlite3ThreadDataReadOnly()->mallocFailed ){
+ if( sqlite3MallocFailed() ){
return;
}
if( !pParse->db->init.busy ){
@@ -1849,7 +1848,7 @@ void sqlite3DropTable(Parse *pParse, SrcList *pName, int isView, int noErr){
sqlite3 *db = pParse->db;
int iDb;
- if( pParse->nErr || sqlite3ThreadDataReadOnly()->mallocFailed ){
+ if( pParse->nErr || sqlite3MallocFailed() ){
goto exit_drop_table;
}
assert( pName->nSrc==1 );
@@ -2210,7 +2209,7 @@ void sqlite3CreateIndex(
int nExtra = 0;
char *zExtra;
- if( pParse->nErr || sqlite3ThreadDataReadOnly()->mallocFailed ){
+ if( pParse->nErr || sqlite3MallocFailed() ){
goto exit_create_index;
}
@@ -2364,7 +2363,7 @@ void sqlite3CreateIndex(
nName + 1 + /* Index.zName */
nExtra /* Collation sequence names */
);
- if( sqlite3ThreadDataReadOnly()->mallocFailed ) goto exit_create_index;
+ if( sqlite3MallocFailed() ) goto exit_create_index;
pIndex->aiColumn = (int *)(&pIndex[1]);
pIndex->aiRowEst = (unsigned *)(&pIndex->aiColumn[nCol]);
pIndex->azColl = (char **)(&pIndex->aiRowEst[nCol+1]);
@@ -2651,7 +2650,7 @@ void sqlite3DropIndex(Parse *pParse, SrcList *pName, int ifExists){
sqlite3 *db = pParse->db;
int iDb;
- if( pParse->nErr || sqlite3ThreadDataReadOnly()->mallocFailed ){
+ if( pParse->nErr || sqlite3MallocFailed() ){
goto exit_drop_index;
}
assert( pName->nSrc==1 );
@@ -2860,7 +2859,7 @@ SrcList *sqlite3SrcListAppend(SrcList *pList, Token *pTable, Token *pDatabase){
void sqlite3SrcListAssignCursors(Parse *pParse, SrcList *pList){
int i;
struct SrcList_item *pItem;
- assert(pList || sqlite3ThreadDataReadOnly()->mallocFailed);
+ assert(pList || sqlite3MallocFailed() );
if( pList ){
for(i=0, pItem=pList->a; i<pList->nSrc; i++, pItem++){
if( pItem->iCursor>=0 ) break;
@@ -2909,7 +2908,7 @@ void sqlite3BeginTransaction(Parse *pParse, int type){
int i;
if( pParse==0 || (db=pParse->db)==0 || db->aDb[0].pBt==0 ) return;
- if( pParse->nErr || sqlite3ThreadDataReadOnly()->mallocFailed ) return;
+ if( pParse->nErr || sqlite3MallocFailed() ) return;
if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION, "BEGIN", 0, 0) ) return;
v = sqlite3GetVdbe(pParse);
@@ -2930,7 +2929,7 @@ void sqlite3CommitTransaction(Parse *pParse){
Vdbe *v;
if( pParse==0 || (db=pParse->db)==0 || db->aDb[0].pBt==0 ) return;
- if( pParse->nErr || sqlite3ThreadDataReadOnly()->mallocFailed ) return;
+ if( pParse->nErr || sqlite3MallocFailed() ) return;
if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION, "COMMIT", 0, 0) ) return;
v = sqlite3GetVdbe(pParse);
@@ -2947,7 +2946,7 @@ void sqlite3RollbackTransaction(Parse *pParse){
Vdbe *v;
if( pParse==0 || (db=pParse->db)==0 || db->aDb[0].pBt==0 ) return;
- if( pParse->nErr || sqlite3ThreadDataReadOnly()->mallocFailed ) return;
+ if( pParse->nErr || sqlite3MallocFailed() ) return;
if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION, "ROLLBACK", 0, 0) ) return;
v = sqlite3GetVdbe(pParse);
diff --git a/src/callback.c b/src/callback.c
index c63b588aa..5847b66d0 100644
--- a/src/callback.c
+++ b/src/callback.c
@@ -13,7 +13,7 @@
** This file contains functions used to access the internal hash tables
** of user defined functions and collation sequences.
**
-** $Id: callback.c,v 1.11 2006/01/11 21:41:22 drh Exp $
+** $Id: callback.c,v 1.12 2006/01/18 16:51:35 danielk1977 Exp $
*/
#include "sqliteInt.h"
@@ -179,7 +179,7 @@ static CollSeq *findCollSeqEntry(
** to the hash table).
*/
assert( !pDel ||
- (sqlite3ThreadDataReadOnly()->mallocFailed && pDel==pColl) );
+ (sqlite3MallocFailed() && pDel==pColl) );
sqliteFree(pDel);
}
}
diff --git a/src/delete.c b/src/delete.c
index 1c85c4777..c742bc4ea 100644
--- a/src/delete.c
+++ b/src/delete.c
@@ -12,7 +12,7 @@
** This file contains C code routines that are called by the parser
** in order to generate code for DELETE FROM statements.
**
-** $Id: delete.c,v 1.118 2006/01/11 21:41:22 drh Exp $
+** $Id: delete.c,v 1.119 2006/01/18 16:51:35 danielk1977 Exp $
*/
#include "sqliteInt.h"
@@ -108,7 +108,7 @@ void sqlite3DeleteFrom(
#endif
sContext.pParse = 0;
- if( pParse->nErr || sqlite3ThreadDataReadOnly()->mallocFailed ){
+ if( pParse->nErr || sqlite3MallocFailed() ){
goto delete_from_cleanup;
}
db = pParse->db;
diff --git a/src/expr.c b/src/expr.c
index e8a89f464..724cee9f1 100644
--- a/src/expr.c
+++ b/src/expr.c
@@ -12,7 +12,7 @@
** This file contains routines used for analyzing expressions and
** for generating VDBE code that evaluates expressions in SQLite.
**
-** $Id: expr.c,v 1.249 2006/01/13 06:33:24 danielk1977 Exp $
+** $Id: expr.c,v 1.250 2006/01/18 16:51:35 danielk1977 Exp $
*/
#include "sqliteInt.h"
#include <ctype.h>
@@ -263,7 +263,7 @@ Expr *sqlite3ExprAnd(Expr *pLeft, Expr *pRight){
void sqlite3ExprSpan(Expr *pExpr, Token *pLeft, Token *pRight){
assert( pRight!=0 );
assert( pLeft!=0 );
- if( !sqlite3ThreadDataReadOnly()->mallocFailed && pRight->z && pLeft->z ){
+ if( !sqlite3MallocFailed() && pRight->z && pLeft->z ){
assert( pLeft->dyn==0 || pLeft->z[pLeft->n]==0 );
if( pLeft->dyn==0 && pRight->dyn==0 ){
pExpr->span.z = pLeft->z;
@@ -358,7 +358,7 @@ void sqlite3ExprAssignVarNumber(Parse *pParse, Expr *pExpr){
sqliteReallocOrFree((void**)&pParse->apVarExpr,
pParse->nVarExprAlloc*sizeof(pParse->apVarExpr[0]) );
}
- if( !sqlite3ThreadDataReadOnly()->mallocFailed ){
+ if( !sqlite3MallocFailed() ){
assert( pParse->apVarExpr!=0 );
pParse->apVarExpr[pParse->nVarExpr++] = pExpr;
}
@@ -463,7 +463,7 @@ ExprList *sqlite3ExprListDup(ExprList *p){
}
assert( pNewExpr==0 || pNewExpr->span.z!=0
|| pOldExpr->span.z==0
- || sqlite3ThreadDataReadOnly()->mallocFailed );
+ || sqlite3MallocFailed() );
pItem->zName = sqliteStrDup(pOldItem->zName);
pItem->sortOrder = pOldItem->sortOrder;
pItem->isAgg = pOldItem->isAgg;
@@ -832,7 +832,7 @@ static int lookupName(
zDb = sqlite3NameFromToken(pDbToken);
zTab = sqlite3NameFromToken(pTableToken);
zCol = sqlite3NameFromToken(pColumnToken);
- if( sqlite3ThreadDataReadOnly()->mallocFailed ){
+ if( sqlite3MallocFailed() ){
goto lookupname_end;
}
@@ -1309,7 +1309,7 @@ void sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){
int mem = pParse->nMem++;
sqlite3VdbeAddOp(v, OP_MemLoad, mem, 0);
testAddr = sqlite3VdbeAddOp(v, OP_If, 0, 0);
- assert( testAddr>0 || sqlite3ThreadDataReadOnly()->mallocFailed );
+ assert( testAddr>0 || sqlite3MallocFailed() );
sqlite3VdbeAddOp(v, OP_MemInt, 1, mem);
}
diff --git a/src/insert.c b/src/insert.c
index e24968690..d38e24f92 100644
--- a/src/insert.c
+++ b/src/insert.c
@@ -12,7 +12,7 @@
** This file contains C code routines that are called by the parser
** to handle INSERT statements in SQLite.
**
-** $Id: insert.c,v 1.157 2006/01/11 21:41:22 drh Exp $
+** $Id: insert.c,v 1.158 2006/01/18 16:51:35 danielk1977 Exp $
*/
#include "sqliteInt.h"
@@ -225,7 +225,7 @@ void sqlite3Insert(
int counterRowid; /* Memory cell holding rowid of autoinc counter */
#endif
- if( pParse->nErr || sqlite3ThreadDataReadOnly()->mallocFailed ){
+ if( pParse->nErr || sqlite3MallocFailed() ){
goto insert_cleanup;
}
db = pParse->db;
@@ -333,7 +333,7 @@ void sqlite3Insert(
/* Resolve the expressions in the SELECT statement and execute it. */
rc = sqlite3Select(pParse, pSelect, SRT_Subroutine, iInsertBlock,0,0,0,0);
- if( rc || pParse->nErr || sqlite3ThreadDataReadOnly()->mallocFailed ){
+ if( rc || pParse->nErr || sqlite3MallocFailed() ){
goto insert_cleanup;
}
diff --git a/src/main.c b/src/main.c
index c2822a7e5..504e1ffda 100644
--- a/src/main.c
+++ b/src/main.c
@@ -14,7 +14,7 @@
** other files are for internal use by SQLite and should not be
** accessed by users of the library.
**
-** $Id: main.c,v 1.327 2006/01/18 15:25:17 danielk1977 Exp $
+** $Id: main.c,v 1.328 2006/01/18 16:51:35 danielk1977 Exp $
*/
#include "sqliteInt.h"
#include "os.h"
@@ -450,7 +450,7 @@ int sqlite3CreateFunc(
if( db->activeVdbeCnt ){
sqlite3Error(db, SQLITE_BUSY,
"Unable to delete/modify user-function due to active statements");
- assert( !sqlite3ThreadDataReadOnly()->mallocFailed );
+ assert( !sqlite3MallocFailed() );
return SQLITE_BUSY;
}else{
sqlite3ExpirePreparedStatements(db);
@@ -482,7 +482,7 @@ int sqlite3_create_function(
void (*xFinal)(sqlite3_context*)
){
int rc;
- assert( !sqlite3ThreadDataReadOnly()->mallocFailed );
+ assert( !sqlite3MallocFailed() );
rc = sqlite3CreateFunc(db, zFunctionName, nArg, enc, p, xFunc, xStep, xFinal);
return sqlite3ApiExit(db, rc);
@@ -501,7 +501,7 @@ int sqlite3_create_function16(
){
int rc;
char *zFunc8;
- assert( !sqlite3ThreadDataReadOnly()->mallocFailed );
+ assert( !sqlite3MallocFailed() );
zFunc8 = sqlite3utf16to8(zFunctionName, -1);
rc = sqlite3CreateFunc(db, zFunc8, nArg, eTextRep, p, xFunc, xStep, xFinal);
@@ -666,7 +666,7 @@ int sqlite3BtreeFactory(
*/
const char *sqlite3_errmsg(sqlite3 *db){
const char *z;
- if( !db || sqlite3ThreadDataReadOnly()->mallocFailed ){
+ if( !db || sqlite3MallocFailed() ){
return sqlite3ErrStr(SQLITE_NOMEM);
}
if( sqlite3SafetyCheck(db) || db->errCode==SQLITE_MISUSE ){
@@ -705,7 +705,7 @@ const void *sqlite3_errmsg16(sqlite3 *db){
};
const void *z;
- if( sqlite3ThreadDataReadOnly()->mallocFailed ){
+ if( sqlite3MallocFailed() ){
return (void *)(&outOfMemBe[SQLITE_UTF16NATIVE==SQLITE_UTF16LE?1:0]);
}
if( sqlite3SafetyCheck(db) || db->errCode==SQLITE_MISUSE ){
@@ -727,7 +727,7 @@ const void *sqlite3_errmsg16(sqlite3 *db){
** passed to this function, we assume a malloc() failed during sqlite3_open().
*/
int sqlite3_errcode(sqlite3 *db){
- if( !db || sqlite3ThreadDataReadOnly()->mallocFailed ){
+ if( !db || sqlite3MallocFailed() ){
return SQLITE_NOMEM;
}
if( sqlite3SafetyCheck(db) ){
@@ -803,7 +803,7 @@ static int openDatabase(
int rc;
CollSeq *pColl;
- assert( !sqlite3ThreadDataReadOnly()->mallocFailed );
+ assert( !sqlite3MallocFailed() );
/* Allocate the sqlite data structure */
db = sqliteMalloc( sizeof(sqlite3) );
@@ -825,7 +825,7 @@ static int openDatabase(
createCollation(db, "BINARY", SQLITE_UTF16, 0,binCollFunc) ||
(db->pDfltColl = sqlite3FindCollSeq(db, SQLITE_UTF8, "BINARY", 6, 0))==0
){
- assert( sqlite3ThreadDataReadOnly()->mallocFailed );
+ assert( sqlite3MallocFailed() );
db->magic = SQLITE_MAGIC_CLOSED;
goto opendb_out;
}
@@ -870,7 +870,7 @@ static int openDatabase(
** database schema yet. This is delayed until the first time the database
** is accessed.
*/
- if( !sqlite3ThreadDataReadOnly()->mallocFailed ){
+ if( !sqlite3MallocFailed() ){
sqlite3RegisterBuiltinFunctions(db);
sqlite3Error(db, SQLITE_OK, 0);
}
@@ -978,7 +978,7 @@ int sqlite3_create_collation(
int(*xCompare)(void*,int,const void*,int,const void*)
){
int rc;
- assert( !sqlite3ThreadDataReadOnly()->mallocFailed );
+ assert( !sqlite3MallocFailed() );
rc = createCollation(db, zName, enc, pCtx, xCompare);
return sqlite3ApiExit(db, rc);
}
@@ -996,7 +996,7 @@ int sqlite3_create_collation16(
){
int rc = SQLITE_OK;
char *zName8;
- assert( !sqlite3ThreadDataReadOnly()->mallocFailed );
+ assert( !sqlite3MallocFailed() );
zName8 = sqlite3utf16to8(zName, -1);
if( zName8 ){
rc = createCollation(db, zName8, enc, pCtx, xCompare);
diff --git a/src/os_unix.c b/src/os_unix.c
index 5257bfd5e..eb570671f 100644
--- a/src/os_unix.c
+++ b/src/os_unix.c
@@ -1739,20 +1739,6 @@ int sqlite3_tsd_count = 0;
# define TSD_COUNTER(N) /* no-op */
#endif
-#if 0 && defined(SQLITE_MEMDEBUG)
-static void *mallocThreadData(size_t nBytes){
- if( sqlite3_iMallocFail>=0 ){
- sqlite3_iMallocFail--;
- if( sqlite3_iMallocFail==0 ){
- return 0;
- }
- }
- return sqlite3OsMalloc(nBytes);
-}
-#else
- #define mallocThreadData(x) sqlite3OsMalloc(x)
-#endif
-
/*
** If called with allocateFlag>0, then return a pointer to thread
** specific data for the current thread. Allocate and zero the
@@ -1791,7 +1777,7 @@ ThreadData *sqlite3UnixThreadSpecificData(int allocateFlag){
pTsd = pthread_getspecific(key);
if( allocateFlag>0 ){
if( pTsd==0 ){
- pTsd = mallocThreadData(sizeof(zeroData));
+ pTsd = sqlite3OsMalloc(sizeof(zeroData));
if( pTsd ){
*pTsd = zeroData;
pthread_setspecific(key, pTsd);
@@ -1799,7 +1785,7 @@ ThreadData *sqlite3UnixThreadSpecificData(int allocateFlag){
}
}
}else if( pTsd!=0 && allocateFlag<0
- && memcmp(pTsd, &zeroData, THREADDATASIZE)==0 ){
+ && memcmp(pTsd, &zeroData, sizeof(ThreadData))==0 ){
sqlite3OsFree(pTsd);
pthread_setspecific(key, 0);
TSD_COUNTER(-1);
@@ -1810,14 +1796,14 @@ ThreadData *sqlite3UnixThreadSpecificData(int allocateFlag){
static ThreadData *pTsd = 0;
if( allocateFlag>0 ){
if( pTsd==0 ){
- pTsd = mallocThreadData( sizeof(zeroData) );
+ pTsd = sqlite3OsMalloc( sizeof(zeroData) );
if( pTsd ){
*pTsd = zeroData;
TSD_COUNTER(+1);
}
}
}else if( pTsd!=0 && allocateFlag<0
- && memcmp(pTsd, &zeroData, THREADDATASIZE)==0 ){
+ && memcmp(pTsd, &zeroData, sizeof(ThreadData))==0 ){
sqlite3OsFree(pTsd);
TSD_COUNTER(-1);
pTsd = 0;
diff --git a/src/os_win.c b/src/os_win.c
index 2d2341a08..ae0c254d7 100644
--- a/src/os_win.c
+++ b/src/os_win.c
@@ -1212,7 +1212,7 @@ ThreadData *sqlite3WinThreadSpecificData(int allocateFlag){
}
}
}else if( pTsd!=0 && allocateFlag<0
- && memcmp(pTsd, &zeroData, THREADDATASIZE)==0 ){
+ && memcmp(pTsd, &zeroData, sizeof(ThreadData))==0 ){
sqlite3OsFree(pTsd);
TlsSetValue(key, 0);
TSD_COUNTER_DECR;
diff --git a/src/pager.c b/src/pager.c
index 0425a4419..de39123db 100644
--- a/src/pager.c
+++ b/src/pager.c
@@ -18,7 +18,7 @@
** file simultaneously, or one process from reading the database while
** another is writing.
**
-** @(#) $Id: pager.c,v 1.242 2006/01/18 15:25:17 danielk1977 Exp $
+** @(#) $Id: pager.c,v 1.243 2006/01/18 16:51:35 danielk1977 Exp $
*/
#ifndef SQLITE_OMIT_DISKIO
#include "sqliteInt.h"
@@ -1593,7 +1593,7 @@ int sqlite3pager_open(
** structure was never allocated.
*/
*ppPager = 0;
- if( sqlite3ThreadDataReadOnly()->mallocFailed ){
+ if( sqlite3MallocFailed() ){
return SQLITE_NOMEM;
}
memset(&fd, 0, sizeof(fd));
diff --git a/src/prepare.c b/src/prepare.c
index cd82f1a31..b60778365 100644
--- a/src/prepare.c
+++ b/src/prepare.c
@@ -13,7 +13,7 @@
** interface, and routines that contribute to loading the database schema
** from disk.
**
-** $Id: prepare.c,v 1.25 2006/01/18 15:25:18 danielk1977 Exp $
+** $Id: prepare.c,v 1.26 2006/01/18 16:51:35 danielk1977 Exp $
*/
#include "sqliteInt.h"
#include "os.h"
@@ -24,7 +24,7 @@
** that the database is corrupt.
*/
static void corruptSchema(InitData *pData, const char *zExtra){
- if( !sqlite3ThreadDataReadOnly()->mallocFailed ){
+ if( !sqlite3MallocFailed() ){
sqlite3SetString(pData->pzErrMsg, "malformed database schema",
zExtra!=0 && zExtra[0]!=0 ? " - " : (char*)0, zExtra, (char*)0);
}
@@ -49,7 +49,7 @@ int sqlite3InitCallback(void *pInit, int argc, char **argv, char **azColName){
sqlite3 *db = pData->db;
int iDb;
- if( sqlite3ThreadDataReadOnly()->mallocFailed ){
+ if( sqlite3MallocFailed() ){
return SQLITE_NOMEM;
}
@@ -76,9 +76,9 @@ int sqlite3InitCallback(void *pInit, int argc, char **argv, char **azColName){
db->init.iDb = 0;
if( SQLITE_OK!=rc ){
if( rc==SQLITE_NOMEM ){
- sqlite3ThreadData()->mallocFailed = 1;
+ sqlite3FailedMalloc();
}else{
- corruptSchema(pData, zErr);
+ corruptSchema(pData, zErr);
}
sqlite3_free(zErr);
return rc;
@@ -303,8 +303,8 @@ static int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg){
#endif
sqlite3BtreeCloseCursor(curMain);
}
- if( sqlite3ThreadDataReadOnly()->mallocFailed ){
- sqlite3SetString(pzErrMsg, "out of memory", (char*)0);
+ if( sqlite3MallocFailed() ){
+ /* sqlite3SetString(pzErrMsg, "out of memory", (char*)0); */
rc = SQLITE_NOMEM;
sqlite3ResetInternalSchema(db, 0);
}
@@ -496,7 +496,7 @@ int sqlite3_prepare(
int i;
/* Assert that malloc() has not failed */
- assert( !sqlite3ThreadDataReadOnly()->mallocFailed );
+ assert( !sqlite3MallocFailed() );
assert( ppStmt );
*ppStmt = 0;
@@ -523,7 +523,7 @@ int sqlite3_prepare(
sParse.pTsd->nRef++;
sqlite3RunParser(&sParse, zSql, &zErrMsg);
- if( sParse.pTsd->mallocFailed ){
+ if( sqlite3MallocFailed() ){
sParse.rc = SQLITE_NOMEM;
}
if( sParse.rc==SQLITE_DONE ) sParse.rc = SQLITE_OK;
diff --git a/src/select.c b/src/select.c
index 4bfe81d14..4a50c65ee 100644
--- a/src/select.c
+++ b/src/select.c
@@ -12,7 +12,7 @@
** This file contains C code routines that are called by the parser
** to handle SELECT statements in SQLite.
**
-** $Id: select.c,v 1.294 2006/01/13 06:33:24 danielk1977 Exp $
+** $Id: select.c,v 1.295 2006/01/18 16:51:35 danielk1977 Exp $
*/
#include "sqliteInt.h"
@@ -872,8 +872,7 @@ static void generateColumnNames(
#endif
assert( v!=0 );
- if( pParse->colNamesSet || v==0
- || sqlite3ThreadDataReadOnly()->mallocFailed ) return;
+ if( pParse->colNamesSet || v==0 || sqlite3MallocFailed() ) return;
pParse->colNamesSet = 1;
fullNames = (db->flags & SQLITE_FullColNames)!=0;
shortNames = (db->flags & SQLITE_ShortColNames)!=0;
@@ -1002,7 +1001,7 @@ Table *sqlite3ResultSetOfSelect(Parse *pParse, char *zTabName, Select *pSelect){
zName = sqlite3MPrintf("column%d", i+1);
}
sqlite3Dequote(zName);
- if( sqlite3ThreadDataReadOnly()->mallocFailed ){
+ if( sqlite3MallocFailed() ){
sqliteFree(zName);
sqlite3DeleteTable(0, pTab);
return 0;
@@ -1074,7 +1073,7 @@ static int prepSelectStmt(Parse *pParse, Select *p){
Table *pTab;
struct SrcList_item *pFrom;
- if( p==0 || p->pSrc==0 || sqlite3ThreadDataReadOnly()->mallocFailed ){
+ if( p==0 || p->pSrc==0 || sqlite3MallocFailed() ){
return 1;
}
pTabList = p->pSrc;
@@ -2693,7 +2692,7 @@ int sqlite3Select(
AggInfo sAggInfo; /* Information used by aggregate queries */
int iEnd; /* Address of the end of the query */
- if( p==0 || sqlite3ThreadDataReadOnly()->mallocFailed || pParse->nErr ){
+ if( p==0 || sqlite3MallocFailed() || pParse->nErr ){
return 1;
}
if( sqlite3AuthCheck(pParse, SQLITE_SELECT, 0, 0, 0) ) return 1;
@@ -2949,7 +2948,7 @@ int sqlite3Select(
goto select_end;
}
}
- if( sqlite3ThreadDataReadOnly()->mallocFailed ) goto select_end;
+ if( sqlite3MallocFailed() ) goto select_end;
/* Processing for aggregates with GROUP BY is very different and
** much more complex tha aggregates without a GROUP BY.
diff --git a/src/sqliteInt.h b/src/sqliteInt.h
index 4bb2c14e5..45854dc54 100644
--- a/src/sqliteInt.h
+++ b/src/sqliteInt.h
@@ -11,7 +11,7 @@
*************************************************************************
** Internal interface definitions for SQLite.
**
-** @(#) $Id: sqliteInt.h,v 1.473 2006/01/18 15:25:18 danielk1977 Exp $
+** @(#) $Id: sqliteInt.h,v 1.474 2006/01/18 16:51:35 danielk1977 Exp $
*/
#ifndef _SQLITEINT_H_
#define _SQLITEINT_H_
@@ -261,9 +261,16 @@ extern int sqlite3_nMalloc; /* Number of sqliteMalloc() calls */
extern int sqlite3_nFree; /* Number of sqliteFree() calls */
extern int sqlite3_iMallocFail; /* Fail sqliteMalloc() after this many calls */
extern int sqlite3_iMallocReset; /* Set iMallocFail to this when it reaches 0 */
-#define ENTER_MALLOC (\
- sqlite3ThreadData()->zFile = __FILE__, sqlite3ThreadData()->iLine = __LINE__ \
-)
+
+
+extern void *sqlite3_pFirst; /* Pointer to linked list of allocations */
+extern int sqlite3_nMaxAlloc; /* High water mark of ThreadData.nAlloc */
+extern int sqlite3_mallocDisallowed; /* assert() in sqlite3Malloc() if set */
+extern int sqlite3_isFail; /* True if all malloc calls should fail */
+extern const char *sqlite3_zFile; /* Filename to associate debug info with */
+extern int sqlite3_iLine; /* Line number for debug info */
+
+#define ENTER_MALLOC (sqlite3_zFile = __FILE__, sqlite3_iLine = __LINE__)
#define sqliteMalloc(x) (ENTER_MALLOC, sqlite3Malloc(x))
#define sqliteMallocRaw(x) (ENTER_MALLOC, sqlite3MallocRaw(x))
#define sqliteRealloc(x,y) (ENTER_MALLOC, sqlite3Realloc(x,y))
@@ -295,7 +302,6 @@ extern int sqlite3_iMallocReset; /* Set iMallocFail to this when it reaches 0 */
** is deallocated.
*/
struct ThreadData {
- int mallocFailed; /* True after a malloc() has failed */
int nRef; /* Number of users */
#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
@@ -308,34 +314,9 @@ struct ThreadData {
u8 useSharedData; /* True if shared pagers and schemas are enabled */
BtShared *pBtree; /* Linked list of all currently open BTrees */
#endif
-
-#ifdef SQLITE_MEMDEBUG
- void *pFirst; /* Pointer to linked list of allocations */
- int nMaxAlloc; /* High water mark of ThreadData.nAlloc */
- int mallocDisallowed; /* assert() in sqlite3Malloc() if set */
- int isFail; /* True if all malloc() calls should fail */
- const char *zFile; /* Filename to associate debugging info with */
- int iLine; /* Line number to associate debugging info with */
-#endif
};
/*
-** The THREADDATASIZE macro is used by the system that automatically
-** deallocates ThreadData structures. If the first THREADDATASIZE bytes
-** of a ThreadData structure are all zero, then the structure is eligible
-** for deallocation.
-**
-** Usually, THREADDATASIZE is set to the size of the structure. However
-** if SQLITE_MEMDEBUG is defined, all variables declared after the
-** ThreadData.pFirst variable are excluded.
-*/
-#ifdef SQLITE_MEMDEBUG
- #define THREADDATASIZE (int)(&(((ThreadData *)0)->nMaxAlloc))
-#else
- #define THREADDATASIZE sizeof(ThreadData)
-#endif
-
-/*
** Name of the master database table. The master database table
** is a special table that holds the names and attributes of all
** user tables and indices.
@@ -1766,6 +1747,8 @@ int sqlite3CreateFunc(sqlite3 *, const char *, int, int, void *,
void (*)(sqlite3_context*,int,sqlite3_value **),
void (*)(sqlite3_context*,int,sqlite3_value **), void (*)(sqlite3_context*));
int sqlite3ApiExit(sqlite3 *db, int);
+int sqlite3MallocFailed();
+void sqlite3FailedMalloc();
#ifndef SQLITE_OMIT_SHARED_CACHE
void sqlite3TableLock(Parse *, int, int, u8, const char *);
diff --git a/src/test1.c b/src/test1.c
index ba2467f5e..018b17391 100644
--- a/src/test1.c
+++ b/src/test1.c
@@ -13,7 +13,7 @@
** is not included in the SQLite library. It is used for automated
** testing of the SQLite library.
**
-** $Id: test1.c,v 1.195 2006/01/18 05:51:58 danielk1977 Exp $
+** $Id: test1.c,v 1.196 2006/01/18 16:51:35 danielk1977 Exp $
*/
#include "sqliteInt.h"
#include "tcl.h"
@@ -834,7 +834,8 @@ static int sqlite3_mprintf_hexdouble(
** first failure will continue to fail on every call. If REPEAT-INTERVAL is
** 2 then every other malloc will fail. And so forth.
**
-** Turn off this mechanism and reset the sqlite3ThreadData()->mallocFailed variable is N==0.
+** Turn off this mechanism and reset the sqlite3ThreadData()->mallocFailed
+** variable if N==0.
*/
#ifdef SQLITE_MEMDEBUG
static int sqlite_malloc_fail(
@@ -915,9 +916,9 @@ static int sqlite_malloc_outstanding(
if( 0==strcmp(zArg, "-bytes") ){
Tcl_SetObjResult(interp, Tcl_NewIntObj(pTd->nAlloc));
}else if( 0==strcmp(zArg, "-maxbytes") ){
- Tcl_SetObjResult(interp, Tcl_NewWideIntObj(pTd->nMaxAlloc));
+ Tcl_SetObjResult(interp, Tcl_NewWideIntObj(sqlite3_nMaxAlloc));
}else if( 0==strcmp(zArg, "-clearmaxbytes") ){
- pTd->nMaxAlloc = pTd->nAlloc;
+ sqlite3_nMaxAlloc = pTd->nAlloc;
}else{
Tcl_AppendResult(interp, "bad option \"", zArg,
"\": must be -bytes, -maxbytes or -clearmaxbytes", 0
@@ -3031,12 +3032,6 @@ static int test_clear_tsd_memdebug(
int objc,
Tcl_Obj *CONST objv[]
){
-#if defined(SQLITE_MEMDEBUG)
- ThreadData *pTd = sqlite3ThreadData();
- pTd->nMaxAlloc = 0;
- pTd->zFile = 0;
- pTd->iLine = 0;
-#endif
return TCL_OK;
}
diff --git a/src/tokenize.c b/src/tokenize.c
index 86e526a9e..339979dfb 100644
--- a/src/tokenize.c
+++ b/src/tokenize.c
@@ -15,7 +15,7 @@
** individual tokens and sends those tokens one-by-one over to the
** parser for analysis.
**
-** $Id: tokenize.c,v 1.114 2006/01/12 12:43:36 drh Exp $
+** $Id: tokenize.c,v 1.115 2006/01/18 16:51:36 danielk1977 Exp $
*/
#include "sqliteInt.h"
#include "os.h"
@@ -359,7 +359,7 @@ int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzErrMsg){
assert( pParse->nVarExprAlloc==0 );
assert( pParse->apVarExpr==0 );
pParse->zTail = pParse->zSql = zSql;
- while( pTsd->mallocFailed==0 && zSql[i]!=0 ){
+ while( !sqlite3MallocFailed() && zSql[i]!=0 ){
assert( i>=0 );
pParse->sLastToken.z = (u8*)&zSql[i];
assert( pParse->sLastToken.dyn==0 );
@@ -407,7 +407,7 @@ abort_parse:
sqlite3Parser(pEngine, 0, pParse->sLastToken, pParse);
}
sqlite3ParserFree(pEngine, sqlite3FreeX);
- if( pTsd->mallocFailed ){
+ if( sqlite3MallocFailed() ){
pParse->rc = SQLITE_NOMEM;
}
if( pParse->rc!=SQLITE_OK && pParse->rc!=SQLITE_DONE && pParse->zErrMsg==0 ){
diff --git a/src/trigger.c b/src/trigger.c
index 6a031c0bd..15bbc992e 100644
--- a/src/trigger.c
+++ b/src/trigger.c
@@ -81,7 +81,7 @@ void sqlite3BeginTrigger(
** If sqlite3SrcListLookup() returns 0, indicating the table does not
** exist, the error is caught by the block below.
*/
- if( !pTableName || sqlite3ThreadDataReadOnly()->mallocFailed ){
+ if( !pTableName || sqlite3MallocFailed() ){
goto trigger_cleanup;
}
pTab = sqlite3SrcListLookup(pParse, pTableName);
@@ -90,7 +90,7 @@ void sqlite3BeginTrigger(
}
/* Ensure the table name matches database name and that the table exists */
- if( sqlite3ThreadDataReadOnly()->mallocFailed ) goto trigger_cleanup;
+ if( sqlite3MallocFailed() ) goto trigger_cleanup;
assert( pTableName->nSrc==1 );
if( sqlite3FixInit(&sFix, pParse, iDb, "trigger", pName) &&
sqlite3FixSrcList(&sFix, pTableName) ){
@@ -257,7 +257,7 @@ void sqlite3FinishTrigger(
pDel = sqlite3HashInsert(&db->aDb[iDb].pSchema->trigHash,
pTrig->name, strlen(pTrig->name)+1, pTrig);
if( pDel ){
- assert( sqlite3ThreadDataReadOnly()->mallocFailed && pDel==pTrig );
+ assert( sqlite3MallocFailed() && pDel==pTrig );
goto triggerfinish_cleanup;
}
n = strlen(pTrig->table) + 1;
@@ -441,7 +441,7 @@ void sqlite3DropTrigger(Parse *pParse, SrcList *pName){
int nName;
sqlite3 *db = pParse->db;
- if( sqlite3ThreadDataReadOnly()->mallocFailed ) goto drop_trigger_cleanup;
+ if( sqlite3MallocFailed() ) goto drop_trigger_cleanup;
if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){
goto drop_trigger_cleanup;
}
diff --git a/src/update.c b/src/update.c
index 944ac039b..83084d7ed 100644
--- a/src/update.c
+++ b/src/update.c
@@ -12,7 +12,7 @@
** This file contains C code routines that are called by the parser
** to handle UPDATE statements.
**
-** $Id: update.c,v 1.120 2006/01/11 21:41:22 drh Exp $
+** $Id: update.c,v 1.121 2006/01/18 16:51:36 danielk1977 Exp $
*/
#include "sqliteInt.h"
@@ -100,7 +100,7 @@ void sqlite3Update(
int oldIdx = -1; /* index of trigger "old" temp table */
sContext.pParse = 0;
- if( pParse->nErr || sqlite3ThreadDataReadOnly()->mallocFailed ){
+ if( pParse->nErr || sqlite3MallocFailed() ){
goto update_cleanup;
}
db = pParse->db;
diff --git a/src/util.c b/src/util.c
index 1670d1966..3f88da85c 100644
--- a/src/util.c
+++ b/src/util.c
@@ -14,7 +14,7 @@
** This file contains functions for allocating memory, comparing
** strings, and stuff like that.
**
-** $Id: util.c,v 1.175 2006/01/18 15:39:26 danielk1977 Exp $
+** $Id: util.c,v 1.176 2006/01/18 16:51:36 danielk1977 Exp $
*/
#include "sqliteInt.h"
#include "os.h"
@@ -196,20 +196,27 @@ int sqlite3_memMax; /* TODO Mem usage high-water mark */
int sqlite3_iMallocFail; /* Fail sqliteMalloc() after this many calls */
int sqlite3_iMallocReset = -1; /* When iMallocFail reaches 0, set to this */
+void *sqlite3_pFirst = 0; /* Pointer to linked list of allocations */
+int sqlite3_nMaxAlloc = 0; /* High water mark of ThreadData.nAlloc */
+int sqlite3_mallocDisallowed = 0; /* assert() in sqlite3Malloc() if set */
+int sqlite3_isFail = 0; /* True if all malloc calls should fail */
+const char *sqlite3_zFile = 0; /* Filename to associate debug info with */
+int sqlite3_iLine = 0; /* Line number for debug info */
+
/*
** Check for a simulated memory allocation failure. Return true if
** the failure should be simulated. Return false to proceed as normal.
*/
static int failMalloc(){
ThreadData *pTsd = sqlite3ThreadData();
- if( pTsd->isFail ){
+ if( sqlite3_isFail ){
return 1;
}
if( sqlite3_iMallocFail>=0 ){
sqlite3_iMallocFail--;
if( sqlite3_iMallocFail==0 ){
sqlite3_iMallocFail = sqlite3_iMallocReset;
- pTsd->isFail = 1;
+ sqlite3_isFail = 1;
return 1;
}
}
@@ -269,11 +276,11 @@ static void applyGuards(u32 *p)
/* Line number */
z = &((char *)z)[TESTALLOC_NGUARD*sizeof(u32)]; /* Guard words */
z = &zAlloc[TESTALLOC_OFFSET_LINENUMBER(p)];
- memcpy(z, &sqlite3ThreadData()->iLine, sizeof(u32));
+ memcpy(z, &sqlite3_iLine, sizeof(u32));
/* File name */
z = &zAlloc[TESTALLOC_OFFSET_FILENAME(p)];
- strncpy(z, sqlite3ThreadData()->zFile, TESTALLOC_FILESIZE);
+ strncpy(z, sqlite3_zFile, TESTALLOC_FILESIZE);
z[TESTALLOC_FILESIZE - 1] = '\0';
/* User string */
@@ -312,11 +319,11 @@ static void linkAlloc(void *p){
ThreadData *pTsd = sqlite3ThreadData();
void **pp = (void **)p;
pp[0] = 0;
- pp[1] = pTsd->pFirst;
- if( pTsd->pFirst ){
- ((void **)pTsd->pFirst)[0] = p;
+ pp[1] = sqlite3_pFirst;
+ if( sqlite3_pFirst ){
+ ((void **)sqlite3_pFirst)[0] = p;
}
- pTsd->pFirst = p;
+ sqlite3_pFirst = p;
}
/*
@@ -327,12 +334,12 @@ static void unlinkAlloc(void *p)
{
ThreadData *pTsd = sqlite3ThreadData();
void **pp = (void **)p;
- if( p==pTsd->pFirst ){
+ if( p==sqlite3_pFirst ){
assert(!pp[0]);
assert(!pp[1] || ((void **)(pp[1]))[0]==p);
- pTsd->pFirst = pp[1];
- if( pTsd->pFirst ){
- ((void **)pTsd->pFirst)[0] = 0;
+ sqlite3_pFirst = pp[1];
+ if( sqlite3_pFirst ){
+ ((void **)sqlite3_pFirst)[0] = 0;
}
}else{
void **pprev = pp[0];
@@ -359,7 +366,7 @@ static void relinkAlloc(void *p)
((void **)(pp[0]))[1] = p;
}else{
ThreadData *pTsd = sqlite3ThreadData();
- pTsd->pFirst = p;
+ sqlite3_pFirst = p;
}
if( pp[1] ){
((void **)(pp[1]))[0] = p;
@@ -394,7 +401,7 @@ int sqlite3OutstandingMallocs(Tcl_Interp *interp){
Tcl_Obj *pRes = Tcl_NewObj();
Tcl_IncrRefCount(pRes);
- for(p=pTsd->pFirst; p; p=((void **)p)[1]){
+ for(p=sqlite3_pFirst; p; p=((void **)p)[1]){
Tcl_Obj *pEntry = Tcl_NewObj();
Tcl_Obj *pStack = Tcl_NewObj();
char *z;
@@ -439,9 +446,9 @@ int sqlite3OutstandingMallocs(Tcl_Interp *interp){
static void * OSMALLOC(int n){
#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
ThreadData *pTsd = sqlite3ThreadData();
- pTsd->nMaxAlloc = MAX(pTsd->nMaxAlloc, pTsd->nAlloc);
+ sqlite3_nMaxAlloc = MAX(sqlite3_nMaxAlloc, pTsd->nAlloc);
#endif
- assert( !sqlite3ThreadData()->mallocDisallowed );
+ assert( !sqlite3_mallocDisallowed );
if( !failMalloc() ){
u32 *p;
p = (u32 *)sqlite3OsMalloc(n + TESTALLOC_OVERHEAD);
@@ -481,9 +488,9 @@ static void OSFREE(void *pFree){
static void * OSREALLOC(void *pRealloc, int n){
#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
ThreadData *pTsd = sqlite3ThreadData();
- pTsd->nMaxAlloc = MAX(pTsd->nMaxAlloc, pTsd->nAlloc);
+ sqlite3_nMaxAlloc = MAX(sqlite3_nMaxAlloc, pTsd->nAlloc);
#endif
- assert( !sqlite3ThreadData()->mallocDisallowed );
+ assert( !sqlite3_mallocDisallowed );
if( !failMalloc() ){
u32 *p = (u32 *)getOsPointer(pRealloc);
checkGuards(p);
@@ -496,7 +503,7 @@ static void * OSREALLOC(void *pRealloc, int n){
}
static void OSMALLOC_FAILED(){
- sqlite3ThreadData()->isFail = 0;
+ sqlite3_isFail = 0;
}
#else
@@ -549,7 +556,7 @@ static void handleSoftLimit(int n){
*/
void *sqlite3MallocRaw(int n){
void *p = 0;
- if( n>0 && !sqlite3ThreadDataReadOnly()->mallocFailed ){
+ if( n>0 && !sqlite3MallocFailed() ){
handleSoftLimit(n);
while( !(p = OSMALLOC(n)) && sqlite3_release_memory(n) );
if( !p ){
@@ -559,7 +566,7 @@ void *sqlite3MallocRaw(int n){
** still correct after a malloc() failure.
*/
handleSoftLimit(n * -1);
- sqlite3ThreadData()->mallocFailed = 1;
+ sqlite3FailedMalloc();
OSMALLOC_FAILED();
}
}
@@ -572,7 +579,7 @@ void *sqlite3MallocRaw(int n){
** attempt to free memory by calling sqlite3_release_memory().
*/
void *sqlite3Realloc(void *p, int n){
- if( sqlite3ThreadDataReadOnly()->mallocFailed ){
+ if( sqlite3MallocFailed() ){
return 0;
}
@@ -589,7 +596,7 @@ void *sqlite3Realloc(void *p, int n){
** still correct after a malloc() failure.
*/
handleSoftLimit(OSSIZEOF(p) - n);
- sqlite3ThreadData()->mallocFailed = 1;
+ sqlite3FailedMalloc();
OSMALLOC_FAILED();
}
return np;
@@ -1350,26 +1357,42 @@ void sqlite3ReleaseThreadData(){
** then the connection error-code (the value returned by sqlite3_errcode())
** is set to SQLITE_NOMEM.
*/
+static int mallocHasFailed = 0;
int sqlite3ApiExit(sqlite3* db, int rc){
- ThreadData *pTd = sqlite3OsThreadSpecificData(0);
- if( pTd && pTd->mallocFailed ){
- pTd->mallocFailed = 0;
- if( db ){
- sqlite3Error(db, SQLITE_NOMEM, 0);
- }
- return SQLITE_NOMEM;
+ if( sqlite3MallocFailed() ){
+ mallocHasFailed = 0;
+ sqlite3OsLeaveMutex();
+ sqlite3Error(db, SQLITE_NOMEM, 0);
+ rc = SQLITE_NOMEM;
}
return rc;
}
+/*
+** Return true is a malloc has failed in this thread since the last call
+** to sqlite3ApiExit(), or false otherwise.
+*/
+int sqlite3MallocFailed(){
+ return (mallocHasFailed && sqlite3OsInMutex());
+}
+
+/*
+** Set the "malloc has failed" condition to true for this thread.
+*/
+void sqlite3FailedMalloc(){
+ sqlite3OsEnterMutex();
+ assert( mallocHasFailed==0 );
+ mallocHasFailed = 1;
+}
+
#ifdef SQLITE_MEMDEBUG
/*
** This function sets a flag in the thread-specific-data structure that will
** cause an assert to fail if sqliteMalloc() or sqliteRealloc() is called.
*/
void sqlite3MallocDisallow(){
- assert( sqlite3ThreadData()->mallocDisallowed>=0 );
- sqlite3ThreadData()->mallocDisallowed++;
+ assert( sqlite3_mallocDisallowed>=0 );
+ sqlite3_mallocDisallowed++;
}
/*
@@ -1377,7 +1400,7 @@ void sqlite3MallocDisallow(){
** by sqlite3MallocDisallow().
*/
void sqlite3MallocAllow(){
- assert( sqlite3ThreadData()->mallocDisallowed>0 );
- sqlite3ThreadData()->mallocDisallowed--;
+ assert( sqlite3_mallocDisallowed>0 );
+ sqlite3_mallocDisallowed--;
}
#endif
diff --git a/src/vacuum.c b/src/vacuum.c
index 758455417..e1ffc6334 100644
--- a/src/vacuum.c
+++ b/src/vacuum.c
@@ -14,7 +14,7 @@
** Most of the code in this file may be omitted by defining the
** SQLITE_OMIT_VACUUM macro.
**
-** $Id: vacuum.c,v 1.57 2006/01/13 01:48:59 drh Exp $
+** $Id: vacuum.c,v 1.58 2006/01/18 16:51:36 danielk1977 Exp $
*/
#include "sqliteInt.h"
#include "vdbeInt.h"
@@ -314,7 +314,7 @@ end_of_vacuum:
** Fix this so the flag and return code match.
*/
if( rc==SQLITE_NOMEM ){
- sqlite3ThreadData()->mallocFailed = 1;
+ sqlite3MallocFailed();
}
if( zTemp ){
diff --git a/src/vdbe.c b/src/vdbe.c
index 148783b38..a99f3354d 100644
--- a/src/vdbe.c
+++ b/src/vdbe.c
@@ -43,7 +43,7 @@
** in this file for details. If in doubt, do not deviate from existing
** commenting and indentation practices when changing or adding code.
**
-** $Id: vdbe.c,v 1.531 2006/01/16 15:14:28 danielk1977 Exp $
+** $Id: vdbe.c,v 1.532 2006/01/18 16:51:36 danielk1977 Exp $
*/
#include "sqliteInt.h"
#include "os.h"
@@ -431,7 +431,7 @@ int sqlite3VdbeExec(
for(pc=p->pc; rc==SQLITE_OK; pc++){
assert( pc>=0 && pc<p->nOp );
assert( pTos<=&p->aStack[pc] );
- if( pTsd->mallocFailed ) goto no_mem;
+ if( sqlite3MallocFailed() ) goto no_mem;
#ifdef VDBE_PROFILE
origPc = pc;
start = hwtime();
@@ -1187,7 +1187,7 @@ case OP_Function: {
if( sqlite3SafetyOff(db) ) goto abort_due_to_misuse;
(*ctx.pFunc->xFunc)(&ctx, n, apVal);
if( sqlite3SafetyOn(db) ) goto abort_due_to_misuse;
- if( pTsd->mallocFailed ) goto no_mem;
+ if( sqlite3MallocFailed() ) goto no_mem;
popStack(&pTos, n);
/* If any auxilary data functions have been called by this user function,
@@ -4040,13 +4040,13 @@ case OP_ParseSchema: { /* no-push */
sqlite3SafetyOff(db);
assert( db->init.busy==0 );
db->init.busy = 1;
- assert(0==pTsd->mallocFailed);
+ assert( !sqlite3MallocFailed() );
rc = sqlite3_exec(db, zSql, sqlite3InitCallback, &initData, 0);
sqliteFree(zSql);
db->init.busy = 0;
sqlite3SafetyOn(db);
if( rc==SQLITE_NOMEM ){
- pTsd->mallocFailed = 1;
+ sqlite3FailedMalloc();
goto no_mem;
}
break;
@@ -4637,7 +4637,7 @@ abort_due_to_misuse:
*/
abort_due_to_error:
if( p->zErrMsg==0 ){
- if( pTsd->mallocFailed ) rc = SQLITE_NOMEM;
+ if( sqlite3MallocFailed() ) rc = SQLITE_NOMEM;
sqlite3SetString(&p->zErrMsg, sqlite3ErrStr(rc), (char*)0);
}
goto vdbe_halt;
diff --git a/src/vdbeapi.c b/src/vdbeapi.c
index c1ae4806a..19ab3474b 100644
--- a/src/vdbeapi.c
+++ b/src/vdbeapi.c
@@ -157,7 +157,7 @@ int sqlite3_step(sqlite3_stmt *pStmt){
int rc;
/* Assert that malloc() has not failed */
- assert( !sqlite3ThreadDataReadOnly()->mallocFailed );
+ assert( !sqlite3MallocFailed() );
if( p==0 || p->magic!=VDBE_MAGIC_RUN ){
return SQLITE_MISUSE;
diff --git a/src/vdbeaux.c b/src/vdbeaux.c
index aadb4f727..710c3e4de 100644
--- a/src/vdbeaux.c
+++ b/src/vdbeaux.c
@@ -301,7 +301,7 @@ int sqlite3VdbeAddOpList(Vdbe *p, int nOp, VdbeOpList const *aOp){
int addr;
assert( p->magic==VDBE_MAGIC_INIT );
resizeOpArray(p, p->nOp + nOp);
- if( sqlite3ThreadDataReadOnly()->mallocFailed ){
+ if( sqlite3MallocFailed() ){
return 0;
}
addr = p->nOp;
@@ -415,7 +415,7 @@ static void freeP3(int p3type, void *p3){
void sqlite3VdbeChangeP3(Vdbe *p, int addr, const char *zP3, int n){
Op *pOp;
assert( p->magic==VDBE_MAGIC_INIT );
- if( p==0 || p->aOp==0 || sqlite3ThreadDataReadOnly()->mallocFailed ){
+ if( p==0 || p->aOp==0 || sqlite3MallocFailed() ){
if (n != P3_KEYINFO) {
freeP3(n, (void*)*(char**)&zP3);
}
@@ -473,7 +473,7 @@ void sqlite3VdbeComment(Vdbe *p, const char *zFormat, ...){
va_list ap;
assert( p->nOp>0 );
assert( p->aOp==0 || p->aOp[p->nOp-1].p3==0
- || sqlite3ThreadDataReadOnly()->mallocFailed );
+ || sqlite3MallocFailed() );
va_start(ap, zFormat);
sqlite3VdbeChangeP3(p, -1, sqlite3VMPrintf(zFormat, ap), P3_DYNAMIC);
va_end(ap);
@@ -739,7 +739,7 @@ void sqlite3VdbeMakeReady(
+ nMem*sizeof(Mem) /* aMem */
+ nCursor*sizeof(Cursor*) /* apCsr */
);
- if( !sqlite3ThreadDataReadOnly()->mallocFailed ){
+ if( !sqlite3MallocFailed() ){
p->aMem = &p->aStack[nStack];
p->nMem = nMem;
p->aVar = &p->aMem[nMem];
@@ -891,7 +891,7 @@ int sqlite3VdbeSetColName(Vdbe *p, int idx, const char *zName, int N){
int rc;
Mem *pColName;
assert( idx<(2*p->nResColumn) );
- if( sqlite3ThreadDataReadOnly()->mallocFailed ) return SQLITE_NOMEM;
+ if( sqlite3MallocFailed() ) return SQLITE_NOMEM;
assert( p->aColName!=0 );
pColName = &(p->aColName[idx]);
if( N==P3_DYNAMIC || N==P3_STATIC ){
@@ -1154,7 +1154,7 @@ int sqlite3VdbeHalt(Vdbe *p){
int i;
int (*xFunc)(Btree *pBt) = 0; /* Function to call on each btree backend */
- if( sqlite3ThreadDataReadOnly()->mallocFailed ){
+ if( sqlite3MallocFailed() ){
p->rc = SQLITE_NOMEM;
}
diff --git a/src/vdbemem.c b/src/vdbemem.c
index 37ef497d6..2596418a9 100644
--- a/src/vdbemem.c
+++ b/src/vdbemem.c
@@ -758,7 +758,7 @@ const void *sqlite3ValueText(sqlite3_value* pVal, u8 enc){
}else if( !(pVal->flags&MEM_Blob) ){
sqlite3VdbeMemStringify(pVal, enc);
}
- assert(pVal->enc==enc || sqlite3ThreadDataReadOnly()->mallocFailed);
+ assert(pVal->enc==enc || sqlite3MallocFailed() );
return (const void *)(pVal->enc==enc ? (pVal->z) : 0);
}
diff --git a/src/where.c b/src/where.c
index 9a7e59062..84cf3d1ba 100644
--- a/src/where.c
+++ b/src/where.c
@@ -16,7 +16,7 @@
** so is applicable. Because this module is responsible for selecting
** indices, you might also think of this module as the "query optimizer".
**
-** $Id: where.c,v 1.198 2006/01/14 08:02:28 danielk1977 Exp $
+** $Id: where.c,v 1.199 2006/01/18 16:51:36 danielk1977 Exp $
*/
#include "sqliteInt.h"
@@ -567,7 +567,7 @@ static void exprAnalyze(
int nPattern;
int isComplete;
- if( sqlite3ThreadDataReadOnly()->mallocFailed ) return;
+ if( sqlite3MallocFailed() ) return;
prereqLeft = exprTableUsage(pMaskSet, pExpr->pLeft);
if( pExpr->op==TK_IN ){
assert( pExpr->pRight==0 );
@@ -1451,7 +1451,7 @@ WhereInfo *sqlite3WhereBegin(
** return value.
*/
pWInfo = sqliteMalloc( sizeof(WhereInfo) + pTabList->nSrc*sizeof(WhereLevel));
- if( sqlite3ThreadDataReadOnly()->mallocFailed ){
+ if( sqlite3MallocFailed() ){
goto whereBeginNoMem;
}
pWInfo->pParse = pParse;
@@ -1475,7 +1475,7 @@ WhereInfo *sqlite3WhereBegin(
createMask(&maskSet, pTabList->a[i].iCursor);
}
exprAnalyzeAll(pTabList, &maskSet, &wc);
- if( sqlite3ThreadDataReadOnly()->mallocFailed ){
+ if( sqlite3MallocFailed() ){
goto whereBeginNoMem;
}