- C Make\sSQLITE_MFS_NSHARD\sa\scompile\stime\ssetting.
- D 2018-12-10T16:52:31.796
-C Change\sthe\sway\sa\scomparison\sused\sto\sdetect\scorrupt\sdatabases\sin\sfts3\sis\sdone\nto\savoid\spotential\spointer\soverflow\sin\s32-bit\sbuilds.
-D 2018-12-24T13:34:36.984
++C Merge\slatest\strunk\swith\sthis\sbranch.
++D 2018-12-24T15:15:21.032
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
- F Makefile.in 68d0ba0f0b533d5bc84c78c13a6ce84ee81183a67014caa47a969e67f028fa1c
+ F Makefile.in d8b254f8bb81bab43c340d70d17dc3babab40fcc8a348c8255881f780a45fee6
F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
- F Makefile.msc b7d4a710fa3f0b8cfc532ff195b85dc1ba2a8ad34343cb3d67639f28f0a24306
+ F Makefile.msc 3c4c7e94419ff28cb68850188c9d153b343aed4c5ebed5965426232ed67ff9d9
F README.md 377233394b905d3b2e2b33741289e093bc93f2e7adbe00923b2c5958c9a9edee
F VERSION 453e2f4529ca208196d5567db28d549d7151f79efd33f6e6cfe6e613e583a0be
F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50
F src/os.h 48388821692e87da174ea198bf96b1b2d9d83be5dfc908f673ee21fafbe0d432
F src/os_common.h b2f4707a603e36811d9b1a13278bffd757857b85
F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586
- F src/os_unix.c e191348d66fcbcf137cb2497de2c1e2ccca3caac0515a42c1a1d38043f519e9e
-F src/os_unix.c f6e91b8fd82af7afbfd073c4974ad6cdb8e62d9f65ceddb45167835a0567fdc0
++F src/os_unix.c 3de3133f268e98596a0b4ae81734539f0b01dd5e1a399834eb52bc4c9dcc66ae
F src/os_win.c 85d9e532d0444ab6c16d7431490c2e279e282aa0917b0e988996b1ae0de5c5a0
F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a
F src/pager.c 75e0f3cfa3962c714f519f8a3d1e67ecca1c91de0e010a036b988e40ce9e4c73
F src/test_tclsh.c 06317648b0d85a85fd823f7973b55535c59a3156c1ef59394fe511f932cfa78d
F src/test_tclvar.c 33ff42149494a39c5fbb0df3d25d6fafb2f668888e41c0688d07273dcb268dfc
F src/test_thread.c 911d15fb14e19c0c542bdc8aabf981c2f10a4858
- F src/test_vfs.c 194b8e78e9b4279bc69693cb5cfc343e0a08482c430a571ec96d80440e337a44
-F src/test_vfs.c 4e31a7b98a401431c55590a0ac05f001f520f716d0707ec916b4022b8937fd06
++F src/test_vfs.c 9a53b40290db75833db58295485b955276daed99a2e57d7215719e175c0cfae0
F src/test_vfstrace.c bab9594adc976cbe696ff3970728830b4c5ed698
F src/test_windirent.c a895e2c068a06644eef91a7f0a32182445a893b9a0f33d0cdb4283dca2486ac1
F src/test_windirent.h 90dfbe95442c9762357fe128dc7ae3dc199d006de93eb33ba3972e0a90484215
F test/pcache.test c8acbedd3b6fd0f9a7ca887a83b11d24a007972b
F test/pcache2.test af7f3deb1a819f77a6d0d81534e97d1cf62cd442
F test/percentile.test 4243af26b8f3f4555abe166f723715a1f74c77ff
- F test/permutations.test c2e5f618a71d1a7e50216325dd056f6ec16439b3c98d87bcd2df381297e5dc97
-F test/permutations.test 1f244543fbf05f3ef9a4596d7e7fe5d832b6d973c53a87189515e3c15db562a5
++F test/permutations.test 49b876f77f09f41cbd3b356935e946c26cbdd259b7dc9f4411529e75f966f277
F test/pg_common.tcl 301ac19c1a52fd55166d26db929b3b89165c634d52b5f8ad76ea8cb06960db30
F test/pragma.test c267bf02742c823a191960895b3d52933cebd7beee26757d1ed694f213fcd867
F test/pragma2.test e5d5c176360c321344249354c0c16aec46214c9f
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
- P d2c785f94cc6b704ce29147399e2c473fd0f4ff377f1379bd29178bf6d127c1a
- R 405c2e0a847d1dc9742f041e349c6a79
-P 2b6494b1509f0d0189f98aa34c990eee99c775ff57826e79b2c5b0a12b4c97ad
-R a02ab00644ca16cf9661dd1e6ee9ef5e
++P b9a741519055a8560ec1d0ab7d0c15ff8db53e740011825506cd2ede11c956f0 95a9a39ff784b960b62dd6298e722a620ba3f9c8b76839a49bbef35d7bc84a8e
++R 5ea7d8dcd45bcaea5cd65eff0166a924
U dan
- Z 0d67b443d35d0a267898c50a3a55aea3
-Z a6822b20c230c488499f3dd180c02a24
++Z 2093b49ffe85aadf6485d43886cf919f
return rc;
}
- unixShm *pX; /* For looping over all siblings */
+#ifdef SQLITE_MUTEXFREE_SHMLOCK
+static int unixMutexFreeShmlock(
+ unixFile *pFd, /* Database file holding the shared memory */
+ int ofst, /* First lock to acquire or release */
+ int n, /* Number of locks to acquire or release */
+ int flags /* What to do with the lock */
+){
+ struct LockMapEntry {
+ int iFirst;
+ int nSlot;
+ } aMap[9] = {
+ { 0, 1 },
+ { 1, 1 },
+ { 2, 1 },
+ { 3+0*SQLITE_MFS_NSHARD, SQLITE_MFS_NSHARD },
+ { 3+1*SQLITE_MFS_NSHARD, SQLITE_MFS_NSHARD },
+ { 3+2*SQLITE_MFS_NSHARD, SQLITE_MFS_NSHARD },
+ { 3+3*SQLITE_MFS_NSHARD, SQLITE_MFS_NSHARD },
+ { 3+4*SQLITE_MFS_NSHARD, SQLITE_MFS_NSHARD },
+ { 3+5*SQLITE_MFS_NSHARD, 0 },
+ };
+
+ unixShm *p = pFd->pShm; /* The shared memory being locked */
- int rc = SQLITE_OK;
- int iIncr;
- u16 mask; /* Mask of locks to take or release */
+ unixShmNode *pShmNode = p->pShmNode; /* The underlying file iNode */
+
+ if( flags & SQLITE_SHM_SHARED ){
+ /* SHARED locks */
+ u32 iOld, iNew, *ptr;
+ int iIncr = -1;
+ if( (flags & SQLITE_SHM_UNLOCK)==0 ){
+ p->aMFCurrent[ofst] = (p->aMFCurrent[ofst] + 1) % aMap[ofst].nSlot;
+ iIncr = 1;
+ }
+ ptr = &pShmNode->aMFSlot[aMap[ofst].iFirst + p->aMFCurrent[ofst]].nLock;
+ do {
+ iOld = *ptr;
+ iNew = iOld + iIncr;
+ if( iNew>SQLITE_MFS_EXCLUSIVE ){
+ return SQLITE_BUSY;
+ }
+ }while( 0==unixCompareAndSwap(ptr, iOld, iNew) );
+ }else{
+ /* EXCLUSIVE locks */
+ int iFirst = aMap[ofst].iFirst;
+ int iLast = aMap[ofst+n].iFirst;
+ int i;
+ for(i=iFirst; i<iLast; i++){
+ u32 *ptr = &pShmNode->aMFSlot[i].nLock;
+ if( flags & SQLITE_SHM_UNLOCK ){
+ assert( (*ptr)==SQLITE_MFS_EXCLUSIVE );
+ *ptr = 0;
+ }else{
+ u32 iOld;
+ do {
+ iOld = *ptr;
+ if( iOld>0 ){
+ while( i>iFirst ){
+ i--;
+ pShmNode->aMFSlot[i].nLock = 0;
+ }
+ return SQLITE_BUSY;
+ }
+ }while( 0==unixCompareAndSwap(ptr, iOld, SQLITE_MFS_EXCLUSIVE) );
+ }
+ }
+ }
+
+ return SQLITE_OK;
+}
+#else
+# define unixMutexFreeShmlock(a,b,c,d) SQLITE_OK
+#endif
+
/*
** Change the lock state for a shared-memory segment.
**