Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(486)

Side by Side Diff: third_party/sqlite/sqlite-src-3100200/src/os_win.c

Issue 1610543003: [sql] Import reference version of SQLite 3.10.2. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 ** 2004 May 22 2 ** 2004 May 22
3 ** 3 **
4 ** The author disclaims copyright to this source code. In place of 4 ** The author disclaims copyright to this source code. In place of
5 ** a legal notice, here is a blessing: 5 ** a legal notice, here is a blessing:
6 ** 6 **
7 ** May you do good and not evil. 7 ** May you do good and not evil.
8 ** May you find forgiveness for yourself and forgive others. 8 ** May you find forgiveness for yourself and forgive others.
9 ** May you share freely, never taking more than you give. 9 ** May you share freely, never taking more than you give.
10 ** 10 **
(...skipping 16 matching lines...) Expand all
27 27
28 /* 28 /*
29 ** Compiling and using WAL mode requires several APIs that are only 29 ** Compiling and using WAL mode requires several APIs that are only
30 ** available in Windows platforms based on the NT kernel. 30 ** available in Windows platforms based on the NT kernel.
31 */ 31 */
32 #if !SQLITE_OS_WINNT && !defined(SQLITE_OMIT_WAL) 32 #if !SQLITE_OS_WINNT && !defined(SQLITE_OMIT_WAL)
33 # error "WAL mode requires support from the Windows NT kernel, compile\ 33 # error "WAL mode requires support from the Windows NT kernel, compile\
34 with SQLITE_OMIT_WAL." 34 with SQLITE_OMIT_WAL."
35 #endif 35 #endif
36 36
37 #if !SQLITE_OS_WINNT && SQLITE_MAX_MMAP_SIZE>0
38 # error "Memory mapped files require support from the Windows NT kernel,\
39 compile with SQLITE_MAX_MMAP_SIZE=0."
40 #endif
41
37 /* 42 /*
38 ** Are most of the Win32 ANSI APIs available (i.e. with certain exceptions 43 ** Are most of the Win32 ANSI APIs available (i.e. with certain exceptions
39 ** based on the sub-platform)? 44 ** based on the sub-platform)?
40 */ 45 */
41 #if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && !defined(SQLITE_WIN32_NO_ANSI) 46 #if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && !defined(SQLITE_WIN32_NO_ANSI)
42 # define SQLITE_WIN32_HAS_ANSI 47 # define SQLITE_WIN32_HAS_ANSI
43 #endif 48 #endif
44 49
45 /* 50 /*
46 ** Are most of the Win32 Unicode APIs available (i.e. with certain exceptions 51 ** Are most of the Win32 Unicode APIs available (i.e. with certain exceptions
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
156 161
157 /* 162 /*
158 ** Returns the character that should be used as the directory separator. 163 ** Returns the character that should be used as the directory separator.
159 */ 164 */
160 #ifndef winGetDirSep 165 #ifndef winGetDirSep
161 # define winGetDirSep() '\\' 166 # define winGetDirSep() '\\'
162 #endif 167 #endif
163 168
164 /* 169 /*
165 ** Do we need to manually define the Win32 file mapping APIs for use with WAL 170 ** Do we need to manually define the Win32 file mapping APIs for use with WAL
166 ** mode (e.g. these APIs are available in the Windows CE SDK; however, they 171 ** mode or memory mapped files (e.g. these APIs are available in the Windows
167 ** are not present in the header file)? 172 ** CE SDK; however, they are not present in the header file)?
168 */ 173 */
169 #if SQLITE_WIN32_FILEMAPPING_API && !defined(SQLITE_OMIT_WAL) 174 #if SQLITE_WIN32_FILEMAPPING_API && \
175 (!defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0)
170 /* 176 /*
171 ** Two of the file mapping APIs are different under WinRT. Figure out which 177 ** Two of the file mapping APIs are different under WinRT. Figure out which
172 ** set we need. 178 ** set we need.
173 */ 179 */
174 #if SQLITE_OS_WINRT 180 #if SQLITE_OS_WINRT
175 WINBASEAPI HANDLE WINAPI CreateFileMappingFromApp(HANDLE, \ 181 WINBASEAPI HANDLE WINAPI CreateFileMappingFromApp(HANDLE, \
176 LPSECURITY_ATTRIBUTES, ULONG, ULONG64, LPCWSTR); 182 LPSECURITY_ATTRIBUTES, ULONG, ULONG64, LPCWSTR);
177 183
178 WINBASEAPI LPVOID WINAPI MapViewOfFileFromApp(HANDLE, ULONG, ULONG64, SIZE_T); 184 WINBASEAPI LPVOID WINAPI MapViewOfFileFromApp(HANDLE, ULONG, ULONG64, SIZE_T);
179 #else 185 #else
180 #if defined(SQLITE_WIN32_HAS_ANSI) 186 #if defined(SQLITE_WIN32_HAS_ANSI)
181 WINBASEAPI HANDLE WINAPI CreateFileMappingA(HANDLE, LPSECURITY_ATTRIBUTES, \ 187 WINBASEAPI HANDLE WINAPI CreateFileMappingA(HANDLE, LPSECURITY_ATTRIBUTES, \
182 DWORD, DWORD, DWORD, LPCSTR); 188 DWORD, DWORD, DWORD, LPCSTR);
183 #endif /* defined(SQLITE_WIN32_HAS_ANSI) */ 189 #endif /* defined(SQLITE_WIN32_HAS_ANSI) */
184 190
185 #if defined(SQLITE_WIN32_HAS_WIDE) 191 #if defined(SQLITE_WIN32_HAS_WIDE)
186 WINBASEAPI HANDLE WINAPI CreateFileMappingW(HANDLE, LPSECURITY_ATTRIBUTES, \ 192 WINBASEAPI HANDLE WINAPI CreateFileMappingW(HANDLE, LPSECURITY_ATTRIBUTES, \
187 DWORD, DWORD, DWORD, LPCWSTR); 193 DWORD, DWORD, DWORD, LPCWSTR);
188 #endif /* defined(SQLITE_WIN32_HAS_WIDE) */ 194 #endif /* defined(SQLITE_WIN32_HAS_WIDE) */
189 195
190 WINBASEAPI LPVOID WINAPI MapViewOfFile(HANDLE, DWORD, DWORD, DWORD, SIZE_T); 196 WINBASEAPI LPVOID WINAPI MapViewOfFile(HANDLE, DWORD, DWORD, DWORD, SIZE_T);
191 #endif /* SQLITE_OS_WINRT */ 197 #endif /* SQLITE_OS_WINRT */
192 198
193 /* 199 /*
194 ** This file mapping API is common to both Win32 and WinRT. 200 ** These file mapping APIs are common to both Win32 and WinRT.
195 */ 201 */
202
203 WINBASEAPI BOOL WINAPI FlushViewOfFile(LPCVOID, SIZE_T);
196 WINBASEAPI BOOL WINAPI UnmapViewOfFile(LPCVOID); 204 WINBASEAPI BOOL WINAPI UnmapViewOfFile(LPCVOID);
197 #endif /* SQLITE_WIN32_FILEMAPPING_API && !defined(SQLITE_OMIT_WAL) */ 205 #endif /* SQLITE_WIN32_FILEMAPPING_API */
198 206
199 /* 207 /*
200 ** Some Microsoft compilers lack this definition. 208 ** Some Microsoft compilers lack this definition.
201 */ 209 */
202 #ifndef INVALID_FILE_ATTRIBUTES 210 #ifndef INVALID_FILE_ATTRIBUTES
203 # define INVALID_FILE_ATTRIBUTES ((DWORD)-1) 211 # define INVALID_FILE_ATTRIBUTES ((DWORD)-1)
204 #endif 212 #endif
205 213
206 #ifndef FILE_FLAG_MASK 214 #ifndef FILE_FLAG_MASK
207 # define FILE_FLAG_MASK (0xFF3C0000) 215 # define FILE_FLAG_MASK (0xFF3C0000)
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after
480 #if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE) 488 #if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE)
481 { "CreateFileW", (SYSCALL)CreateFileW, 0 }, 489 { "CreateFileW", (SYSCALL)CreateFileW, 0 },
482 #else 490 #else
483 { "CreateFileW", (SYSCALL)0, 0 }, 491 { "CreateFileW", (SYSCALL)0, 0 },
484 #endif 492 #endif
485 493
486 #define osCreateFileW ((HANDLE(WINAPI*)(LPCWSTR,DWORD,DWORD, \ 494 #define osCreateFileW ((HANDLE(WINAPI*)(LPCWSTR,DWORD,DWORD, \
487 LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE))aSyscall[5].pCurrent) 495 LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE))aSyscall[5].pCurrent)
488 496
489 #if (!SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_ANSI) && \ 497 #if (!SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_ANSI) && \
490 !defined(SQLITE_OMIT_WAL)) 498 (!defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0))
491 { "CreateFileMappingA", (SYSCALL)CreateFileMappingA, 0 }, 499 { "CreateFileMappingA", (SYSCALL)CreateFileMappingA, 0 },
492 #else 500 #else
493 { "CreateFileMappingA", (SYSCALL)0, 0 }, 501 { "CreateFileMappingA", (SYSCALL)0, 0 },
494 #endif 502 #endif
495 503
496 #define osCreateFileMappingA ((HANDLE(WINAPI*)(HANDLE,LPSECURITY_ATTRIBUTES, \ 504 #define osCreateFileMappingA ((HANDLE(WINAPI*)(HANDLE,LPSECURITY_ATTRIBUTES, \
497 DWORD,DWORD,DWORD,LPCSTR))aSyscall[6].pCurrent) 505 DWORD,DWORD,DWORD,LPCSTR))aSyscall[6].pCurrent)
498 506
499 #if SQLITE_OS_WINCE || (!SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE) && \ 507 #if SQLITE_OS_WINCE || (!SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE) && \
500 !defined(SQLITE_OMIT_WAL)) 508 (!defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0))
501 { "CreateFileMappingW", (SYSCALL)CreateFileMappingW, 0 }, 509 { "CreateFileMappingW", (SYSCALL)CreateFileMappingW, 0 },
502 #else 510 #else
503 { "CreateFileMappingW", (SYSCALL)0, 0 }, 511 { "CreateFileMappingW", (SYSCALL)0, 0 },
504 #endif 512 #endif
505 513
506 #define osCreateFileMappingW ((HANDLE(WINAPI*)(HANDLE,LPSECURITY_ATTRIBUTES, \ 514 #define osCreateFileMappingW ((HANDLE(WINAPI*)(HANDLE,LPSECURITY_ATTRIBUTES, \
507 DWORD,DWORD,DWORD,LPCWSTR))aSyscall[7].pCurrent) 515 DWORD,DWORD,DWORD,LPCWSTR))aSyscall[7].pCurrent)
508 516
509 #if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE) 517 #if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE)
510 { "CreateMutexW", (SYSCALL)CreateMutexW, 0 }, 518 { "CreateMutexW", (SYSCALL)CreateMutexW, 0 },
(...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after
830 { "LockFileEx", (SYSCALL)LockFileEx, 0 }, 838 { "LockFileEx", (SYSCALL)LockFileEx, 0 },
831 #else 839 #else
832 { "LockFileEx", (SYSCALL)0, 0 }, 840 { "LockFileEx", (SYSCALL)0, 0 },
833 #endif 841 #endif
834 842
835 #ifndef osLockFileEx 843 #ifndef osLockFileEx
836 #define osLockFileEx ((BOOL(WINAPI*)(HANDLE,DWORD,DWORD,DWORD,DWORD, \ 844 #define osLockFileEx ((BOOL(WINAPI*)(HANDLE,DWORD,DWORD,DWORD,DWORD, \
837 LPOVERLAPPED))aSyscall[48].pCurrent) 845 LPOVERLAPPED))aSyscall[48].pCurrent)
838 #endif 846 #endif
839 847
840 #if SQLITE_OS_WINCE || (!SQLITE_OS_WINRT && !defined(SQLITE_OMIT_WAL)) 848 #if SQLITE_OS_WINCE || (!SQLITE_OS_WINRT && \
849 (!defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0))
841 { "MapViewOfFile", (SYSCALL)MapViewOfFile, 0 }, 850 { "MapViewOfFile", (SYSCALL)MapViewOfFile, 0 },
842 #else 851 #else
843 { "MapViewOfFile", (SYSCALL)0, 0 }, 852 { "MapViewOfFile", (SYSCALL)0, 0 },
844 #endif 853 #endif
845 854
846 #define osMapViewOfFile ((LPVOID(WINAPI*)(HANDLE,DWORD,DWORD,DWORD, \ 855 #define osMapViewOfFile ((LPVOID(WINAPI*)(HANDLE,DWORD,DWORD,DWORD, \
847 SIZE_T))aSyscall[49].pCurrent) 856 SIZE_T))aSyscall[49].pCurrent)
848 857
849 { "MultiByteToWideChar", (SYSCALL)MultiByteToWideChar, 0 }, 858 { "MultiByteToWideChar", (SYSCALL)MultiByteToWideChar, 0 },
850 859
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
900 909
901 #if !SQLITE_OS_WINCE 910 #if !SQLITE_OS_WINCE
902 { "UnlockFileEx", (SYSCALL)UnlockFileEx, 0 }, 911 { "UnlockFileEx", (SYSCALL)UnlockFileEx, 0 },
903 #else 912 #else
904 { "UnlockFileEx", (SYSCALL)0, 0 }, 913 { "UnlockFileEx", (SYSCALL)0, 0 },
905 #endif 914 #endif
906 915
907 #define osUnlockFileEx ((BOOL(WINAPI*)(HANDLE,DWORD,DWORD,DWORD, \ 916 #define osUnlockFileEx ((BOOL(WINAPI*)(HANDLE,DWORD,DWORD,DWORD, \
908 LPOVERLAPPED))aSyscall[58].pCurrent) 917 LPOVERLAPPED))aSyscall[58].pCurrent)
909 918
910 #if SQLITE_OS_WINCE || !defined(SQLITE_OMIT_WAL) 919 #if SQLITE_OS_WINCE || !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0
911 { "UnmapViewOfFile", (SYSCALL)UnmapViewOfFile, 0 }, 920 { "UnmapViewOfFile", (SYSCALL)UnmapViewOfFile, 0 },
912 #else 921 #else
913 { "UnmapViewOfFile", (SYSCALL)0, 0 }, 922 { "UnmapViewOfFile", (SYSCALL)0, 0 },
914 #endif 923 #endif
915 924
916 #define osUnmapViewOfFile ((BOOL(WINAPI*)(LPCVOID))aSyscall[59].pCurrent) 925 #define osUnmapViewOfFile ((BOOL(WINAPI*)(LPCVOID))aSyscall[59].pCurrent)
917 926
918 { "WideCharToMultiByte", (SYSCALL)WideCharToMultiByte, 0 }, 927 { "WideCharToMultiByte", (SYSCALL)WideCharToMultiByte, 0 },
919 928
920 #define osWideCharToMultiByte ((int(WINAPI*)(UINT,DWORD,LPCWSTR,int,LPSTR,int, \ 929 #define osWideCharToMultiByte ((int(WINAPI*)(UINT,DWORD,LPCWSTR,int,LPSTR,int, \
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
963 972
964 #if SQLITE_OS_WINRT 973 #if SQLITE_OS_WINRT
965 { "GetFileInformationByHandleEx", (SYSCALL)GetFileInformationByHandleEx, 0 }, 974 { "GetFileInformationByHandleEx", (SYSCALL)GetFileInformationByHandleEx, 0 },
966 #else 975 #else
967 { "GetFileInformationByHandleEx", (SYSCALL)0, 0 }, 976 { "GetFileInformationByHandleEx", (SYSCALL)0, 0 },
968 #endif 977 #endif
969 978
970 #define osGetFileInformationByHandleEx ((BOOL(WINAPI*)(HANDLE, \ 979 #define osGetFileInformationByHandleEx ((BOOL(WINAPI*)(HANDLE, \
971 FILE_INFO_BY_HANDLE_CLASS,LPVOID,DWORD))aSyscall[66].pCurrent) 980 FILE_INFO_BY_HANDLE_CLASS,LPVOID,DWORD))aSyscall[66].pCurrent)
972 981
973 #if SQLITE_OS_WINRT && !defined(SQLITE_OMIT_WAL) 982 #if SQLITE_OS_WINRT && (!defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0)
974 { "MapViewOfFileFromApp", (SYSCALL)MapViewOfFileFromApp, 0 }, 983 { "MapViewOfFileFromApp", (SYSCALL)MapViewOfFileFromApp, 0 },
975 #else 984 #else
976 { "MapViewOfFileFromApp", (SYSCALL)0, 0 }, 985 { "MapViewOfFileFromApp", (SYSCALL)0, 0 },
977 #endif 986 #endif
978 987
979 #define osMapViewOfFileFromApp ((LPVOID(WINAPI*)(HANDLE,ULONG,ULONG64, \ 988 #define osMapViewOfFileFromApp ((LPVOID(WINAPI*)(HANDLE,ULONG,ULONG64, \
980 SIZE_T))aSyscall[67].pCurrent) 989 SIZE_T))aSyscall[67].pCurrent)
981 990
982 #if SQLITE_OS_WINRT 991 #if SQLITE_OS_WINRT
983 { "CreateFile2", (SYSCALL)CreateFile2, 0 }, 992 { "CreateFile2", (SYSCALL)CreateFile2, 0 },
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
1027 #else 1036 #else
1028 { "OutputDebugStringW", (SYSCALL)0, 0 }, 1037 { "OutputDebugStringW", (SYSCALL)0, 0 },
1029 #endif 1038 #endif
1030 1039
1031 #define osOutputDebugStringW ((VOID(WINAPI*)(LPCWSTR))aSyscall[73].pCurrent) 1040 #define osOutputDebugStringW ((VOID(WINAPI*)(LPCWSTR))aSyscall[73].pCurrent)
1032 1041
1033 { "GetProcessHeap", (SYSCALL)GetProcessHeap, 0 }, 1042 { "GetProcessHeap", (SYSCALL)GetProcessHeap, 0 },
1034 1043
1035 #define osGetProcessHeap ((HANDLE(WINAPI*)(VOID))aSyscall[74].pCurrent) 1044 #define osGetProcessHeap ((HANDLE(WINAPI*)(VOID))aSyscall[74].pCurrent)
1036 1045
1037 #if SQLITE_OS_WINRT && !defined(SQLITE_OMIT_WAL) 1046 #if SQLITE_OS_WINRT && (!defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0)
1038 { "CreateFileMappingFromApp", (SYSCALL)CreateFileMappingFromApp, 0 }, 1047 { "CreateFileMappingFromApp", (SYSCALL)CreateFileMappingFromApp, 0 },
1039 #else 1048 #else
1040 { "CreateFileMappingFromApp", (SYSCALL)0, 0 }, 1049 { "CreateFileMappingFromApp", (SYSCALL)0, 0 },
1041 #endif 1050 #endif
1042 1051
1043 #define osCreateFileMappingFromApp ((HANDLE(WINAPI*)(HANDLE, \ 1052 #define osCreateFileMappingFromApp ((HANDLE(WINAPI*)(HANDLE, \
1044 LPSECURITY_ATTRIBUTES,ULONG,ULONG64,LPCWSTR))aSyscall[75].pCurrent) 1053 LPSECURITY_ATTRIBUTES,ULONG,ULONG64,LPCWSTR))aSyscall[75].pCurrent)
1045 1054
1046 /* 1055 /*
1047 ** NOTE: On some sub-platforms, the InterlockedCompareExchange "function" 1056 ** NOTE: On some sub-platforms, the InterlockedCompareExchange "function"
1048 ** is really just a macro that uses a compiler intrinsic (e.g. x64). 1057 ** is really just a macro that uses a compiler intrinsic (e.g. x64).
1049 ** So do not try to make this is into a redefinable interface. 1058 ** So do not try to make this is into a redefinable interface.
1050 */ 1059 */
1051 #if defined(InterlockedCompareExchange) 1060 #if defined(InterlockedCompareExchange)
1052 { "InterlockedCompareExchange", (SYSCALL)0, 0 }, 1061 { "InterlockedCompareExchange", (SYSCALL)0, 0 },
1053 1062
1054 #define osInterlockedCompareExchange InterlockedCompareExchange 1063 #define osInterlockedCompareExchange InterlockedCompareExchange
1055 #else 1064 #else
1056 { "InterlockedCompareExchange", (SYSCALL)InterlockedCompareExchange, 0 }, 1065 { "InterlockedCompareExchange", (SYSCALL)InterlockedCompareExchange, 0 },
1057 1066
1058 #define osInterlockedCompareExchange ((LONG(WINAPI*)(LONG \ 1067 #define osInterlockedCompareExchange ((LONG(WINAPI*)(LONG \
1059 SQLITE_WIN32_VOLATILE*, LONG,LONG))aSyscall[76].pCurrent) 1068 SQLITE_WIN32_VOLATILE*, LONG,LONG))aSyscall[76].pCurrent)
1060 #endif /* defined(InterlockedCompareExchange) */ 1069 #endif /* defined(InterlockedCompareExchange) */
1061 1070
1071 #if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && SQLITE_WIN32_USE_UUID
1072 { "UuidCreate", (SYSCALL)UuidCreate, 0 },
1073 #else
1074 { "UuidCreate", (SYSCALL)0, 0 },
1075 #endif
1076
1077 #define osUuidCreate ((RPC_STATUS(RPC_ENTRY*)(UUID*))aSyscall[77].pCurrent)
1078
1079 #if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && SQLITE_WIN32_USE_UUID
1080 { "UuidCreateSequential", (SYSCALL)UuidCreateSequential, 0 },
1081 #else
1082 { "UuidCreateSequential", (SYSCALL)0, 0 },
1083 #endif
1084
1085 #define osUuidCreateSequential \
1086 ((RPC_STATUS(RPC_ENTRY*)(UUID*))aSyscall[78].pCurrent)
1087
1088 #if !defined(SQLITE_NO_SYNC) && SQLITE_MAX_MMAP_SIZE>0
1089 { "FlushViewOfFile", (SYSCALL)FlushViewOfFile, 0 },
1090 #else
1091 { "FlushViewOfFile", (SYSCALL)0, 0 },
1092 #endif
1093
1094 #define osFlushViewOfFile \
1095 ((BOOL(WINAPI*)(LPCVOID,SIZE_T))aSyscall[79].pCurrent)
1096
1062 }; /* End of the overrideable system calls */ 1097 }; /* End of the overrideable system calls */
1063 1098
1064 /* 1099 /*
1065 ** This is the xSetSystemCall() method of sqlite3_vfs for all of the 1100 ** This is the xSetSystemCall() method of sqlite3_vfs for all of the
1066 ** "win32" VFSes. Return SQLITE_OK opon successfully updating the 1101 ** "win32" VFSes. Return SQLITE_OK opon successfully updating the
1067 ** system call pointer, or SQLITE_NOTFOUND if there is no configurable 1102 ** system call pointer, or SQLITE_NOTFOUND if there is no configurable
1068 ** system call named zName. 1103 ** system call named zName.
1069 */ 1104 */
1070 static int winSetSystemCall( 1105 static int winSetSystemCall(
1071 sqlite3_vfs *pNotUsed, /* The VFS pointer. Not used */ 1106 sqlite3_vfs *pNotUsed, /* The VFS pointer. Not used */
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
1189 /* 1224 /*
1190 ** If a Win32 native heap has been configured, this function will attempt to 1225 ** If a Win32 native heap has been configured, this function will attempt to
1191 ** destroy and recreate it. If the Win32 native heap is not isolated and/or 1226 ** destroy and recreate it. If the Win32 native heap is not isolated and/or
1192 ** the sqlite3_memory_used() function does not return zero, SQLITE_BUSY will 1227 ** the sqlite3_memory_used() function does not return zero, SQLITE_BUSY will
1193 ** be returned and no changes will be made to the Win32 native heap. 1228 ** be returned and no changes will be made to the Win32 native heap.
1194 */ 1229 */
1195 int sqlite3_win32_reset_heap(){ 1230 int sqlite3_win32_reset_heap(){
1196 int rc; 1231 int rc;
1197 MUTEX_LOGIC( sqlite3_mutex *pMaster; ) /* The main static mutex */ 1232 MUTEX_LOGIC( sqlite3_mutex *pMaster; ) /* The main static mutex */
1198 MUTEX_LOGIC( sqlite3_mutex *pMem; ) /* The memsys static mutex */ 1233 MUTEX_LOGIC( sqlite3_mutex *pMem; ) /* The memsys static mutex */
1199 MUTEX_LOGIC( pMaster = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); ) 1234 MUTEX_LOGIC( pMaster = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER); )
1200 MUTEX_LOGIC( pMem = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MEM); ) 1235 MUTEX_LOGIC( pMem = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MEM); )
1201 sqlite3_mutex_enter(pMaster); 1236 sqlite3_mutex_enter(pMaster);
1202 sqlite3_mutex_enter(pMem); 1237 sqlite3_mutex_enter(pMem);
1203 winMemAssertMagic(); 1238 winMemAssertMagic();
1204 if( winMemGetHeap()!=NULL && winMemGetOwned() && sqlite3_memory_used()==0 ){ 1239 if( winMemGetHeap()!=NULL && winMemGetOwned() && sqlite3_memory_used()==0 ){
1205 /* 1240 /*
1206 ** At this point, there should be no outstanding memory allocations on 1241 ** At this point, there should be no outstanding memory allocations on
1207 ** the heap. Also, since both the master and memsys locks are currently 1242 ** the heap. Also, since both the master and memsys locks are currently
1208 ** being held by us, no other function (i.e. from another thread) should 1243 ** being held by us, no other function (i.e. from another thread) should
1209 ** be able to even access the heap. Attempt to destroy and recreate our 1244 ** be able to even access the heap. Attempt to destroy and recreate our
1210 ** isolated Win32 native heap now. 1245 ** isolated Win32 native heap now.
(...skipping 724 matching lines...) Expand 10 before | Expand all | Expand 10 after
1935 #endif 1970 #endif
1936 if( pError ){ 1971 if( pError ){
1937 *pError = e; 1972 *pError = e;
1938 } 1973 }
1939 return 0; 1974 return 0;
1940 } 1975 }
1941 1976
1942 /* 1977 /*
1943 ** Log a I/O error retry episode. 1978 ** Log a I/O error retry episode.
1944 */ 1979 */
1945 static void winLogIoerr(int nRetry){ 1980 static void winLogIoerr(int nRetry, int lineno){
1946 if( nRetry ){ 1981 if( nRetry ){
1947 sqlite3_log(SQLITE_IOERR, 1982 sqlite3_log(SQLITE_NOTICE,
1948 "delayed %dms for lock/sharing conflict", 1983 "delayed %dms for lock/sharing conflict at line %d",
1949 winIoerrRetryDelay*nRetry*(nRetry+1)/2 1984 winIoerrRetryDelay*nRetry*(nRetry+1)/2, lineno
1950 ); 1985 );
1951 } 1986 }
1952 } 1987 }
1953 1988
1954 #if SQLITE_OS_WINCE 1989 #if SQLITE_OS_WINCE
1955 /************************************************************************* 1990 /*************************************************************************
1956 ** This section contains code for WinCE only. 1991 ** This section contains code for WinCE only.
1957 */ 1992 */
1958 #if !defined(SQLITE_MSVC_LOCALTIME_API) || !SQLITE_MSVC_LOCALTIME_API 1993 #if !defined(SQLITE_MSVC_LOCALTIME_API) || !SQLITE_MSVC_LOCALTIME_API
1959 /* 1994 /*
(...skipping 459 matching lines...) Expand 10 before | Expand all | Expand 10 after
2419 #define MX_CLOSE_ATTEMPT 3 2454 #define MX_CLOSE_ATTEMPT 3
2420 static int winClose(sqlite3_file *id){ 2455 static int winClose(sqlite3_file *id){
2421 int rc, cnt = 0; 2456 int rc, cnt = 0;
2422 winFile *pFile = (winFile*)id; 2457 winFile *pFile = (winFile*)id;
2423 2458
2424 assert( id!=0 ); 2459 assert( id!=0 );
2425 #ifndef SQLITE_OMIT_WAL 2460 #ifndef SQLITE_OMIT_WAL
2426 assert( pFile->pShm==0 ); 2461 assert( pFile->pShm==0 );
2427 #endif 2462 #endif
2428 assert( pFile->h!=NULL && pFile->h!=INVALID_HANDLE_VALUE ); 2463 assert( pFile->h!=NULL && pFile->h!=INVALID_HANDLE_VALUE );
2429 OSTRACE(("CLOSE file=%p\n", pFile->h)); 2464 OSTRACE(("CLOSE pid=%lu, pFile=%p, file=%p\n",
2465 osGetCurrentProcessId(), pFile, pFile->h));
2430 2466
2431 #if SQLITE_MAX_MMAP_SIZE>0 2467 #if SQLITE_MAX_MMAP_SIZE>0
2432 winUnmapfile(pFile); 2468 winUnmapfile(pFile);
2433 #endif 2469 #endif
2434 2470
2435 do{ 2471 do{
2436 rc = osCloseHandle(pFile->h); 2472 rc = osCloseHandle(pFile->h);
2437 /* SimulateIOError( rc=0; cnt=MX_CLOSE_ATTEMPT; ); */ 2473 /* SimulateIOError( rc=0; cnt=MX_CLOSE_ATTEMPT; ); */
2438 }while( rc==0 && ++cnt < MX_CLOSE_ATTEMPT && (sqlite3_win32_sleep(100), 1) ); 2474 }while( rc==0 && ++cnt < MX_CLOSE_ATTEMPT && (sqlite3_win32_sleep(100), 1) );
2439 #if SQLITE_OS_WINCE 2475 #if SQLITE_OS_WINCE
2440 #define WINCE_DELETION_ATTEMPTS 3 2476 #define WINCE_DELETION_ATTEMPTS 3
2441 winceDestroyLock(pFile); 2477 winceDestroyLock(pFile);
2442 if( pFile->zDeleteOnClose ){ 2478 if( pFile->zDeleteOnClose ){
2443 int cnt = 0; 2479 int cnt = 0;
2444 while( 2480 while(
2445 osDeleteFileW(pFile->zDeleteOnClose)==0 2481 osDeleteFileW(pFile->zDeleteOnClose)==0
2446 && osGetFileAttributesW(pFile->zDeleteOnClose)!=0xffffffff 2482 && osGetFileAttributesW(pFile->zDeleteOnClose)!=0xffffffff
2447 && cnt++ < WINCE_DELETION_ATTEMPTS 2483 && cnt++ < WINCE_DELETION_ATTEMPTS
2448 ){ 2484 ){
2449 sqlite3_win32_sleep(100); /* Wait a little before trying again */ 2485 sqlite3_win32_sleep(100); /* Wait a little before trying again */
2450 } 2486 }
2451 sqlite3_free(pFile->zDeleteOnClose); 2487 sqlite3_free(pFile->zDeleteOnClose);
2452 } 2488 }
2453 #endif 2489 #endif
2454 if( rc ){ 2490 if( rc ){
2455 pFile->h = NULL; 2491 pFile->h = NULL;
2456 } 2492 }
2457 OpenCounter(-1); 2493 OpenCounter(-1);
2458 OSTRACE(("CLOSE file=%p, rc=%s\n", pFile->h, rc ? "ok" : "failed")); 2494 OSTRACE(("CLOSE pid=%lu, pFile=%p, file=%p, rc=%s\n",
2495 osGetCurrentProcessId(), pFile, pFile->h, rc ? "ok" : "failed"));
2459 return rc ? SQLITE_OK 2496 return rc ? SQLITE_OK
2460 : winLogError(SQLITE_IOERR_CLOSE, osGetLastError(), 2497 : winLogError(SQLITE_IOERR_CLOSE, osGetLastError(),
2461 "winClose", pFile->zPath); 2498 "winClose", pFile->zPath);
2462 } 2499 }
2463 2500
2464 /* 2501 /*
2465 ** Read data from a file into a buffer. Return SQLITE_OK if all 2502 ** Read data from a file into a buffer. Return SQLITE_OK if all
2466 ** bytes were read successfully and SQLITE_IOERR if anything goes 2503 ** bytes were read successfully and SQLITE_IOERR if anything goes
2467 ** wrong. 2504 ** wrong.
2468 */ 2505 */
2469 static int winRead( 2506 static int winRead(
2470 sqlite3_file *id, /* File to read from */ 2507 sqlite3_file *id, /* File to read from */
2471 void *pBuf, /* Write content into this buffer */ 2508 void *pBuf, /* Write content into this buffer */
2472 int amt, /* Number of bytes to read */ 2509 int amt, /* Number of bytes to read */
2473 sqlite3_int64 offset /* Begin reading at this offset */ 2510 sqlite3_int64 offset /* Begin reading at this offset */
2474 ){ 2511 ){
2475 #if !SQLITE_OS_WINCE 2512 #if !SQLITE_OS_WINCE && !defined(SQLITE_WIN32_NO_OVERLAPPED)
2476 OVERLAPPED overlapped; /* The offset for ReadFile. */ 2513 OVERLAPPED overlapped; /* The offset for ReadFile. */
2477 #endif 2514 #endif
2478 winFile *pFile = (winFile*)id; /* file handle */ 2515 winFile *pFile = (winFile*)id; /* file handle */
2479 DWORD nRead; /* Number of bytes actually read from file */ 2516 DWORD nRead; /* Number of bytes actually read from file */
2480 int nRetry = 0; /* Number of retrys */ 2517 int nRetry = 0; /* Number of retrys */
2481 2518
2482 assert( id!=0 ); 2519 assert( id!=0 );
2483 assert( amt>0 ); 2520 assert( amt>0 );
2484 assert( offset>=0 ); 2521 assert( offset>=0 );
2485 SimulateIOError(return SQLITE_IOERR_READ); 2522 SimulateIOError(return SQLITE_IOERR_READ);
2486 OSTRACE(("READ file=%p, buffer=%p, amount=%d, offset=%lld, lock=%d\n", 2523 OSTRACE(("READ pid=%lu, pFile=%p, file=%p, buffer=%p, amount=%d, "
2524 "offset=%lld, lock=%d\n", osGetCurrentProcessId(), pFile,
2487 pFile->h, pBuf, amt, offset, pFile->locktype)); 2525 pFile->h, pBuf, amt, offset, pFile->locktype));
2488 2526
2489 #if SQLITE_MAX_MMAP_SIZE>0 2527 #if SQLITE_MAX_MMAP_SIZE>0
2490 /* Deal with as much of this read request as possible by transfering 2528 /* Deal with as much of this read request as possible by transfering
2491 ** data from the memory mapping using memcpy(). */ 2529 ** data from the memory mapping using memcpy(). */
2492 if( offset<pFile->mmapSize ){ 2530 if( offset<pFile->mmapSize ){
2493 if( offset+amt <= pFile->mmapSize ){ 2531 if( offset+amt <= pFile->mmapSize ){
2494 memcpy(pBuf, &((u8 *)(pFile->pMapRegion))[offset], amt); 2532 memcpy(pBuf, &((u8 *)(pFile->pMapRegion))[offset], amt);
2495 OSTRACE(("READ-MMAP file=%p, rc=SQLITE_OK\n", pFile->h)); 2533 OSTRACE(("READ-MMAP pid=%lu, pFile=%p, file=%p, rc=SQLITE_OK\n",
2534 osGetCurrentProcessId(), pFile, pFile->h));
2496 return SQLITE_OK; 2535 return SQLITE_OK;
2497 }else{ 2536 }else{
2498 int nCopy = (int)(pFile->mmapSize - offset); 2537 int nCopy = (int)(pFile->mmapSize - offset);
2499 memcpy(pBuf, &((u8 *)(pFile->pMapRegion))[offset], nCopy); 2538 memcpy(pBuf, &((u8 *)(pFile->pMapRegion))[offset], nCopy);
2500 pBuf = &((u8 *)pBuf)[nCopy]; 2539 pBuf = &((u8 *)pBuf)[nCopy];
2501 amt -= nCopy; 2540 amt -= nCopy;
2502 offset += nCopy; 2541 offset += nCopy;
2503 } 2542 }
2504 } 2543 }
2505 #endif 2544 #endif
2506 2545
2507 #if SQLITE_OS_WINCE 2546 #if SQLITE_OS_WINCE || defined(SQLITE_WIN32_NO_OVERLAPPED)
2508 if( winSeekFile(pFile, offset) ){ 2547 if( winSeekFile(pFile, offset) ){
2509 OSTRACE(("READ file=%p, rc=SQLITE_FULL\n", pFile->h)); 2548 OSTRACE(("READ pid=%lu, pFile=%p, file=%p, rc=SQLITE_FULL\n",
2549 osGetCurrentProcessId(), pFile, pFile->h));
2510 return SQLITE_FULL; 2550 return SQLITE_FULL;
2511 } 2551 }
2512 while( !osReadFile(pFile->h, pBuf, amt, &nRead, 0) ){ 2552 while( !osReadFile(pFile->h, pBuf, amt, &nRead, 0) ){
2513 #else 2553 #else
2514 memset(&overlapped, 0, sizeof(OVERLAPPED)); 2554 memset(&overlapped, 0, sizeof(OVERLAPPED));
2515 overlapped.Offset = (LONG)(offset & 0xffffffff); 2555 overlapped.Offset = (LONG)(offset & 0xffffffff);
2516 overlapped.OffsetHigh = (LONG)((offset>>32) & 0x7fffffff); 2556 overlapped.OffsetHigh = (LONG)((offset>>32) & 0x7fffffff);
2517 while( !osReadFile(pFile->h, pBuf, amt, &nRead, &overlapped) && 2557 while( !osReadFile(pFile->h, pBuf, amt, &nRead, &overlapped) &&
2518 osGetLastError()!=ERROR_HANDLE_EOF ){ 2558 osGetLastError()!=ERROR_HANDLE_EOF ){
2519 #endif 2559 #endif
2520 DWORD lastErrno; 2560 DWORD lastErrno;
2521 if( winRetryIoerr(&nRetry, &lastErrno) ) continue; 2561 if( winRetryIoerr(&nRetry, &lastErrno) ) continue;
2522 pFile->lastErrno = lastErrno; 2562 pFile->lastErrno = lastErrno;
2523 OSTRACE(("READ file=%p, rc=SQLITE_IOERR_READ\n", pFile->h)); 2563 OSTRACE(("READ pid=%lu, pFile=%p, file=%p, rc=SQLITE_IOERR_READ\n",
2564 osGetCurrentProcessId(), pFile, pFile->h));
2524 return winLogError(SQLITE_IOERR_READ, pFile->lastErrno, 2565 return winLogError(SQLITE_IOERR_READ, pFile->lastErrno,
2525 "winRead", pFile->zPath); 2566 "winRead", pFile->zPath);
2526 } 2567 }
2527 winLogIoerr(nRetry); 2568 winLogIoerr(nRetry, __LINE__);
2528 if( nRead<(DWORD)amt ){ 2569 if( nRead<(DWORD)amt ){
2529 /* Unread parts of the buffer must be zero-filled */ 2570 /* Unread parts of the buffer must be zero-filled */
2530 memset(&((char*)pBuf)[nRead], 0, amt-nRead); 2571 memset(&((char*)pBuf)[nRead], 0, amt-nRead);
2531 OSTRACE(("READ file=%p, rc=SQLITE_IOERR_SHORT_READ\n", pFile->h)); 2572 OSTRACE(("READ pid=%lu, pFile=%p, file=%p, rc=SQLITE_IOERR_SHORT_READ\n",
2573 osGetCurrentProcessId(), pFile, pFile->h));
2532 return SQLITE_IOERR_SHORT_READ; 2574 return SQLITE_IOERR_SHORT_READ;
2533 } 2575 }
2534 2576
2535 OSTRACE(("READ file=%p, rc=SQLITE_OK\n", pFile->h)); 2577 OSTRACE(("READ pid=%lu, pFile=%p, file=%p, rc=SQLITE_OK\n",
2578 osGetCurrentProcessId(), pFile, pFile->h));
2536 return SQLITE_OK; 2579 return SQLITE_OK;
2537 } 2580 }
2538 2581
2539 /* 2582 /*
2540 ** Write data from a buffer into a file. Return SQLITE_OK on success 2583 ** Write data from a buffer into a file. Return SQLITE_OK on success
2541 ** or some other error code on failure. 2584 ** or some other error code on failure.
2542 */ 2585 */
2543 static int winWrite( 2586 static int winWrite(
2544 sqlite3_file *id, /* File to write into */ 2587 sqlite3_file *id, /* File to write into */
2545 const void *pBuf, /* The bytes to be written */ 2588 const void *pBuf, /* The bytes to be written */
2546 int amt, /* Number of bytes to write */ 2589 int amt, /* Number of bytes to write */
2547 sqlite3_int64 offset /* Offset into the file to begin writing at */ 2590 sqlite3_int64 offset /* Offset into the file to begin writing at */
2548 ){ 2591 ){
2549 int rc = 0; /* True if error has occurred, else false */ 2592 int rc = 0; /* True if error has occurred, else false */
2550 winFile *pFile = (winFile*)id; /* File handle */ 2593 winFile *pFile = (winFile*)id; /* File handle */
2551 int nRetry = 0; /* Number of retries */ 2594 int nRetry = 0; /* Number of retries */
2552 2595
2553 assert( amt>0 ); 2596 assert( amt>0 );
2554 assert( pFile ); 2597 assert( pFile );
2555 SimulateIOError(return SQLITE_IOERR_WRITE); 2598 SimulateIOError(return SQLITE_IOERR_WRITE);
2556 SimulateDiskfullError(return SQLITE_FULL); 2599 SimulateDiskfullError(return SQLITE_FULL);
2557 2600
2558 OSTRACE(("WRITE file=%p, buffer=%p, amount=%d, offset=%lld, lock=%d\n", 2601 OSTRACE(("WRITE pid=%lu, pFile=%p, file=%p, buffer=%p, amount=%d, "
2602 "offset=%lld, lock=%d\n", osGetCurrentProcessId(), pFile,
2559 pFile->h, pBuf, amt, offset, pFile->locktype)); 2603 pFile->h, pBuf, amt, offset, pFile->locktype));
2560 2604
2561 #if !SQLITE_MMAP_READ_ONLY 2605 #if defined(SQLITE_MMAP_READWRITE) && SQLITE_MAX_MMAP_SIZE>0
2562 #if SQLITE_MAX_MMAP_SIZE>0
2563 /* Deal with as much of this write request as possible by transfering 2606 /* Deal with as much of this write request as possible by transfering
2564 ** data from the memory mapping using memcpy(). */ 2607 ** data from the memory mapping using memcpy(). */
2565 if( offset<pFile->mmapSize ){ 2608 if( offset<pFile->mmapSize ){
2566 if( offset+amt <= pFile->mmapSize ){ 2609 if( offset+amt <= pFile->mmapSize ){
2567 memcpy(&((u8 *)(pFile->pMapRegion))[offset], pBuf, amt); 2610 memcpy(&((u8 *)(pFile->pMapRegion))[offset], pBuf, amt);
2568 OSTRACE(("WRITE-MMAP file=%p, rc=SQLITE_OK\n", pFile->h)); 2611 OSTRACE(("WRITE-MMAP pid=%lu, pFile=%p, file=%p, rc=SQLITE_OK\n",
2612 osGetCurrentProcessId(), pFile, pFile->h));
2569 return SQLITE_OK; 2613 return SQLITE_OK;
2570 }else{ 2614 }else{
2571 int nCopy = (int)(pFile->mmapSize - offset); 2615 int nCopy = (int)(pFile->mmapSize - offset);
2572 memcpy(&((u8 *)(pFile->pMapRegion))[offset], pBuf, nCopy); 2616 memcpy(&((u8 *)(pFile->pMapRegion))[offset], pBuf, nCopy);
2573 pBuf = &((u8 *)pBuf)[nCopy]; 2617 pBuf = &((u8 *)pBuf)[nCopy];
2574 amt -= nCopy; 2618 amt -= nCopy;
2575 offset += nCopy; 2619 offset += nCopy;
2576 } 2620 }
2577 } 2621 }
2578 #endif 2622 #endif
2579 #endif
2580 2623
2581 #if SQLITE_OS_WINCE 2624 #if SQLITE_OS_WINCE || defined(SQLITE_WIN32_NO_OVERLAPPED)
2582 rc = winSeekFile(pFile, offset); 2625 rc = winSeekFile(pFile, offset);
2583 if( rc==0 ){ 2626 if( rc==0 ){
2584 #else 2627 #else
2585 { 2628 {
2586 #endif 2629 #endif
2587 #if !SQLITE_OS_WINCE 2630 #if !SQLITE_OS_WINCE && !defined(SQLITE_WIN32_NO_OVERLAPPED)
2588 OVERLAPPED overlapped; /* The offset for WriteFile. */ 2631 OVERLAPPED overlapped; /* The offset for WriteFile. */
2589 #endif 2632 #endif
2590 u8 *aRem = (u8 *)pBuf; /* Data yet to be written */ 2633 u8 *aRem = (u8 *)pBuf; /* Data yet to be written */
2591 int nRem = amt; /* Number of bytes yet to be written */ 2634 int nRem = amt; /* Number of bytes yet to be written */
2592 DWORD nWrite; /* Bytes written by each WriteFile() call */ 2635 DWORD nWrite; /* Bytes written by each WriteFile() call */
2593 DWORD lastErrno = NO_ERROR; /* Value returned by GetLastError() */ 2636 DWORD lastErrno = NO_ERROR; /* Value returned by GetLastError() */
2594 2637
2595 #if !SQLITE_OS_WINCE 2638 #if !SQLITE_OS_WINCE && !defined(SQLITE_WIN32_NO_OVERLAPPED)
2596 memset(&overlapped, 0, sizeof(OVERLAPPED)); 2639 memset(&overlapped, 0, sizeof(OVERLAPPED));
2597 overlapped.Offset = (LONG)(offset & 0xffffffff); 2640 overlapped.Offset = (LONG)(offset & 0xffffffff);
2598 overlapped.OffsetHigh = (LONG)((offset>>32) & 0x7fffffff); 2641 overlapped.OffsetHigh = (LONG)((offset>>32) & 0x7fffffff);
2599 #endif 2642 #endif
2600 2643
2601 while( nRem>0 ){ 2644 while( nRem>0 ){
2602 #if SQLITE_OS_WINCE 2645 #if SQLITE_OS_WINCE || defined(SQLITE_WIN32_NO_OVERLAPPED)
2603 if( !osWriteFile(pFile->h, aRem, nRem, &nWrite, 0) ){ 2646 if( !osWriteFile(pFile->h, aRem, nRem, &nWrite, 0) ){
2604 #else 2647 #else
2605 if( !osWriteFile(pFile->h, aRem, nRem, &nWrite, &overlapped) ){ 2648 if( !osWriteFile(pFile->h, aRem, nRem, &nWrite, &overlapped) ){
2606 #endif 2649 #endif
2607 if( winRetryIoerr(&nRetry, &lastErrno) ) continue; 2650 if( winRetryIoerr(&nRetry, &lastErrno) ) continue;
2608 break; 2651 break;
2609 } 2652 }
2610 assert( nWrite==0 || nWrite<=(DWORD)nRem ); 2653 assert( nWrite==0 || nWrite<=(DWORD)nRem );
2611 if( nWrite==0 || nWrite>(DWORD)nRem ){ 2654 if( nWrite==0 || nWrite>(DWORD)nRem ){
2612 lastErrno = osGetLastError(); 2655 lastErrno = osGetLastError();
2613 break; 2656 break;
2614 } 2657 }
2615 #if !SQLITE_OS_WINCE 2658 #if !SQLITE_OS_WINCE && !defined(SQLITE_WIN32_NO_OVERLAPPED)
2616 offset += nWrite; 2659 offset += nWrite;
2617 overlapped.Offset = (LONG)(offset & 0xffffffff); 2660 overlapped.Offset = (LONG)(offset & 0xffffffff);
2618 overlapped.OffsetHigh = (LONG)((offset>>32) & 0x7fffffff); 2661 overlapped.OffsetHigh = (LONG)((offset>>32) & 0x7fffffff);
2619 #endif 2662 #endif
2620 aRem += nWrite; 2663 aRem += nWrite;
2621 nRem -= nWrite; 2664 nRem -= nWrite;
2622 } 2665 }
2623 if( nRem>0 ){ 2666 if( nRem>0 ){
2624 pFile->lastErrno = lastErrno; 2667 pFile->lastErrno = lastErrno;
2625 rc = 1; 2668 rc = 1;
2626 } 2669 }
2627 } 2670 }
2628 2671
2629 if( rc ){ 2672 if( rc ){
2630 if( ( pFile->lastErrno==ERROR_HANDLE_DISK_FULL ) 2673 if( ( pFile->lastErrno==ERROR_HANDLE_DISK_FULL )
2631 || ( pFile->lastErrno==ERROR_DISK_FULL )){ 2674 || ( pFile->lastErrno==ERROR_DISK_FULL )){
2632 OSTRACE(("WRITE file=%p, rc=SQLITE_FULL\n", pFile->h)); 2675 OSTRACE(("WRITE pid=%lu, pFile=%p, file=%p, rc=SQLITE_FULL\n",
2676 osGetCurrentProcessId(), pFile, pFile->h));
2633 return winLogError(SQLITE_FULL, pFile->lastErrno, 2677 return winLogError(SQLITE_FULL, pFile->lastErrno,
2634 "winWrite1", pFile->zPath); 2678 "winWrite1", pFile->zPath);
2635 } 2679 }
2636 OSTRACE(("WRITE file=%p, rc=SQLITE_IOERR_WRITE\n", pFile->h)); 2680 OSTRACE(("WRITE pid=%lu, pFile=%p, file=%p, rc=SQLITE_IOERR_WRITE\n",
2681 osGetCurrentProcessId(), pFile, pFile->h));
2637 return winLogError(SQLITE_IOERR_WRITE, pFile->lastErrno, 2682 return winLogError(SQLITE_IOERR_WRITE, pFile->lastErrno,
2638 "winWrite2", pFile->zPath); 2683 "winWrite2", pFile->zPath);
2639 }else{ 2684 }else{
2640 winLogIoerr(nRetry); 2685 winLogIoerr(nRetry, __LINE__);
2641 } 2686 }
2642 OSTRACE(("WRITE file=%p, rc=SQLITE_OK\n", pFile->h)); 2687 OSTRACE(("WRITE pid=%lu, pFile=%p, file=%p, rc=SQLITE_OK\n",
2688 osGetCurrentProcessId(), pFile, pFile->h));
2643 return SQLITE_OK; 2689 return SQLITE_OK;
2644 } 2690 }
2645 2691
2646 /* 2692 /*
2647 ** Truncate an open file to a specified size 2693 ** Truncate an open file to a specified size
2648 */ 2694 */
2649 static int winTruncate(sqlite3_file *id, sqlite3_int64 nByte){ 2695 static int winTruncate(sqlite3_file *id, sqlite3_int64 nByte){
2650 winFile *pFile = (winFile*)id; /* File handle object */ 2696 winFile *pFile = (winFile*)id; /* File handle object */
2651 int rc = SQLITE_OK; /* Return code for this function */ 2697 int rc = SQLITE_OK; /* Return code for this function */
2652 DWORD lastErrno; 2698 DWORD lastErrno;
2653 2699
2654 assert( pFile ); 2700 assert( pFile );
2655 SimulateIOError(return SQLITE_IOERR_TRUNCATE); 2701 SimulateIOError(return SQLITE_IOERR_TRUNCATE);
2656 OSTRACE(("TRUNCATE file=%p, size=%lld, lock=%d\n", 2702 OSTRACE(("TRUNCATE pid=%lu, pFile=%p, file=%p, size=%lld, lock=%d\n",
2657 pFile->h, nByte, pFile->locktype)); 2703 osGetCurrentProcessId(), pFile, pFile->h, nByte, pFile->locktype));
2658 2704
2659 /* If the user has configured a chunk-size for this file, truncate the 2705 /* If the user has configured a chunk-size for this file, truncate the
2660 ** file so that it consists of an integer number of chunks (i.e. the 2706 ** file so that it consists of an integer number of chunks (i.e. the
2661 ** actual file size after the operation may be larger than the requested 2707 ** actual file size after the operation may be larger than the requested
2662 ** size). 2708 ** size).
2663 */ 2709 */
2664 if( pFile->szChunk>0 ){ 2710 if( pFile->szChunk>0 ){
2665 nByte = ((nByte + pFile->szChunk - 1)/pFile->szChunk) * pFile->szChunk; 2711 nByte = ((nByte + pFile->szChunk - 1)/pFile->szChunk) * pFile->szChunk;
2666 } 2712 }
2667 2713
(...skipping 11 matching lines...) Expand all
2679 #if SQLITE_MAX_MMAP_SIZE>0 2725 #if SQLITE_MAX_MMAP_SIZE>0
2680 /* If the file was truncated to a size smaller than the currently 2726 /* If the file was truncated to a size smaller than the currently
2681 ** mapped region, reduce the effective mapping size as well. SQLite will 2727 ** mapped region, reduce the effective mapping size as well. SQLite will
2682 ** use read() and write() to access data beyond this point from now on. 2728 ** use read() and write() to access data beyond this point from now on.
2683 */ 2729 */
2684 if( pFile->pMapRegion && nByte<pFile->mmapSize ){ 2730 if( pFile->pMapRegion && nByte<pFile->mmapSize ){
2685 pFile->mmapSize = nByte; 2731 pFile->mmapSize = nByte;
2686 } 2732 }
2687 #endif 2733 #endif
2688 2734
2689 OSTRACE(("TRUNCATE file=%p, rc=%s\n", pFile->h, sqlite3ErrName(rc))); 2735 OSTRACE(("TRUNCATE pid=%lu, pFile=%p, file=%p, rc=%s\n",
2736 osGetCurrentProcessId(), pFile, pFile->h, sqlite3ErrName(rc)));
2690 return rc; 2737 return rc;
2691 } 2738 }
2692 2739
2693 #ifdef SQLITE_TEST 2740 #ifdef SQLITE_TEST
2694 /* 2741 /*
2695 ** Count the number of fullsyncs and normal syncs. This is used to test 2742 ** Count the number of fullsyncs and normal syncs. This is used to test
2696 ** that syncs and fullsyncs are occuring at the right times. 2743 ** that syncs and fullsyncs are occuring at the right times.
2697 */ 2744 */
2698 int sqlite3_sync_count = 0; 2745 int sqlite3_sync_count = 0;
2699 int sqlite3_fullsync_count = 0; 2746 int sqlite3_fullsync_count = 0;
2700 #endif 2747 #endif
2701 2748
2702 /* 2749 /*
2703 ** Make sure all writes to a particular file are committed to disk. 2750 ** Make sure all writes to a particular file are committed to disk.
2704 */ 2751 */
2705 static int winSync(sqlite3_file *id, int flags){ 2752 static int winSync(sqlite3_file *id, int flags){
2706 #ifndef SQLITE_NO_SYNC 2753 #ifndef SQLITE_NO_SYNC
2707 /* 2754 /*
2708 ** Used only when SQLITE_NO_SYNC is not defined. 2755 ** Used only when SQLITE_NO_SYNC is not defined.
2709 */ 2756 */
2710 BOOL rc; 2757 BOOL rc;
2711 #endif 2758 #endif
2712 #if !defined(NDEBUG) || !defined(SQLITE_NO_SYNC) || \ 2759 #if !defined(NDEBUG) || !defined(SQLITE_NO_SYNC) || \
2713 (defined(SQLITE_TEST) && defined(SQLITE_DEBUG)) 2760 defined(SQLITE_HAVE_OS_TRACE)
2714 /* 2761 /*
2715 ** Used when SQLITE_NO_SYNC is not defined and by the assert() and/or 2762 ** Used when SQLITE_NO_SYNC is not defined and by the assert() and/or
2716 ** OSTRACE() macros. 2763 ** OSTRACE() macros.
2717 */ 2764 */
2718 winFile *pFile = (winFile*)id; 2765 winFile *pFile = (winFile*)id;
2719 #else 2766 #else
2720 UNUSED_PARAMETER(id); 2767 UNUSED_PARAMETER(id);
2721 #endif 2768 #endif
2722 2769
2723 assert( pFile ); 2770 assert( pFile );
2724 /* Check that one of SQLITE_SYNC_NORMAL or FULL was passed */ 2771 /* Check that one of SQLITE_SYNC_NORMAL or FULL was passed */
2725 assert((flags&0x0F)==SQLITE_SYNC_NORMAL 2772 assert((flags&0x0F)==SQLITE_SYNC_NORMAL
2726 || (flags&0x0F)==SQLITE_SYNC_FULL 2773 || (flags&0x0F)==SQLITE_SYNC_FULL
2727 ); 2774 );
2728 2775
2729 /* Unix cannot, but some systems may return SQLITE_FULL from here. This 2776 /* Unix cannot, but some systems may return SQLITE_FULL from here. This
2730 ** line is to test that doing so does not cause any problems. 2777 ** line is to test that doing so does not cause any problems.
2731 */ 2778 */
2732 SimulateDiskfullError( return SQLITE_FULL ); 2779 SimulateDiskfullError( return SQLITE_FULL );
2733 2780
2734 OSTRACE(("SYNC file=%p, flags=%x, lock=%d\n", 2781 OSTRACE(("SYNC pid=%lu, pFile=%p, file=%p, flags=%x, lock=%d\n",
2735 pFile->h, flags, pFile->locktype)); 2782 osGetCurrentProcessId(), pFile, pFile->h, flags,
2783 pFile->locktype));
2736 2784
2737 #ifndef SQLITE_TEST 2785 #ifndef SQLITE_TEST
2738 UNUSED_PARAMETER(flags); 2786 UNUSED_PARAMETER(flags);
2739 #else 2787 #else
2740 if( (flags&0x0F)==SQLITE_SYNC_FULL ){ 2788 if( (flags&0x0F)==SQLITE_SYNC_FULL ){
2741 sqlite3_fullsync_count++; 2789 sqlite3_fullsync_count++;
2742 } 2790 }
2743 sqlite3_sync_count++; 2791 sqlite3_sync_count++;
2744 #endif 2792 #endif
2745 2793
2746 /* If we compiled with the SQLITE_NO_SYNC flag, then syncing is a 2794 /* If we compiled with the SQLITE_NO_SYNC flag, then syncing is a
2747 ** no-op 2795 ** no-op
2748 */ 2796 */
2749 #ifdef SQLITE_NO_SYNC 2797 #ifdef SQLITE_NO_SYNC
2750 OSTRACE(("SYNC-NOP file=%p, rc=SQLITE_OK\n", pFile->h)); 2798 OSTRACE(("SYNC-NOP pid=%lu, pFile=%p, file=%p, rc=SQLITE_OK\n",
2799 osGetCurrentProcessId(), pFile, pFile->h));
2751 return SQLITE_OK; 2800 return SQLITE_OK;
2752 #else 2801 #else
2802 #if SQLITE_MAX_MMAP_SIZE>0
2803 if( pFile->pMapRegion ){
2804 if( osFlushViewOfFile(pFile->pMapRegion, 0) ){
2805 OSTRACE(("SYNC-MMAP pid=%lu, pFile=%p, pMapRegion=%p, "
2806 "rc=SQLITE_OK\n", osGetCurrentProcessId(),
2807 pFile, pFile->pMapRegion));
2808 }else{
2809 pFile->lastErrno = osGetLastError();
2810 OSTRACE(("SYNC-MMAP pid=%lu, pFile=%p, pMapRegion=%p, "
2811 "rc=SQLITE_IOERR_MMAP\n", osGetCurrentProcessId(),
2812 pFile, pFile->pMapRegion));
2813 return winLogError(SQLITE_IOERR_MMAP, pFile->lastErrno,
2814 "winSync1", pFile->zPath);
2815 }
2816 }
2817 #endif
2753 rc = osFlushFileBuffers(pFile->h); 2818 rc = osFlushFileBuffers(pFile->h);
2754 SimulateIOError( rc=FALSE ); 2819 SimulateIOError( rc=FALSE );
2755 if( rc ){ 2820 if( rc ){
2756 OSTRACE(("SYNC file=%p, rc=SQLITE_OK\n", pFile->h)); 2821 OSTRACE(("SYNC pid=%lu, pFile=%p, file=%p, rc=SQLITE_OK\n",
2822 osGetCurrentProcessId(), pFile, pFile->h));
2757 return SQLITE_OK; 2823 return SQLITE_OK;
2758 }else{ 2824 }else{
2759 pFile->lastErrno = osGetLastError(); 2825 pFile->lastErrno = osGetLastError();
2760 OSTRACE(("SYNC file=%p, rc=SQLITE_IOERR_FSYNC\n", pFile->h)); 2826 OSTRACE(("SYNC pid=%lu, pFile=%p, file=%p, rc=SQLITE_IOERR_FSYNC\n",
2827 osGetCurrentProcessId(), pFile, pFile->h));
2761 return winLogError(SQLITE_IOERR_FSYNC, pFile->lastErrno, 2828 return winLogError(SQLITE_IOERR_FSYNC, pFile->lastErrno,
2762 "winSync", pFile->zPath); 2829 "winSync2", pFile->zPath);
2763 } 2830 }
2764 #endif 2831 #endif
2765 } 2832 }
2766 2833
2767 /* 2834 /*
2768 ** Determine the current size of a file in bytes 2835 ** Determine the current size of a file in bytes
2769 */ 2836 */
2770 static int winFileSize(sqlite3_file *id, sqlite3_int64 *pSize){ 2837 static int winFileSize(sqlite3_file *id, sqlite3_int64 *pSize){
2771 winFile *pFile = (winFile*)id; 2838 winFile *pFile = (winFile*)id;
2772 int rc = SQLITE_OK; 2839 int rc = SQLITE_OK;
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
2941 3008
2942 /* If there is already a lock of this type or more restrictive on the 3009 /* If there is already a lock of this type or more restrictive on the
2943 ** OsFile, do nothing. Don't use the end_lock: exit path, as 3010 ** OsFile, do nothing. Don't use the end_lock: exit path, as
2944 ** sqlite3OsEnterMutex() hasn't been called yet. 3011 ** sqlite3OsEnterMutex() hasn't been called yet.
2945 */ 3012 */
2946 if( pFile->locktype>=locktype ){ 3013 if( pFile->locktype>=locktype ){
2947 OSTRACE(("LOCK-HELD file=%p, rc=SQLITE_OK\n", pFile->h)); 3014 OSTRACE(("LOCK-HELD file=%p, rc=SQLITE_OK\n", pFile->h));
2948 return SQLITE_OK; 3015 return SQLITE_OK;
2949 } 3016 }
2950 3017
3018 /* Do not allow any kind of write-lock on a read-only database
3019 */
3020 if( (pFile->ctrlFlags & WINFILE_RDONLY)!=0 && locktype>=RESERVED_LOCK ){
3021 return SQLITE_IOERR_LOCK;
3022 }
3023
2951 /* Make sure the locking sequence is correct 3024 /* Make sure the locking sequence is correct
2952 */ 3025 */
2953 assert( pFile->locktype!=NO_LOCK || locktype==SHARED_LOCK ); 3026 assert( pFile->locktype!=NO_LOCK || locktype==SHARED_LOCK );
2954 assert( locktype!=PENDING_LOCK ); 3027 assert( locktype!=PENDING_LOCK );
2955 assert( locktype!=RESERVED_LOCK || pFile->locktype==SHARED_LOCK ); 3028 assert( locktype!=RESERVED_LOCK || pFile->locktype==SHARED_LOCK );
2956 3029
2957 /* Lock the PENDING_LOCK byte if we need to acquire a PENDING lock or 3030 /* Lock the PENDING_LOCK byte if we need to acquire a PENDING lock or
2958 ** a SHARED lock. If we are acquiring a SHARED lock, the acquisition of 3031 ** a SHARED lock. If we are acquiring a SHARED lock, the acquisition of
2959 ** the PENDING_LOCK byte is temporary. 3032 ** the PENDING_LOCK byte is temporary.
2960 */ 3033 */
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
3070 winFile *pFile = (winFile*)id; 3143 winFile *pFile = (winFile*)id;
3071 3144
3072 SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; ); 3145 SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; );
3073 OSTRACE(("TEST-WR-LOCK file=%p, pResOut=%p\n", pFile->h, pResOut)); 3146 OSTRACE(("TEST-WR-LOCK file=%p, pResOut=%p\n", pFile->h, pResOut));
3074 3147
3075 assert( id!=0 ); 3148 assert( id!=0 );
3076 if( pFile->locktype>=RESERVED_LOCK ){ 3149 if( pFile->locktype>=RESERVED_LOCK ){
3077 res = 1; 3150 res = 1;
3078 OSTRACE(("TEST-WR-LOCK file=%p, result=%d (local)\n", pFile->h, res)); 3151 OSTRACE(("TEST-WR-LOCK file=%p, result=%d (local)\n", pFile->h, res));
3079 }else{ 3152 }else{
3080 res = winLockFile(&pFile->h, SQLITE_LOCKFILEEX_FLAGS,RESERVED_BYTE, 0, 1, 0) ; 3153 res = winLockFile(&pFile->h, SQLITE_LOCKFILEEX_FLAGS,RESERVED_BYTE,0,1,0);
3081 if( res ){ 3154 if( res ){
3082 winUnlockFile(&pFile->h, RESERVED_BYTE, 0, 1, 0); 3155 winUnlockFile(&pFile->h, RESERVED_BYTE, 0, 1, 0);
3083 } 3156 }
3084 res = !res; 3157 res = !res;
3085 OSTRACE(("TEST-WR-LOCK file=%p, result=%d (remote)\n", pFile->h, res)); 3158 OSTRACE(("TEST-WR-LOCK file=%p, result=%d (remote)\n", pFile->h, res));
3086 } 3159 }
3087 *pResOut = res; 3160 *pResOut = res;
3088 OSTRACE(("TEST-WR-LOCK file=%p, pResOut=%p, *pResOut=%d, rc=SQLITE_OK\n", 3161 OSTRACE(("TEST-WR-LOCK file=%p, pResOut=%p, *pResOut=%d, rc=SQLITE_OK\n",
3089 pFile->h, pResOut, *pResOut)); 3162 pFile->h, pResOut, *pResOut));
3090 return SQLITE_OK; 3163 return SQLITE_OK;
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
3310 ** 3383 **
3311 ** Function winShmMutexHeld() is used to assert() that the global mutex 3384 ** Function winShmMutexHeld() is used to assert() that the global mutex
3312 ** is held when required. This function is only used as part of assert() 3385 ** is held when required. This function is only used as part of assert()
3313 ** statements. e.g. 3386 ** statements. e.g.
3314 ** 3387 **
3315 ** winShmEnterMutex() 3388 ** winShmEnterMutex()
3316 ** assert( winShmMutexHeld() ); 3389 ** assert( winShmMutexHeld() );
3317 ** winShmLeaveMutex() 3390 ** winShmLeaveMutex()
3318 */ 3391 */
3319 static void winShmEnterMutex(void){ 3392 static void winShmEnterMutex(void){
3320 sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER)); 3393 sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_VFS1));
3321 } 3394 }
3322 static void winShmLeaveMutex(void){ 3395 static void winShmLeaveMutex(void){
3323 sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER)); 3396 sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_VFS1));
3324 } 3397 }
3325 #ifndef NDEBUG 3398 #ifndef NDEBUG
3326 static int winShmMutexHeld(void) { 3399 static int winShmMutexHeld(void) {
3327 return sqlite3_mutex_held(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER)); 3400 return sqlite3_mutex_held(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_VFS1));
3328 } 3401 }
3329 #endif 3402 #endif
3330 3403
3331 /* 3404 /*
3332 ** Object used to represent a single file opened and mmapped to provide 3405 ** Object used to represent a single file opened and mmapped to provide
3333 ** shared memory. When multiple threads all reference the same 3406 ** shared memory. When multiple threads all reference the same
3334 ** log-summary, each thread has its own winFile object, but they all 3407 ** log-summary, each thread has its own winFile object, but they all
3335 ** point to a single instance of this object. In other words, each 3408 ** point to a single instance of this object. In other words, each
3336 ** log-summary is opened only once per process. 3409 ** log-summary is opened only once per process.
3337 ** 3410 **
(...skipping 22 matching lines...) Expand all
3360 int nRegion; /* Size of array apRegion */ 3433 int nRegion; /* Size of array apRegion */
3361 struct ShmRegion { 3434 struct ShmRegion {
3362 HANDLE hMap; /* File handle from CreateFileMapping */ 3435 HANDLE hMap; /* File handle from CreateFileMapping */
3363 void *pMap; 3436 void *pMap;
3364 } *aRegion; 3437 } *aRegion;
3365 DWORD lastErrno; /* The Windows errno from the last I/O error */ 3438 DWORD lastErrno; /* The Windows errno from the last I/O error */
3366 3439
3367 int nRef; /* Number of winShm objects pointing to this */ 3440 int nRef; /* Number of winShm objects pointing to this */
3368 winShm *pFirst; /* All winShm objects pointing to this */ 3441 winShm *pFirst; /* All winShm objects pointing to this */
3369 winShmNode *pNext; /* Next in list of all winShmNode objects */ 3442 winShmNode *pNext; /* Next in list of all winShmNode objects */
3370 #ifdef SQLITE_DEBUG 3443 #if defined(SQLITE_DEBUG) || defined(SQLITE_HAVE_OS_TRACE)
3371 u8 nextShmId; /* Next available winShm.id value */ 3444 u8 nextShmId; /* Next available winShm.id value */
3372 #endif 3445 #endif
3373 }; 3446 };
3374 3447
3375 /* 3448 /*
3376 ** A global array of all winShmNode objects. 3449 ** A global array of all winShmNode objects.
3377 ** 3450 **
3378 ** The winShmMutexHeld() must be true while reading or writing this list. 3451 ** The winShmMutexHeld() must be true while reading or writing this list.
3379 */ 3452 */
3380 static winShmNode *winShmNodeList = 0; 3453 static winShmNode *winShmNodeList = 0;
(...skipping 10 matching lines...) Expand all
3391 ** 3464 **
3392 ** All other fields are read/write. The winShm.pShmNode->mutex must be held 3465 ** All other fields are read/write. The winShm.pShmNode->mutex must be held
3393 ** while accessing any read/write fields. 3466 ** while accessing any read/write fields.
3394 */ 3467 */
3395 struct winShm { 3468 struct winShm {
3396 winShmNode *pShmNode; /* The underlying winShmNode object */ 3469 winShmNode *pShmNode; /* The underlying winShmNode object */
3397 winShm *pNext; /* Next winShm with the same winShmNode */ 3470 winShm *pNext; /* Next winShm with the same winShmNode */
3398 u8 hasMutex; /* True if holding the winShmNode mutex */ 3471 u8 hasMutex; /* True if holding the winShmNode mutex */
3399 u16 sharedMask; /* Mask of shared locks held */ 3472 u16 sharedMask; /* Mask of shared locks held */
3400 u16 exclMask; /* Mask of exclusive locks held */ 3473 u16 exclMask; /* Mask of exclusive locks held */
3401 #ifdef SQLITE_DEBUG 3474 #if defined(SQLITE_DEBUG) || defined(SQLITE_HAVE_OS_TRACE)
3402 u8 id; /* Id of this connection with its winShmNode */ 3475 u8 id; /* Id of this connection with its winShmNode */
3403 #endif 3476 #endif
3404 }; 3477 };
3405 3478
3406 /* 3479 /*
3407 ** Constants used for locking 3480 ** Constants used for locking
3408 */ 3481 */
3409 #define WIN_SHM_BASE ((22+SQLITE_SHM_NLOCK)*4) /* first lock byte */ 3482 #define WIN_SHM_BASE ((22+SQLITE_SHM_NLOCK)*4) /* first lock byte */
3410 #define WIN_SHM_DMS (WIN_SHM_BASE+SQLITE_SHM_NLOCK) /* deadman switch */ 3483 #define WIN_SHM_DMS (WIN_SHM_BASE+SQLITE_SHM_NLOCK) /* deadman switch */
3411 3484
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
3582 } 3655 }
3583 if( rc==SQLITE_OK ){ 3656 if( rc==SQLITE_OK ){
3584 winShmSystemLock(pShmNode, _SHM_UNLCK, WIN_SHM_DMS, 1); 3657 winShmSystemLock(pShmNode, _SHM_UNLCK, WIN_SHM_DMS, 1);
3585 rc = winShmSystemLock(pShmNode, _SHM_RDLCK, WIN_SHM_DMS, 1); 3658 rc = winShmSystemLock(pShmNode, _SHM_RDLCK, WIN_SHM_DMS, 1);
3586 } 3659 }
3587 if( rc ) goto shm_open_err; 3660 if( rc ) goto shm_open_err;
3588 } 3661 }
3589 3662
3590 /* Make the new connection a child of the winShmNode */ 3663 /* Make the new connection a child of the winShmNode */
3591 p->pShmNode = pShmNode; 3664 p->pShmNode = pShmNode;
3592 #ifdef SQLITE_DEBUG 3665 #if defined(SQLITE_DEBUG) || defined(SQLITE_HAVE_OS_TRACE)
3593 p->id = pShmNode->nextShmId++; 3666 p->id = pShmNode->nextShmId++;
3594 #endif 3667 #endif
3595 pShmNode->nRef++; 3668 pShmNode->nRef++;
3596 pDbFd->pShm = p; 3669 pDbFd->pShm = p;
3597 winShmLeaveMutex(); 3670 winShmLeaveMutex();
3598 3671
3599 /* The reference count on pShmNode has already been incremented under 3672 /* The reference count on pShmNode has already been incremented under
3600 ** the cover of the winShmEnterMutex() mutex and the pointer from the 3673 ** the cover of the winShmEnterMutex() mutex and the pointer from the
3601 ** new (struct winShm) object to the pShmNode has been set. All that is 3674 ** new (struct winShm) object to the pShmNode has been set. All that is
3602 ** left to do is to link the new object into the linked list starting 3675 ** left to do is to link the new object into the linked list starting
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
3770 /* 3843 /*
3771 ** Implement a memory barrier or memory fence on shared memory. 3844 ** Implement a memory barrier or memory fence on shared memory.
3772 ** 3845 **
3773 ** All loads and stores begun before the barrier must complete before 3846 ** All loads and stores begun before the barrier must complete before
3774 ** any load or store begun after the barrier. 3847 ** any load or store begun after the barrier.
3775 */ 3848 */
3776 static void winShmBarrier( 3849 static void winShmBarrier(
3777 sqlite3_file *fd /* Database holding the shared memory */ 3850 sqlite3_file *fd /* Database holding the shared memory */
3778 ){ 3851 ){
3779 UNUSED_PARAMETER(fd); 3852 UNUSED_PARAMETER(fd);
3780 /* MemoryBarrier(); // does not work -- do not know why not */ 3853 sqlite3MemoryBarrier(); /* compiler-defined memory barrier */
3781 winShmEnterMutex(); 3854 winShmEnterMutex(); /* Also mutex, for redundancy */
3782 winShmLeaveMutex(); 3855 winShmLeaveMutex();
3783 } 3856 }
3784 3857
3785 /* 3858 /*
3786 ** This function is called to obtain a pointer to region iRegion of the 3859 ** This function is called to obtain a pointer to region iRegion of the
3787 ** shared-memory associated with the database file fd. Shared-memory regions 3860 ** shared-memory associated with the database file fd. Shared-memory regions
3788 ** are numbered starting from zero. Each shared-memory region is szRegion 3861 ** are numbered starting from zero. Each shared-memory region is szRegion
3789 ** bytes in size. 3862 ** bytes in size.
3790 ** 3863 **
3791 ** If an error occurs, an error code is returned and *pp is set to NULL. 3864 ** If an error occurs, an error code is returned and *pp is set to NULL.
(...skipping 10 matching lines...) Expand all
3802 ** memory and SQLITE_OK returned. 3875 ** memory and SQLITE_OK returned.
3803 */ 3876 */
3804 static int winShmMap( 3877 static int winShmMap(
3805 sqlite3_file *fd, /* Handle open on database file */ 3878 sqlite3_file *fd, /* Handle open on database file */
3806 int iRegion, /* Region to retrieve */ 3879 int iRegion, /* Region to retrieve */
3807 int szRegion, /* Size of regions */ 3880 int szRegion, /* Size of regions */
3808 int isWrite, /* True to extend file if necessary */ 3881 int isWrite, /* True to extend file if necessary */
3809 void volatile **pp /* OUT: Mapped memory */ 3882 void volatile **pp /* OUT: Mapped memory */
3810 ){ 3883 ){
3811 winFile *pDbFd = (winFile*)fd; 3884 winFile *pDbFd = (winFile*)fd;
3812 winShm *p = pDbFd->pShm; 3885 winShm *pShm = pDbFd->pShm;
3813 winShmNode *pShmNode; 3886 winShmNode *pShmNode;
3814 int rc = SQLITE_OK; 3887 int rc = SQLITE_OK;
3815 3888
3816 if( !p ){ 3889 if( !pShm ){
3817 rc = winOpenSharedMemory(pDbFd); 3890 rc = winOpenSharedMemory(pDbFd);
3818 if( rc!=SQLITE_OK ) return rc; 3891 if( rc!=SQLITE_OK ) return rc;
3819 p = pDbFd->pShm; 3892 pShm = pDbFd->pShm;
3820 } 3893 }
3821 pShmNode = p->pShmNode; 3894 pShmNode = pShm->pShmNode;
3822 3895
3823 sqlite3_mutex_enter(pShmNode->mutex); 3896 sqlite3_mutex_enter(pShmNode->mutex);
3824 assert( szRegion==pShmNode->szRegion || pShmNode->nRegion==0 ); 3897 assert( szRegion==pShmNode->szRegion || pShmNode->nRegion==0 );
3825 3898
3826 if( pShmNode->nRegion<=iRegion ){ 3899 if( pShmNode->nRegion<=iRegion ){
3827 struct ShmRegion *apNew; /* New aRegion[] array */ 3900 struct ShmRegion *apNew; /* New aRegion[] array */
3828 int nByte = (iRegion+1)*szRegion; /* Minimum required file size */ 3901 int nByte = (iRegion+1)*szRegion; /* Minimum required file size */
3829 sqlite3_int64 sz; /* Current size of wal-index file */ 3902 sqlite3_int64 sz; /* Current size of wal-index file */
3830 3903
3831 pShmNode->szRegion = szRegion; 3904 pShmNode->szRegion = szRegion;
(...skipping 19 matching lines...) Expand all
3851 if( !isWrite ) goto shmpage_out; 3924 if( !isWrite ) goto shmpage_out;
3852 rc = winTruncate((sqlite3_file *)&pShmNode->hFile, nByte); 3925 rc = winTruncate((sqlite3_file *)&pShmNode->hFile, nByte);
3853 if( rc!=SQLITE_OK ){ 3926 if( rc!=SQLITE_OK ){
3854 rc = winLogError(SQLITE_IOERR_SHMSIZE, osGetLastError(), 3927 rc = winLogError(SQLITE_IOERR_SHMSIZE, osGetLastError(),
3855 "winShmMap2", pDbFd->zPath); 3928 "winShmMap2", pDbFd->zPath);
3856 goto shmpage_out; 3929 goto shmpage_out;
3857 } 3930 }
3858 } 3931 }
3859 3932
3860 /* Map the requested memory region into this processes address space. */ 3933 /* Map the requested memory region into this processes address space. */
3861 apNew = (struct ShmRegion *)sqlite3_realloc( 3934 apNew = (struct ShmRegion *)sqlite3_realloc64(
3862 pShmNode->aRegion, (iRegion+1)*sizeof(apNew[0]) 3935 pShmNode->aRegion, (iRegion+1)*sizeof(apNew[0])
3863 ); 3936 );
3864 if( !apNew ){ 3937 if( !apNew ){
3865 rc = SQLITE_IOERR_NOMEM; 3938 rc = SQLITE_IOERR_NOMEM;
3866 goto shmpage_out; 3939 goto shmpage_out;
3867 } 3940 }
3868 pShmNode->aRegion = apNew; 3941 pShmNode->aRegion = apNew;
3869 3942
3870 while( pShmNode->nRegion<=iRegion ){ 3943 while( pShmNode->nRegion<=iRegion ){
3871 HANDLE hMap = NULL; /* file-mapping handle */ 3944 HANDLE hMap = NULL; /* file-mapping handle */
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
4016 4089
4017 if( nMap==0 && pFd->mmapSize>0 ){ 4090 if( nMap==0 && pFd->mmapSize>0 ){
4018 winUnmapfile(pFd); 4091 winUnmapfile(pFd);
4019 } 4092 }
4020 if( nMap!=pFd->mmapSize ){ 4093 if( nMap!=pFd->mmapSize ){
4021 void *pNew = 0; 4094 void *pNew = 0;
4022 DWORD protect = PAGE_READONLY; 4095 DWORD protect = PAGE_READONLY;
4023 DWORD flags = FILE_MAP_READ; 4096 DWORD flags = FILE_MAP_READ;
4024 4097
4025 winUnmapfile(pFd); 4098 winUnmapfile(pFd);
4026 #if !SQLITE_MMAP_READ_ONLY 4099 #ifdef SQLITE_MMAP_READWRITE
4027 if( (pFd->ctrlFlags & WINFILE_RDONLY)==0 ){ 4100 if( (pFd->ctrlFlags & WINFILE_RDONLY)==0 ){
4028 protect = PAGE_READWRITE; 4101 protect = PAGE_READWRITE;
4029 flags |= FILE_MAP_WRITE; 4102 flags |= FILE_MAP_WRITE;
4030 } 4103 }
4031 #endif 4104 #endif
4032 #if SQLITE_OS_WINRT 4105 #if SQLITE_OS_WINRT
4033 pFd->hMap = osCreateFileMappingFromApp(pFd->h, NULL, protect, nMap, NULL); 4106 pFd->hMap = osCreateFileMappingFromApp(pFd->h, NULL, protect, nMap, NULL);
4034 #elif defined(SQLITE_WIN32_HAS_WIDE) 4107 #elif defined(SQLITE_WIN32_HAS_WIDE)
4035 pFd->hMap = osCreateFileMappingW(pFd->h, NULL, protect, 4108 pFd->hMap = osCreateFileMappingW(pFd->h, NULL, protect,
4036 (DWORD)((nMap>>32) & 0xffffffff), 4109 (DWORD)((nMap>>32) & 0xffffffff),
(...skipping 688 matching lines...) Expand 10 before | Expand all | Expand 10 after
4725 dwDesiredAccess, 4798 dwDesiredAccess,
4726 dwShareMode, NULL, 4799 dwShareMode, NULL,
4727 dwCreationDisposition, 4800 dwCreationDisposition,
4728 dwFlagsAndAttributes, 4801 dwFlagsAndAttributes,
4729 NULL))==INVALID_HANDLE_VALUE && 4802 NULL))==INVALID_HANDLE_VALUE &&
4730 winRetryIoerr(&cnt, &lastErrno) ){ 4803 winRetryIoerr(&cnt, &lastErrno) ){
4731 /* Noop */ 4804 /* Noop */
4732 } 4805 }
4733 } 4806 }
4734 #endif 4807 #endif
4735 winLogIoerr(cnt); 4808 winLogIoerr(cnt, __LINE__);
4736 4809
4737 OSTRACE(("OPEN file=%p, name=%s, access=%lx, rc=%s\n", h, zUtf8Name, 4810 OSTRACE(("OPEN file=%p, name=%s, access=%lx, rc=%s\n", h, zUtf8Name,
4738 dwDesiredAccess, (h==INVALID_HANDLE_VALUE) ? "failed" : "ok")); 4811 dwDesiredAccess, (h==INVALID_HANDLE_VALUE) ? "failed" : "ok"));
4739 4812
4740 if( h==INVALID_HANDLE_VALUE ){ 4813 if( h==INVALID_HANDLE_VALUE ){
4741 pFile->lastErrno = lastErrno; 4814 pFile->lastErrno = lastErrno;
4742 winLogError(SQLITE_CANTOPEN, pFile->lastErrno, "winOpen", zUtf8Name); 4815 winLogError(SQLITE_CANTOPEN, pFile->lastErrno, "winOpen", zUtf8Name);
4743 sqlite3_free(zConverted); 4816 sqlite3_free(zConverted);
4744 sqlite3_free(zTmpname); 4817 sqlite3_free(zTmpname);
4745 if( isReadWrite && !isExclusive ){ 4818 if( isReadWrite && !isExclusive ){
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
4909 if ( !winRetryIoerr(&cnt, &lastErrno) ){ 4982 if ( !winRetryIoerr(&cnt, &lastErrno) ){
4910 rc = SQLITE_ERROR; /* No more retries. */ 4983 rc = SQLITE_ERROR; /* No more retries. */
4911 break; 4984 break;
4912 } 4985 }
4913 } while(1); 4986 } while(1);
4914 } 4987 }
4915 #endif 4988 #endif
4916 if( rc && rc!=SQLITE_IOERR_DELETE_NOENT ){ 4989 if( rc && rc!=SQLITE_IOERR_DELETE_NOENT ){
4917 rc = winLogError(SQLITE_IOERR_DELETE, lastErrno, "winDelete", zFilename); 4990 rc = winLogError(SQLITE_IOERR_DELETE, lastErrno, "winDelete", zFilename);
4918 }else{ 4991 }else{
4919 winLogIoerr(cnt); 4992 winLogIoerr(cnt, __LINE__);
4920 } 4993 }
4921 sqlite3_free(zConverted); 4994 sqlite3_free(zConverted);
4922 OSTRACE(("DELETE name=%s, rc=%s\n", zFilename, sqlite3ErrName(rc))); 4995 OSTRACE(("DELETE name=%s, rc=%s\n", zFilename, sqlite3ErrName(rc)));
4923 return rc; 4996 return rc;
4924 } 4997 }
4925 4998
4926 /* 4999 /*
4927 ** Check the existence and status of a file. 5000 ** Check the existence and status of a file.
4928 */ 5001 */
4929 static int winAccess( 5002 static int winAccess(
(...skipping 29 matching lines...) Expand all
4959 ** as if it does not exist. 5032 ** as if it does not exist.
4960 */ 5033 */
4961 if( flags==SQLITE_ACCESS_EXISTS 5034 if( flags==SQLITE_ACCESS_EXISTS
4962 && sAttrData.nFileSizeHigh==0 5035 && sAttrData.nFileSizeHigh==0
4963 && sAttrData.nFileSizeLow==0 ){ 5036 && sAttrData.nFileSizeLow==0 ){
4964 attr = INVALID_FILE_ATTRIBUTES; 5037 attr = INVALID_FILE_ATTRIBUTES;
4965 }else{ 5038 }else{
4966 attr = sAttrData.dwFileAttributes; 5039 attr = sAttrData.dwFileAttributes;
4967 } 5040 }
4968 }else{ 5041 }else{
4969 winLogIoerr(cnt); 5042 winLogIoerr(cnt, __LINE__);
4970 if( lastErrno!=ERROR_FILE_NOT_FOUND && lastErrno!=ERROR_PATH_NOT_FOUND ){ 5043 if( lastErrno!=ERROR_FILE_NOT_FOUND && lastErrno!=ERROR_PATH_NOT_FOUND ){
4971 sqlite3_free(zConverted); 5044 sqlite3_free(zConverted);
4972 return winLogError(SQLITE_IOERR_ACCESS, lastErrno, "winAccess", 5045 return winLogError(SQLITE_IOERR_ACCESS, lastErrno, "winAccess",
4973 zFilename); 5046 zFilename);
4974 }else{ 5047 }else{
4975 attr = INVALID_FILE_ATTRIBUTES; 5048 attr = INVALID_FILE_ATTRIBUTES;
4976 } 5049 }
4977 } 5050 }
4978 } 5051 }
4979 #ifdef SQLITE_WIN32_HAS_ANSI 5052 #ifdef SQLITE_WIN32_HAS_ANSI
(...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after
5300 #define winDlClose 0 5373 #define winDlClose 0
5301 #endif 5374 #endif
5302 5375
5303 5376
5304 /* 5377 /*
5305 ** Write up to nBuf bytes of randomness into zBuf. 5378 ** Write up to nBuf bytes of randomness into zBuf.
5306 */ 5379 */
5307 static int winRandomness(sqlite3_vfs *pVfs, int nBuf, char *zBuf){ 5380 static int winRandomness(sqlite3_vfs *pVfs, int nBuf, char *zBuf){
5308 int n = 0; 5381 int n = 0;
5309 UNUSED_PARAMETER(pVfs); 5382 UNUSED_PARAMETER(pVfs);
5310 #if defined(SQLITE_TEST) 5383 #if defined(SQLITE_TEST) || defined(SQLITE_OMIT_RANDOMNESS)
5311 n = nBuf; 5384 n = nBuf;
5312 memset(zBuf, 0, nBuf); 5385 memset(zBuf, 0, nBuf);
5313 #else 5386 #else
5314 if( sizeof(SYSTEMTIME)<=nBuf-n ){ 5387 if( sizeof(SYSTEMTIME)<=nBuf-n ){
5315 SYSTEMTIME x; 5388 SYSTEMTIME x;
5316 osGetSystemTime(&x); 5389 osGetSystemTime(&x);
5317 memcpy(&zBuf[n], &x, sizeof(x)); 5390 memcpy(&zBuf[n], &x, sizeof(x));
5318 n += sizeof(x); 5391 n += sizeof(x);
5319 } 5392 }
5320 if( sizeof(DWORD)<=nBuf-n ){ 5393 if( sizeof(DWORD)<=nBuf-n ){
(...skipping 13 matching lines...) Expand all
5334 memcpy(&zBuf[n], &cnt, sizeof(cnt)); 5407 memcpy(&zBuf[n], &cnt, sizeof(cnt));
5335 n += sizeof(cnt); 5408 n += sizeof(cnt);
5336 } 5409 }
5337 #endif 5410 #endif
5338 if( sizeof(LARGE_INTEGER)<=nBuf-n ){ 5411 if( sizeof(LARGE_INTEGER)<=nBuf-n ){
5339 LARGE_INTEGER i; 5412 LARGE_INTEGER i;
5340 osQueryPerformanceCounter(&i); 5413 osQueryPerformanceCounter(&i);
5341 memcpy(&zBuf[n], &i, sizeof(i)); 5414 memcpy(&zBuf[n], &i, sizeof(i));
5342 n += sizeof(i); 5415 n += sizeof(i);
5343 } 5416 }
5417 #if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && SQLITE_WIN32_USE_UUID
5418 if( sizeof(UUID)<=nBuf-n ){
5419 UUID id;
5420 memset(&id, 0, sizeof(UUID));
5421 osUuidCreate(&id);
5422 memcpy(&zBuf[n], &id, sizeof(UUID));
5423 n += sizeof(UUID);
5424 }
5425 if( sizeof(UUID)<=nBuf-n ){
5426 UUID id;
5427 memset(&id, 0, sizeof(UUID));
5428 osUuidCreateSequential(&id);
5429 memcpy(&zBuf[n], &id, sizeof(UUID));
5430 n += sizeof(UUID);
5431 }
5344 #endif 5432 #endif
5433 #endif /* defined(SQLITE_TEST) || defined(SQLITE_ZERO_PRNG_SEED) */
5345 return n; 5434 return n;
5346 } 5435 }
5347 5436
5348 5437
5349 /* 5438 /*
5350 ** Sleep for a little while. Return the amount of time slept. 5439 ** Sleep for a little while. Return the amount of time slept.
5351 */ 5440 */
5352 static int winSleep(sqlite3_vfs *pVfs, int microsec){ 5441 static int winSleep(sqlite3_vfs *pVfs, int microsec){
5353 sqlite3_win32_sleep((microsec+999)/1000); 5442 sqlite3_win32_sleep((microsec+999)/1000);
5354 UNUSED_PARAMETER(pVfs); 5443 UNUSED_PARAMETER(pVfs);
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
5512 winGetLastError, /* xGetLastError */ 5601 winGetLastError, /* xGetLastError */
5513 winCurrentTimeInt64, /* xCurrentTimeInt64 */ 5602 winCurrentTimeInt64, /* xCurrentTimeInt64 */
5514 winSetSystemCall, /* xSetSystemCall */ 5603 winSetSystemCall, /* xSetSystemCall */
5515 winGetSystemCall, /* xGetSystemCall */ 5604 winGetSystemCall, /* xGetSystemCall */
5516 winNextSystemCall, /* xNextSystemCall */ 5605 winNextSystemCall, /* xNextSystemCall */
5517 }; 5606 };
5518 #endif 5607 #endif
5519 5608
5520 /* Double-check that the aSyscall[] array has been constructed 5609 /* Double-check that the aSyscall[] array has been constructed
5521 ** correctly. See ticket [bb3a86e890c8e96ab] */ 5610 ** correctly. See ticket [bb3a86e890c8e96ab] */
5522 assert( ArraySize(aSyscall)==77 ); 5611 assert( ArraySize(aSyscall)==80 );
5523 5612
5524 /* get memory map allocation granularity */ 5613 /* get memory map allocation granularity */
5525 memset(&winSysInfo, 0, sizeof(SYSTEM_INFO)); 5614 memset(&winSysInfo, 0, sizeof(SYSTEM_INFO));
5526 #if SQLITE_OS_WINRT 5615 #if SQLITE_OS_WINRT
5527 osGetNativeSystemInfo(&winSysInfo); 5616 osGetNativeSystemInfo(&winSysInfo);
5528 #else 5617 #else
5529 osGetSystemInfo(&winSysInfo); 5618 osGetSystemInfo(&winSysInfo);
5530 #endif 5619 #endif
5531 assert( winSysInfo.dwAllocationGranularity>0 ); 5620 assert( winSysInfo.dwAllocationGranularity>0 );
5532 assert( winSysInfo.dwPageSize>0 ); 5621 assert( winSysInfo.dwPageSize>0 );
(...skipping 10 matching lines...) Expand all
5543 int sqlite3_os_end(void){ 5632 int sqlite3_os_end(void){
5544 #if SQLITE_OS_WINRT 5633 #if SQLITE_OS_WINRT
5545 if( sleepObj!=NULL ){ 5634 if( sleepObj!=NULL ){
5546 osCloseHandle(sleepObj); 5635 osCloseHandle(sleepObj);
5547 sleepObj = NULL; 5636 sleepObj = NULL;
5548 } 5637 }
5549 #endif 5638 #endif
5550 return SQLITE_OK; 5639 return SQLITE_OK;
5551 } 5640 }
5552 5641
5553 CHROMIUM_SQLITE_API
5554 void chromium_sqlite3_initialize_win_sqlite3_file(sqlite3_file* file, HANDLE han dle) {
5555 winFile* winSQLite3File = (winFile*)file;
5556 memset(file, 0, sizeof(*file));
5557 winSQLite3File->pMethod = &winIoMethod;
5558 winSQLite3File->h = handle;
5559 }
5560
5561 #endif /* SQLITE_OS_WIN */ 5642 #endif /* SQLITE_OS_WIN */
OLDNEW
« no previous file with comments | « third_party/sqlite/sqlite-src-3100200/src/os_win.h ('k') | third_party/sqlite/sqlite-src-3100200/src/pager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698