mirror of
https://github.com/sqlite/sqlite.git
synced 2025-11-06 15:49:35 +03:00
Merge Win32 native heap support into trunk.
FossilOrigin-Name: 5238a74987507f27af4080e2842f53e049b5b111
This commit is contained in:
64
Makefile.msc
64
Makefile.msc
@@ -11,6 +11,23 @@ TOP = .
|
|||||||
#
|
#
|
||||||
USE_AMALGAMATION = 1
|
USE_AMALGAMATION = 1
|
||||||
|
|
||||||
|
# Set this to non-0 to create and use PDBs.
|
||||||
|
#
|
||||||
|
SYMBOLS = 1
|
||||||
|
|
||||||
|
# Set this to one of the following values to enable various debugging
|
||||||
|
# features. Each level includes the debugging options from the previous
|
||||||
|
# levels. Currently, the recognized values for DEBUG are:
|
||||||
|
#
|
||||||
|
# 0 == NDEBUG: Disables assert() and other runtime diagnostics.
|
||||||
|
# 1 == Disables NDEBUG and all optimizations and then enables PDBs.
|
||||||
|
# 2 == SQLITE_DEBUG: Enables various diagnostics messages and code.
|
||||||
|
# 3 == SQLITE_WIN32_MALLOC_VALIDATE: Validate the Win32 native heap per call.
|
||||||
|
# 4 == SQLITE_DEBUG_OS_TRACE: Enables output from the OSTRACE() macros.
|
||||||
|
# 5 == SQLITE_ENABLE_IOTRACE: Enables output from the IOTRACE() macros.
|
||||||
|
#
|
||||||
|
DEBUG = 0
|
||||||
|
|
||||||
# Version numbers and release number for the SQLite being compiled.
|
# Version numbers and release number for the SQLite being compiled.
|
||||||
#
|
#
|
||||||
VERSION = 3.7
|
VERSION = 3.7
|
||||||
@@ -20,13 +37,13 @@ RELEASE = 3.7.7
|
|||||||
# C Compiler and options for use in building executables that
|
# C Compiler and options for use in building executables that
|
||||||
# will run on the platform that is doing the build.
|
# will run on the platform that is doing the build.
|
||||||
#
|
#
|
||||||
BCC = cl.exe -O2
|
BCC = cl.exe
|
||||||
|
|
||||||
# C Compile and options for use in building executables that
|
# C Compile and options for use in building executables that
|
||||||
# will run on the target platform. (BCC and TCC are usually the
|
# will run on the target platform. (BCC and TCC are usually the
|
||||||
# same unless your are cross-compiling.)
|
# same unless your are cross-compiling.)
|
||||||
#
|
#
|
||||||
TCC = cl.exe -W3 -O2 -DSQLITE_OS_WIN=1 -I. -I$(TOP)\src -fp:precise
|
TCC = cl.exe -W3 -DSQLITE_OS_WIN=1 -I. -I$(TOP)\src -fp:precise
|
||||||
|
|
||||||
# The mksqlite3c.tcl and mksqlite3h.tcl scripts will pull in
|
# The mksqlite3c.tcl and mksqlite3h.tcl scripts will pull in
|
||||||
# any extension header files by default. For non-amalgamation
|
# any extension header files by default. For non-amalgamation
|
||||||
@@ -41,13 +58,39 @@ TCC = $(TCC) -I$(TOP)\ext\rtree
|
|||||||
# Omitting the define will cause extra debugging code to be inserted and
|
# Omitting the define will cause extra debugging code to be inserted and
|
||||||
# includes extra comments when "EXPLAIN stmt" is used.
|
# includes extra comments when "EXPLAIN stmt" is used.
|
||||||
#
|
#
|
||||||
|
!IF $(DEBUG)==0
|
||||||
TCC = $(TCC) -DNDEBUG
|
TCC = $(TCC) -DNDEBUG
|
||||||
|
!ENDIF
|
||||||
|
|
||||||
|
!IF $(DEBUG)>1
|
||||||
|
TCC = $(TCC) -DSQLITE_DEBUG
|
||||||
|
!ENDIF
|
||||||
|
|
||||||
|
!IF $(DEBUG)>3
|
||||||
|
TCC = $(TCC) -DSQLITE_DEBUG_OS_TRACE=1
|
||||||
|
!ENDIF
|
||||||
|
|
||||||
|
!IF $(DEBUG)>4
|
||||||
|
TCC = $(TCC) -DSQLITE_ENABLE_IOTRACE
|
||||||
|
!ENDIF
|
||||||
|
|
||||||
#
|
#
|
||||||
# Prevent warnings about "insecure" runtime library functions being used.
|
# Prevent warnings about "insecure" runtime library functions being used.
|
||||||
#
|
#
|
||||||
TCC = $(TCC) -D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS
|
TCC = $(TCC) -D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS
|
||||||
|
|
||||||
|
#
|
||||||
|
# Use native Win32 heap instead of malloc/free?
|
||||||
|
#
|
||||||
|
# TCC = $(TCC) -DSQLITE_WIN32_MALLOC=1
|
||||||
|
|
||||||
|
#
|
||||||
|
# Validate the heap on every call into the native Win32 heap subsystem?
|
||||||
|
#
|
||||||
|
!IF $(DEBUG)>2
|
||||||
|
TCC = $(TCC) -DSQLITE_WIN32_MALLOC_VALIDATE=1
|
||||||
|
!ENDIF
|
||||||
|
|
||||||
# The locations of the Tcl header and library files. Also, the library that
|
# The locations of the Tcl header and library files. Also, the library that
|
||||||
# non-stubs enabled programs using Tcl must link against. These variables
|
# non-stubs enabled programs using Tcl must link against. These variables
|
||||||
# (TCLINCDIR, TCLLIBDIR, and LIBTCL) may be overridden via the environment
|
# (TCLINCDIR, TCLLIBDIR, and LIBTCL) may be overridden via the environment
|
||||||
@@ -124,6 +167,18 @@ TCC = $(TCC) $(OPT_FEATURE_FLAGS)
|
|||||||
# ie. make "OPTS=-DSQLITE_ENABLE_FOO=1 -DSQLITE_OMIT_FOO=1".
|
# ie. make "OPTS=-DSQLITE_ENABLE_FOO=1 -DSQLITE_OMIT_FOO=1".
|
||||||
TCC = $(TCC) $(OPTS)
|
TCC = $(TCC) $(OPTS)
|
||||||
|
|
||||||
|
# If symbols are enabled, enable PDBs.
|
||||||
|
# If debugging is enabled, disable all optimizations and enable PDBs.
|
||||||
|
!IF $(DEBUG)>0
|
||||||
|
TCC = $(TCC) -Od -D_DEBUG
|
||||||
|
!ELSE
|
||||||
|
TCC = $(TCC) -O2
|
||||||
|
!ENDIF
|
||||||
|
|
||||||
|
!IF $(DEBUG)>0 || $(SYMBOLS)!=0
|
||||||
|
TCC = $(TCC) -Zi
|
||||||
|
!ENDIF
|
||||||
|
|
||||||
# libtool compile/link
|
# libtool compile/link
|
||||||
LTCOMPILE = $(TCC) -Fo$@
|
LTCOMPILE = $(TCC) -Fo$@
|
||||||
LTLIB = lib.exe
|
LTLIB = lib.exe
|
||||||
@@ -138,6 +193,11 @@ LTLINKOPTS = /MACHINE:$(PLATFORM)
|
|||||||
LTLIBOPTS = /MACHINE:$(PLATFORM)
|
LTLIBOPTS = /MACHINE:$(PLATFORM)
|
||||||
!ENDIF
|
!ENDIF
|
||||||
|
|
||||||
|
# If debugging is enabled, enable PDBs.
|
||||||
|
!IF $(DEBUG)>0 || $(SYMBOLS)!=0
|
||||||
|
LTLINKOPTS = $(LTLINKOPTS) /DEBUG
|
||||||
|
!ENDIF
|
||||||
|
|
||||||
# nawk compatible awk.
|
# nawk compatible awk.
|
||||||
NAWK = gawk.exe
|
NAWK = gawk.exe
|
||||||
|
|
||||||
|
|||||||
20
manifest
20
manifest
@@ -1,9 +1,9 @@
|
|||||||
C Create\sa\snew\spager\stype,\sPAGER_SORTER,\sfor\suse\sin\sthe\sexternal\smerge\ssort.\nSuch\spagers\sare\salways\sheld\sin\smemory\sbut\sdo\sreport\swhen\sthey\sare\sunder\nmemory\spressure\sby\scalling\spagerStress.
|
C Merge\sWin32\snative\sheap\ssupport\sinto\strunk.
|
||||||
D 2011-08-26T00:34:45.360
|
D 2011-08-26T11:18:44.284
|
||||||
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
|
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
|
||||||
F Makefile.in 8c930e7b493d59099ea1304bd0f2aed152eb3315
|
F Makefile.in 8c930e7b493d59099ea1304bd0f2aed152eb3315
|
||||||
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
|
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
|
||||||
F Makefile.msc 386444f1e1a1536d19a426030d93fd6e03b7d3b5
|
F Makefile.msc 55fe94bf23b4c1ff035f19b0ae2ea486350f8d01
|
||||||
F Makefile.vxworks c85ec1d8597fe2f7bc225af12ac1666e21379151
|
F Makefile.vxworks c85ec1d8597fe2f7bc225af12ac1666e21379151
|
||||||
F README cd04a36fbc7ea56932a4052d7d0b7f09f27c33d6
|
F README cd04a36fbc7ea56932a4052d7d0b7f09f27c33d6
|
||||||
F VERSION f724de7326e87b7f3b0a55f16ef4b4d993680d54
|
F VERSION f724de7326e87b7f3b0a55f16ef4b4d993680d54
|
||||||
@@ -166,7 +166,7 @@ F src/os.h 9dbed8c2b9c1f2f2ebabc09e49829d4777c26bf9
|
|||||||
F src/os_common.h 65a897143b64667d23ed329a7984b9b405accb58
|
F src/os_common.h 65a897143b64667d23ed329a7984b9b405accb58
|
||||||
F src/os_os2.c 4a75888ba3dfc820ad5e8177025972d74d7f2440
|
F src/os_os2.c 4a75888ba3dfc820ad5e8177025972d74d7f2440
|
||||||
F src/os_unix.c 1a34ca3794ced80e4a4ebcc3ba1f4c516762e534
|
F src/os_unix.c 1a34ca3794ced80e4a4ebcc3ba1f4c516762e534
|
||||||
F src/os_win.c 19fa09046f1f86590a188abdcf5630b8fe8279cf
|
F src/os_win.c 86bcb5bd0386c761c764c3383879469346da3a14
|
||||||
F src/pager.c 817f7f7140c9fa2641f28e6330e924708ddd870d
|
F src/pager.c 817f7f7140c9fa2641f28e6330e924708ddd870d
|
||||||
F src/pager.h 2bab1b2ea4eac58663b5833e3522e36b5ff63447
|
F src/pager.h 2bab1b2ea4eac58663b5833e3522e36b5ff63447
|
||||||
F src/parse.y 12b7ebd61ea54f0e1b1083ff69cc2c8ce9353d58
|
F src/parse.y 12b7ebd61ea54f0e1b1083ff69cc2c8ce9353d58
|
||||||
@@ -183,7 +183,7 @@ F src/select.c d219c4b68d603cc734b6f9b1e2780fee12a1fa0d
|
|||||||
F src/shell.c bbe7818ff5bc8614105ceb81ad67b8bdc0b671dd
|
F src/shell.c bbe7818ff5bc8614105ceb81ad67b8bdc0b671dd
|
||||||
F src/sqlite.h.in 0a6c9c23337fd1352c5c75a613ff9533aa7d91cb
|
F src/sqlite.h.in 0a6c9c23337fd1352c5c75a613ff9533aa7d91cb
|
||||||
F src/sqlite3ext.h 1a1a4f784aa9c3b00edd287940197de52487cd93
|
F src/sqlite3ext.h 1a1a4f784aa9c3b00edd287940197de52487cd93
|
||||||
F src/sqliteInt.h 18876859c6a60fd42b4e3772229387390702f096
|
F src/sqliteInt.h 42e60144648d32e5a6c9994b2baa58b9cf8db69b
|
||||||
F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d
|
F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d
|
||||||
F src/status.c 7ac64842c86cec2fc1a1d0e5c16d3beb8ad332bf
|
F src/status.c 7ac64842c86cec2fc1a1d0e5c16d3beb8ad332bf
|
||||||
F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e
|
F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e
|
||||||
@@ -918,7 +918,7 @@ F test/where9.test 24f19ad14bb1b831564ced5273e681e495662848
|
|||||||
F test/whereA.test 24c234263c8fe358f079d5e57d884fb569d2da0a
|
F test/whereA.test 24c234263c8fe358f079d5e57d884fb569d2da0a
|
||||||
F test/whereB.test 0def95db3bdec220a731c7e4bec5930327c1d8c5
|
F test/whereB.test 0def95db3bdec220a731c7e4bec5930327c1d8c5
|
||||||
F test/wherelimit.test 5e9fd41e79bb2b2d588ed999d641d9c965619b31
|
F test/wherelimit.test 5e9fd41e79bb2b2d588ed999d641d9c965619b31
|
||||||
F test/win32lock.test d60b39c53c68617524429be27bf239f0b11673f2
|
F test/win32lock.test b2a539e85ae6b2d78475e016a9636b4451dc7fb9
|
||||||
F test/zeroblob.test caaecfb4f908f7bc086ed238668049f96774d688
|
F test/zeroblob.test caaecfb4f908f7bc086ed238668049f96774d688
|
||||||
F tool/build-shell.sh 12aa4391073a777fcb6dcc490b219a018ae98bac
|
F tool/build-shell.sh 12aa4391073a777fcb6dcc490b219a018ae98bac
|
||||||
F tool/diffdb.c 7524b1b5df217c20cd0431f6789851a4e0cb191b
|
F tool/diffdb.c 7524b1b5df217c20cd0431f6789851a4e0cb191b
|
||||||
@@ -961,7 +961,7 @@ F tool/symbols.sh caaf6ccc7300fd43353318b44524853e222557d5
|
|||||||
F tool/tostr.awk 11760e1b94a5d3dcd42378f3cc18544c06cfa576
|
F tool/tostr.awk 11760e1b94a5d3dcd42378f3cc18544c06cfa576
|
||||||
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
|
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
|
||||||
F tool/warnings.sh b7fdb2cc525f5ef4fa43c80e771636dd3690f9d2
|
F tool/warnings.sh b7fdb2cc525f5ef4fa43c80e771636dd3690f9d2
|
||||||
P 2c443d47ecee7b43a89f0a4bf299c46c66e3f80d
|
P c71d73201d950355862dd8d5de142c9673888755 5ed7633d41b99929309a7e13d37375a4fdae43b3
|
||||||
R 5271767b893f002dc634ff718e14ca01
|
R 6db87d8333d6edb6b791bc23dadc42e1
|
||||||
U drh
|
U mistachkin
|
||||||
Z 986c77c3e73f3db4a3199ce94583c644
|
Z 81e8aedab83fc3e19b6d4ef38c1919d2
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
c71d73201d950355862dd8d5de142c9673888755
|
5238a74987507f27af4080e2842f53e049b5b111
|
||||||
252
src/os_win.c
252
src/os_win.c
@@ -119,6 +119,76 @@ struct winFile {
|
|||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If compiled with SQLITE_WIN32_MALLOC on Windows, we will use the
|
||||||
|
* various Win32 API heap functions instead of our own.
|
||||||
|
*/
|
||||||
|
#ifdef SQLITE_WIN32_MALLOC
|
||||||
|
/*
|
||||||
|
* The initial size of the Win32-specific heap. This value may be zero.
|
||||||
|
*/
|
||||||
|
#ifndef SQLITE_WIN32_HEAP_INIT_SIZE
|
||||||
|
# define SQLITE_WIN32_HEAP_INIT_SIZE ((SQLITE_DEFAULT_CACHE_SIZE) * \
|
||||||
|
(SQLITE_DEFAULT_PAGE_SIZE) + 4194304)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The maximum size of the Win32-specific heap. This value may be zero.
|
||||||
|
*/
|
||||||
|
#ifndef SQLITE_WIN32_HEAP_MAX_SIZE
|
||||||
|
# define SQLITE_WIN32_HEAP_MAX_SIZE (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The extra flags to use in calls to the Win32 heap APIs. This value may be
|
||||||
|
* zero for the default behavior.
|
||||||
|
*/
|
||||||
|
#ifndef SQLITE_WIN32_HEAP_FLAGS
|
||||||
|
# define SQLITE_WIN32_HEAP_FLAGS (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
** The winMemData structure stores information required by the Win32-specific
|
||||||
|
** sqlite3_mem_methods implementation.
|
||||||
|
*/
|
||||||
|
typedef struct winMemData winMemData;
|
||||||
|
struct winMemData {
|
||||||
|
#ifndef NDEBUG
|
||||||
|
u32 magic; /* Magic number to detect structure corruption. */
|
||||||
|
#endif
|
||||||
|
HANDLE hHeap; /* The handle to our heap. */
|
||||||
|
BOOL bOwned; /* Do we own the heap (i.e. destroy it on shutdown)? */
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifndef NDEBUG
|
||||||
|
#define WINMEM_MAGIC 0x42b2830b
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static struct winMemData win_mem_data = {
|
||||||
|
#ifndef NDEBUG
|
||||||
|
WINMEM_MAGIC,
|
||||||
|
#endif
|
||||||
|
NULL, FALSE
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifndef NDEBUG
|
||||||
|
#define winMemAssertMagic() assert( win_mem_data.magic==WINMEM_MAGIC )
|
||||||
|
#else
|
||||||
|
#define winMemAssertMagic()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define winMemGetHeap() win_mem_data.hHeap
|
||||||
|
|
||||||
|
static void *winMemMalloc(int nBytes);
|
||||||
|
static void winMemFree(void *pPrior);
|
||||||
|
static void *winMemRealloc(void *pPrior, int nBytes);
|
||||||
|
static int winMemSize(void *p);
|
||||||
|
static int winMemRoundup(int n);
|
||||||
|
static int winMemInit(void *pAppData);
|
||||||
|
static void winMemShutdown(void *pAppData);
|
||||||
|
|
||||||
|
const sqlite3_mem_methods *sqlite3MemGetWin32(void);
|
||||||
|
#endif /* SQLITE_WIN32_MALLOC */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Forward prototypes.
|
** Forward prototypes.
|
||||||
@@ -171,6 +241,188 @@ static int sqlite3_os_type = 0;
|
|||||||
}
|
}
|
||||||
#endif /* SQLITE_OS_WINCE */
|
#endif /* SQLITE_OS_WINCE */
|
||||||
|
|
||||||
|
#ifdef SQLITE_WIN32_MALLOC
|
||||||
|
/*
|
||||||
|
** Allocate nBytes of memory.
|
||||||
|
*/
|
||||||
|
static void *winMemMalloc(int nBytes){
|
||||||
|
HANDLE hHeap;
|
||||||
|
void *p;
|
||||||
|
|
||||||
|
winMemAssertMagic();
|
||||||
|
hHeap = winMemGetHeap();
|
||||||
|
assert( hHeap!=0 );
|
||||||
|
assert( hHeap!=INVALID_HANDLE_VALUE );
|
||||||
|
#ifdef SQLITE_WIN32_MALLOC_VALIDATE
|
||||||
|
assert ( HeapValidate(hHeap, SQLITE_WIN32_HEAP_FLAGS, NULL) );
|
||||||
|
#endif
|
||||||
|
assert( nBytes>=0 );
|
||||||
|
p = HeapAlloc(hHeap, SQLITE_WIN32_HEAP_FLAGS, (SIZE_T)nBytes);
|
||||||
|
if( !p ){
|
||||||
|
sqlite3_log(SQLITE_NOMEM, "failed to HeapAlloc %u bytes (%d), heap=%p",
|
||||||
|
nBytes, GetLastError(), (void*)hHeap);
|
||||||
|
}
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Free memory.
|
||||||
|
*/
|
||||||
|
static void winMemFree(void *pPrior){
|
||||||
|
HANDLE hHeap;
|
||||||
|
|
||||||
|
winMemAssertMagic();
|
||||||
|
hHeap = winMemGetHeap();
|
||||||
|
assert( hHeap!=0 );
|
||||||
|
assert( hHeap!=INVALID_HANDLE_VALUE );
|
||||||
|
#ifdef SQLITE_WIN32_MALLOC_VALIDATE
|
||||||
|
assert ( HeapValidate(hHeap, SQLITE_WIN32_HEAP_FLAGS, pPrior) );
|
||||||
|
#endif
|
||||||
|
if( !pPrior ) return; /* Passing NULL to HeapFree is undefined. */
|
||||||
|
if( !HeapFree(hHeap, SQLITE_WIN32_HEAP_FLAGS, pPrior) ){
|
||||||
|
sqlite3_log(SQLITE_NOMEM, "failed to HeapFree block %p (%d), heap=%p",
|
||||||
|
pPrior, GetLastError(), (void*)hHeap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Change the size of an existing memory allocation
|
||||||
|
*/
|
||||||
|
static void *winMemRealloc(void *pPrior, int nBytes){
|
||||||
|
HANDLE hHeap;
|
||||||
|
void *p;
|
||||||
|
|
||||||
|
winMemAssertMagic();
|
||||||
|
hHeap = winMemGetHeap();
|
||||||
|
assert( hHeap!=0 );
|
||||||
|
assert( hHeap!=INVALID_HANDLE_VALUE );
|
||||||
|
#ifdef SQLITE_WIN32_MALLOC_VALIDATE
|
||||||
|
assert ( HeapValidate(hHeap, SQLITE_WIN32_HEAP_FLAGS, pPrior) );
|
||||||
|
#endif
|
||||||
|
assert( nBytes>=0 );
|
||||||
|
if( !pPrior ){
|
||||||
|
p = HeapAlloc(hHeap, SQLITE_WIN32_HEAP_FLAGS, (SIZE_T)nBytes);
|
||||||
|
}else{
|
||||||
|
p = HeapReAlloc(hHeap, SQLITE_WIN32_HEAP_FLAGS, pPrior, (SIZE_T)nBytes);
|
||||||
|
}
|
||||||
|
if( !p ){
|
||||||
|
sqlite3_log(SQLITE_NOMEM, "failed to %s %u bytes (%d), heap=%p",
|
||||||
|
pPrior ? "HeapReAlloc" : "HeapAlloc", nBytes, GetLastError(),
|
||||||
|
(void*)hHeap);
|
||||||
|
}
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Return the size of an outstanding allocation, in bytes.
|
||||||
|
*/
|
||||||
|
static int winMemSize(void *p){
|
||||||
|
HANDLE hHeap;
|
||||||
|
SIZE_T n;
|
||||||
|
|
||||||
|
winMemAssertMagic();
|
||||||
|
hHeap = winMemGetHeap();
|
||||||
|
assert( hHeap!=0 );
|
||||||
|
assert( hHeap!=INVALID_HANDLE_VALUE );
|
||||||
|
#ifdef SQLITE_WIN32_MALLOC_VALIDATE
|
||||||
|
assert ( HeapValidate(hHeap, SQLITE_WIN32_HEAP_FLAGS, NULL) );
|
||||||
|
#endif
|
||||||
|
if( !p ) return 0;
|
||||||
|
n = HeapSize(hHeap, SQLITE_WIN32_HEAP_FLAGS, p);
|
||||||
|
if( n==(SIZE_T)-1 ){
|
||||||
|
sqlite3_log(SQLITE_NOMEM, "failed to HeapSize block %p (%d), heap=%p",
|
||||||
|
p, GetLastError(), (void*)hHeap);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return (int)n;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Round up a request size to the next valid allocation size.
|
||||||
|
*/
|
||||||
|
static int winMemRoundup(int n){
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Initialize this module.
|
||||||
|
*/
|
||||||
|
static int winMemInit(void *pAppData){
|
||||||
|
winMemData *pWinMemData = (winMemData *)pAppData;
|
||||||
|
|
||||||
|
if( !pWinMemData ) return SQLITE_ERROR;
|
||||||
|
assert( pWinMemData->magic==WINMEM_MAGIC );
|
||||||
|
if( !pWinMemData->hHeap ){
|
||||||
|
pWinMemData->hHeap = HeapCreate(SQLITE_WIN32_HEAP_FLAGS,
|
||||||
|
SQLITE_WIN32_HEAP_INIT_SIZE,
|
||||||
|
SQLITE_WIN32_HEAP_MAX_SIZE);
|
||||||
|
if( !pWinMemData->hHeap ){
|
||||||
|
sqlite3_log(SQLITE_NOMEM,
|
||||||
|
"failed to HeapCreate (%d), flags=%u, initSize=%u, maxSize=%u",
|
||||||
|
GetLastError(), SQLITE_WIN32_HEAP_FLAGS, SQLITE_WIN32_HEAP_INIT_SIZE,
|
||||||
|
SQLITE_WIN32_HEAP_MAX_SIZE);
|
||||||
|
return SQLITE_NOMEM;
|
||||||
|
}
|
||||||
|
pWinMemData->bOwned = TRUE;
|
||||||
|
}
|
||||||
|
assert( pWinMemData->hHeap!=0 );
|
||||||
|
assert( pWinMemData->hHeap!=INVALID_HANDLE_VALUE );
|
||||||
|
#ifdef SQLITE_WIN32_MALLOC_VALIDATE
|
||||||
|
assert( HeapValidate(pWinMemData->hHeap, SQLITE_WIN32_HEAP_FLAGS, NULL) );
|
||||||
|
#endif
|
||||||
|
return SQLITE_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Deinitialize this module.
|
||||||
|
*/
|
||||||
|
static void winMemShutdown(void *pAppData){
|
||||||
|
winMemData *pWinMemData = (winMemData *)pAppData;
|
||||||
|
|
||||||
|
if( !pWinMemData ) return;
|
||||||
|
if( pWinMemData->hHeap ){
|
||||||
|
assert( pWinMemData->hHeap!=INVALID_HANDLE_VALUE );
|
||||||
|
#ifdef SQLITE_WIN32_MALLOC_VALIDATE
|
||||||
|
assert( HeapValidate(pWinMemData->hHeap, SQLITE_WIN32_HEAP_FLAGS, NULL) );
|
||||||
|
#endif
|
||||||
|
if( pWinMemData->bOwned ){
|
||||||
|
if( !HeapDestroy(pWinMemData->hHeap) ){
|
||||||
|
sqlite3_log(SQLITE_NOMEM, "failed to HeapDestroy (%d), heap=%p",
|
||||||
|
GetLastError(), (void*)pWinMemData->hHeap);
|
||||||
|
}
|
||||||
|
pWinMemData->bOwned = FALSE;
|
||||||
|
}
|
||||||
|
pWinMemData->hHeap = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Populate the low-level memory allocation function pointers in
|
||||||
|
** sqlite3GlobalConfig.m with pointers to the routines in this file. The
|
||||||
|
** arguments specify the block of memory to manage.
|
||||||
|
**
|
||||||
|
** This routine is only called by sqlite3_config(), and therefore
|
||||||
|
** is not required to be threadsafe (it is not).
|
||||||
|
*/
|
||||||
|
const sqlite3_mem_methods *sqlite3MemGetWin32(void){
|
||||||
|
static const sqlite3_mem_methods winMemMethods = {
|
||||||
|
winMemMalloc,
|
||||||
|
winMemFree,
|
||||||
|
winMemRealloc,
|
||||||
|
winMemSize,
|
||||||
|
winMemRoundup,
|
||||||
|
winMemInit,
|
||||||
|
winMemShutdown,
|
||||||
|
&win_mem_data
|
||||||
|
};
|
||||||
|
return &winMemMethods;
|
||||||
|
}
|
||||||
|
|
||||||
|
void sqlite3MemSetDefault(void){
|
||||||
|
sqlite3_config(SQLITE_CONFIG_MALLOC, sqlite3MemGetWin32());
|
||||||
|
}
|
||||||
|
#endif /* SQLITE_WIN32_MALLOC */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Convert a UTF-8 string to microsoft unicode (UTF-16?).
|
** Convert a UTF-8 string to microsoft unicode (UTF-16?).
|
||||||
**
|
**
|
||||||
|
|||||||
@@ -147,19 +147,25 @@
|
|||||||
** specify which memory allocation subsystem to use.
|
** specify which memory allocation subsystem to use.
|
||||||
**
|
**
|
||||||
** SQLITE_SYSTEM_MALLOC // Use normal system malloc()
|
** SQLITE_SYSTEM_MALLOC // Use normal system malloc()
|
||||||
|
** SQLITE_WIN32_MALLOC // Use Win32 native heap API
|
||||||
** SQLITE_MEMDEBUG // Debugging version of system malloc()
|
** SQLITE_MEMDEBUG // Debugging version of system malloc()
|
||||||
**
|
**
|
||||||
|
** On Windows, if the SQLITE_WIN32_MALLOC_VALIDATE macro is defined and the
|
||||||
|
** assert() macro is enabled, each call into the Win32 native heap subsystem
|
||||||
|
** will cause HeapValidate to be called. If heap validation should fail, an
|
||||||
|
** assertion will be triggered.
|
||||||
|
**
|
||||||
** (Historical note: There used to be several other options, but we've
|
** (Historical note: There used to be several other options, but we've
|
||||||
** pared it down to just these two.)
|
** pared it down to just these two.)
|
||||||
**
|
**
|
||||||
** If none of the above are defined, then set SQLITE_SYSTEM_MALLOC as
|
** If none of the above are defined, then set SQLITE_SYSTEM_MALLOC as
|
||||||
** the default.
|
** the default.
|
||||||
*/
|
*/
|
||||||
#if defined(SQLITE_SYSTEM_MALLOC)+defined(SQLITE_MEMDEBUG)>1
|
#if defined(SQLITE_SYSTEM_MALLOC)+defined(SQLITE_WIN32_MALLOC)+defined(SQLITE_MEMDEBUG)>1
|
||||||
# error "At most one of the following compile-time configuration options\
|
# error "At most one of the following compile-time configuration options\
|
||||||
is allows: SQLITE_SYSTEM_MALLOC, SQLITE_MEMDEBUG"
|
is allows: SQLITE_SYSTEM_MALLOC, SQLITE_MEMDEBUG"
|
||||||
#endif
|
#endif
|
||||||
#if defined(SQLITE_SYSTEM_MALLOC)+defined(SQLITE_MEMDEBUG)==0
|
#if defined(SQLITE_SYSTEM_MALLOC)+defined(SQLITE_WIN32_MALLOC)+defined(SQLITE_MEMDEBUG)==0
|
||||||
# define SQLITE_SYSTEM_MALLOC 1
|
# define SQLITE_SYSTEM_MALLOC 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -69,6 +69,10 @@ while {1} {
|
|||||||
}
|
}
|
||||||
if {[llength $win32_lock_ok] && [llength $win32_lock_error]} break
|
if {[llength $win32_lock_ok] && [llength $win32_lock_error]} break
|
||||||
incr delay1 25
|
incr delay1 25
|
||||||
|
if {$delay1 > 12500} {
|
||||||
|
puts "Timed out waiting for \"ok\" and \"error\" results."
|
||||||
|
break
|
||||||
|
}
|
||||||
sqlite3_sleep 10
|
sqlite3_sleep 10
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -113,11 +117,16 @@ while {1} {
|
|||||||
}
|
}
|
||||||
if {[llength $win32_lock_ok] && [llength $win32_lock_error]} break
|
if {[llength $win32_lock_ok] && [llength $win32_lock_error]} break
|
||||||
incr delay1 1
|
incr delay1 1
|
||||||
|
if {$delay1 > 500} {
|
||||||
|
puts "Timed out waiting for \"ok\" and \"error\" results."
|
||||||
|
break
|
||||||
|
}
|
||||||
sqlite3_sleep 10
|
sqlite3_sleep 10
|
||||||
}
|
}
|
||||||
|
|
||||||
file_control_win32_av_retry db 10 25
|
file_control_win32_av_retry db 10 25
|
||||||
sqlite3_test_control_pending_byte $old_pending_byte
|
sqlite3_test_control_pending_byte $old_pending_byte
|
||||||
|
db close
|
||||||
sqlite3_shutdown
|
sqlite3_shutdown
|
||||||
test_sqlite3_log
|
test_sqlite3_log
|
||||||
sqlite3_initialize
|
sqlite3_initialize
|
||||||
|
|||||||
Reference in New Issue
Block a user