2021SC@SDUSC
接着上次的winVfsAppData结构体继续往下看。
#ifdef SQLITE_WIN32_MALLOC
malloc()是Sqlite在缺省情况下调用C标准库例程来分配内存的。
如果这不是零,则本机Win 32分配器子系统将创建一个孤立的堆;否则,将使用默认的进程堆。此设置在为WinRT编译时没有任何影响。默认情况下,这是启用的,并且将创建一个独立的堆来存储所有分配的数据
此处出现了一个warning:当设置为非零并且调用了winMemShu倒计时函数时,使用隔离堆分配的所有数据都将立即被释放,而任何试图访问已释放的数据会立即导致访问冲突。
#ifndef SQLITE_WIN32_HEAP_MAX_INIT_SIZE
# define SQLITE_WIN32_HEAP_MAX_INIT_SIZE (4294967295U)
#endif
Win32特定堆的最大初始大小
#ifndef SQLITE_WIN32_CACHE_SIZE
# if SQLITE_DEFAULT_CACHE_SIZE>=0
# define SQLITE_WIN32_CACHE_SIZE (SQLITE_DEFAULT_CACHE_SIZE)
# else
# define SQLITE_WIN32_CACHE_SIZE (-(SQLITE_DEFAULT_CACHE_SIZE))
# endif
#endif
计算Win32特定堆的初始大小时所用的缓存大小
#ifndef SQLITE_WIN32_MAX_CACHE_SIZE
# define SQLITE_WIN32_MAX_CACHE_SIZE (((SQLITE_WIN32_HEAP_MAX_INIT_SIZE) - \
(SQLITE_WIN32_HEAP_INIT_EXTRA)) / \
(SQLITE_DEFAULT_PAGE_SIZE))
#endif
根据可能最大的初始堆大小和默认页大小,计算最大合法缓存大小(以页为单位),并预留所需的额外空间。
typedef struct winMemData winMemData;
struct winMemData {
#ifndef NDEBUG
u32 magic1;
#endif
HANDLE hHeap;
BOOL bOwned;
#ifndef NDEBUG
u32 magic2;
#endif
};
#ifndef NDEBUG
#define winMemAssertMagic1() assert( win_mem_data.magic1==WINMEM_MAGIC1 )