-C fix\sfor\slocking\sin\sWindows\s(CVS\s760)
-D 2002-10-17T00:38:54
+C Minor\scoding\sfix\sin\sgetting\sthe\swindows\splatform\sversion,\swhen\smultithreading\s(CVS\s761)
+D 2002-10-17T09:01:32
F Makefile.in d6c9a85c2a5e696843201d090dcf8bf2f8716f2a
F Makefile.linux-gcc b86a99c493a5bfb402d1d9178dcdc4bd4b32f906
F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd
F src/insert.c 764300a0bd8074a2174946c0bf8a550bd833397a
F src/main.c ff7c05ef88fa1374e5540ce20173ae8e1836f8a4
F src/md5.c fe4f9c9c6f71dfc26af8da63e4d04489b1430565
-F src/os.c 2c26f354c4bbe94ba4d6e1f04289c63bc1fdb87c
+F src/os.c c045297aae5a99710222baf939985498c5bb76d4
F src/os.h 3009379b06941e7796a9812d1b6cbc59b26248c8
F src/pager.c 592e5931fdc65e952a6c3e152bc822580856532a
F src/pager.h 6991c9c2dc5e4c7f2df4d4ba47d1c6458f763a32
F www/sqlite.tcl ae3dcfb077e53833b59d4fcc94d8a12c50a44098
F www/tclsqlite.tcl 1db15abeb446aad0caf0b95b8b9579720e4ea331
F www/vdbe.tcl 2013852c27a02a091d39a766bc87cff329f21218
-P d87a886d8f63f54466848151e2b0e8565b338593
-R bf058781dafbb0c6ad71e236c2683985
+P 83add34f64895a4b465881213eba82f3b1f5c964
+R b18c7ccdbae2c5e8036c38df73751405
U mike
-Z 02abffa2bb18c0118ab5f6d1ca430ce7
+Z c44f29d11b8dd47ea375422490d2c34d
** cnt>0 means there are cnt shared locks on the file.
**
** Any attempt to lock or unlock a file first checks the locking
-** structure. The fcntl() system call is only invoked to set a
+** structure. The fcntl() system call is only invoked to set a
** POSIX lock if the internal lock structure transitions between
** a locked and an unlocked state.
*/
/*
** An instance of the following structure serves as the key used
-** to locate a particular lockInfo structure given its inode.
+** to locate a particular lockInfo structure given its inode.
*/
struct inodeKey {
dev_t dev; /* Device number */
int nRef; /* Number of pointers to this structure */
};
-/*
+/*
** This hash table maps inodes (in the form of inodeKey structures) into
** pointers to lockInfo structures.
*/
if( id->fd<0 ){
id->fd = open(zFilename, O_RDONLY);
if( id->fd<0 ){
- return SQLITE_CANTOPEN;
+ return SQLITE_CANTOPEN;
}
*pReadonly = 1;
}else{
HANDLE h;
int fileflags;
if( delFlag ){
- fileflags = FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_RANDOM_ACCESS
+ fileflags = FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_RANDOM_ACCESS
| FILE_FLAG_DELETE_ON_CLOSE;
}else{
fileflags = FILE_FLAG_RANDOM_ACCESS;
if( !sqliteOsFileExists(zBuf) ) break;
}
#endif
- return SQLITE_OK;
+ return SQLITE_OK;
}
/*
// get the platform id to decide how to calculate the lock offset
int mkPlatformId(void){
-
+
static long init=0;
+ static long lock=0;
+
static int pid=VER_PLATFORM_WIN32_WINDOWS;
- OSVERSIONINFOA info;
-
- if (!init) {
- if (InterlockedIncrement(&init)==1)
+ OSVERSIONINFOA info;
+
+ while (!init) {
+ if (InterlockedIncrement(&lock)==1)
{
info.dwOSVersionInfoSize=sizeof(info);
- if (GetVersionEx(&info)) pid=info.dwPlatformId;
+ if (GetVersionEx(&info)) pid=info.dwPlatformId;
+ init=1;
}
- }
- return pid;
+ else
+ Sleep(1);
+ }
+ return pid;
}
// locks and unlocks beyond eof. uses platformid to move the lock as far as possible.
//obtain the sync lock on a handle
-void synclock(HANDLE h){
+void synclock(HANDLE h){
while (!mklock(h,0,1)) Sleep(1);
}
-void syncunlock(HANDLE h){
+void syncunlock(HANDLE h){
mkunlock(h,0,1);
}
}else{
int lk = (sqliteRandomInteger() & 0x7ffffff)%MX_LOCKBYTE + 1;
int res;
-
+
synclock(id->h);
if (id->locked<0) mkunlock(id->h,1,MX_LOCKBYTE); // release write lock if we have it
res=mklock(id->h,lk,1);
syncunlock(id->h);
-
+
if( res ){
id->locked = lk;
rc = SQLITE_OK;
rc = SQLITE_OK;
}else{
int res;
-
+
synclock(id->h);
if (id->locked>0) mkunlock(id->h,id->locked,1); // release read lock
res=mklock(id->h,1,MX_LOCKBYTE);
syncunlock(id->h);
-
+
if(res){
id->locked = -1;
rc = SQLITE_OK;