]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Merge changes from begin-concurrent-wal2. Also modify the unix-excl shm-locks
authordan <dan@noemail.net>
Wed, 2 Jan 2019 19:46:46 +0000 (19:46 +0000)
committerdan <dan@noemail.net>
Wed, 2 Jan 2019 19:46:46 +0000 (19:46 +0000)
on this branch so that it is not an error to attempt to release an EXCLUSIVE
lock that is not held.

FossilOrigin-Name: 86685679b4cff94704fe4b52364f25f579d98ee725407cfe3bd2bbf7ecd651a8

12 files changed:
1  2 
manifest
manifest.uuid
src/os_unix.c
src/select.c
src/sqliteInt.h
src/update.c
src/wal.c
src/wal.h
test/concurrent2.test
test/permutations.test
test/wal2savepoint.test
test/walrofault.test

diff --cc manifest
index 9934b66edf86f7c435e1b97ce394cc857835acee,905acc096acdd84044144100903cb2ac6f5f3594..5ca7d514a7d9e65fd4ad13f521420c89bed5638e
+++ b/manifest
@@@ -1,5 -1,5 +1,5 @@@
- C Add\sthe\s"mutexfree-shmlock"\spatch\sto\sthis\sbranch.
- D 2018-12-18T19:46:50.625
 -C Reinstate\sassert()\sstatements\sin\sos_unix.c\sthat\swere\sremoved\sto\sallow\nwal-mode\sSHARED\slocks\sto\sbe\staken\sover\smore\sthan\sone\slocking\sslot\n(this\sbranch\sno\slonger\sdoes\sthat,\sso\sthe\sassert()\sstatements\scan\sgo\nback\sin).
 -D 2019-01-02T17:08:06.138
++C Merge\schanges\sfrom\sbegin-concurrent-wal2.\sAlso\smodify\sthe\sunix-excl\sshm-locks\non\sthis\sbranch\sso\sthat\sit\sis\snot\san\serror\sto\sattempt\sto\srelease\san\sEXCLUSIVE\nlock\sthat\sis\snot\sheld.
++D 2019-01-02T19:46:46.309
  F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
  F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
  F Makefile.in d8b254f8bb81bab43c340d70d17dc3babab40fcc8a348c8255881f780a45fee6
@@@ -463,20 -466,20 +466,20 @@@ F src/ctime.c 109e58d00f62e8e71ee1eb594
  F src/date.c ebe1dc7c8a347117bb02570f1a931c62dd78f4a2b1b516f4837d45b7d6426957
  F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7
  F src/dbstat.c 3c8bd4e77f0244fd2bd7cc90acf116ad2f8e82d70e536637f35ac2bc99b726f9
- F src/delete.c f7938125847e8ef485448db5fbad29acb2991381a02887dd854c1617315ab9fb
- F src/expr.c b84c41530d97e28d5c43149d23d4492e26cd4e1e93abba1302d361e71a04b614
+ F src/delete.c 209cd8345b15d1843abeff2d91a6d9c765cf32ff4abcb24411c38fe08e18baab
+ F src/expr.c 18ce84bab19ef59eff99a54d83ebefd28dc10d17e617f35c730ff7c8bc2b6ee7
  F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
- F src/fkey.c 972a4ba14296bef2303a0abbad1e3d82bc3c61f9e6ce4e8e9528bdee68748812
+ F src/fkey.c aaf28be73ab21e1e8bf4ac6b94269ebc8c93238d1e6997cb44b527b622e8ae6f
 -F src/func.c 7c288b4ce309b5a8b8473514b88e1f8e69a80134509a8c0db8e39c858e367e7f
 +F src/func.c 8efa2c813b3f6a831a070311b5bcbc97993b79cbcd274bdb49bde56ccd3d37bc
  F src/global.c 8291eee0782b83124de14ec0389ec9fd6ae1873358a6b0d9469fe17a46ad803b
  F src/hash.c a12580e143f10301ed5166ea4964ae2853d3905a511d4e0c44497245c7ce1f7a
  F src/hash.h ab34c5c54a9e9de2e790b24349ba5aab3dbb4fd4
  F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da
  F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71
- F src/insert.c f12f27eb606d601825be9a229a7390a8d64d40226697883f96de8e088d620055
+ F src/insert.c 1e0001758cd174177886cdfe23d69c6d6775f1c4e7fe946a041f1ef56ae85bc5
  F src/legacy.c 134ab3e3fae00a0f67a5187981d6935b24b337bcf0f4b3e5c9fa5763da95bf4e
  F src/loadext.c e6f10875d52aca3b7e57ce1ec174aeafc9b6c00b43000cd30d791f9cb490b7a6
 -F src/main.c c96ec2fffaf1c3963b31be1d378defd205228fa628522f49a6dd48d99d901851
 +F src/main.c 65f0e265a9f4f3b975f731247d035e15c4f805748d12c8a9ddd7a2d8d73a4789
  F src/malloc.c 07295435093ce354c6d9063ac05a2eeae28bd251d2e63c48b3d67c12c76f7e18
  F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
  F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de
@@@ -496,28 -499,28 +499,28 @@@ F src/os.c 8aeb0b0f40f8f5b0da03fe497066
  F src/os.h 48388821692e87da174ea198bf96b1b2d9d83be5dfc908f673ee21fafbe0d432
  F src/os_common.h b2f4707a603e36811d9b1a13278bffd757857b85
  F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586
- F src/os_unix.c 9886c03162c253d0845c40baef0f105bc540d53efc8378c2ef1598406c26d9be
 -F src/os_unix.c 86eca42c3d955bebea0082450f978e5633448235f03f86b27a02538bb26e7fff
++F src/os_unix.c 45f00fb32a5d8ab1a3fe4eaaad800b6e4171fb5c83a0a19587d7dfea479561bd
  F src/os_win.c 85d9e532d0444ab6c16d7431490c2e279e282aa0917b0e988996b1ae0de5c5a0
  F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a
- F src/pager.c bd11bf6971789994b4c1972019f16caf6e5ed5a59165d65f0147535aab191703
+ F src/pager.c 24dbb25d447629bc8167dcf16dcb449a6eb2067393935d97ff42377798e44979
  F src/pager.h d8cf37b3415c742d1f267ae2e0e6495826a72d403cbdbefdab2e2f5ff2a1dde7
  F src/parse.y 8206217fe7fa96652aa1b8a797246e23b30a9d4c1a5175d9c12b13750f51dc2f
  F src/pcache.c 696a01f1a6370c1b50a09c15972bc3bee3333f8fcd1f2da8e9a76b1b062c59ee
  F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586
  F src/pcache1.c ddc9fc7d9861cf3a1f30660264b76b1ae9e1dce5dbba085cf001d5cb6b41cf8c
- F src/pragma.c 3b23e9eb390888a4d2c71c86be6c710c34179657f4f039fae019ba660be00ca9
+ F src/pragma.c c1bfbee754da581ab1f1c299d0522ed1e52e265f1100cad14be546e6d055e3cd
 -F src/pragma.h fdd03d78a7497f74a3f652909f945328480089189526841ae829ce7313d98d13
 +F src/pragma.h 7003ea8e45e5da0a7cd6d35846214f9ae9ecf5be66b268415ceea5855324af11
- F src/prepare.c 0e8fc0deaf36da104e08d07ce7d97bc09ab57d078b399381532fec3fa1d3f2bb
+ F src/prepare.c d0918fb8d00b1ebf19655e7f3d28464b3fc3c43c16d36dd06092de02244a5180
  F src/printf.c 0f1177cf1dd4d7827bf64d840768514ec76409abecaca9e8b577dbd065150381
 -F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384
 +F src/random.c f27af4099afaea7284ade5c206224dcfdb2334cfd119d018b470d46356b3f27d
- F src/resolve.c 72fe8cae7326b979e7258ab4c531956951e1a5f3fe8644c646abaec1b2eb6d95
+ F src/resolve.c 5f2f987aacba7548d10781f808e1b933f80abe0b6bc8e9922bc18b1d1faba339
  F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93
- F src/select.c ca760497a7a0263b29ca4001760eac53de7c05b0b9edb12adeae1a1c44466779
 -F src/select.c 4b0be1bfd2d8668e2711f877682361e06b412c53ce7a56303f1f6978ec33eca8
++F src/select.c 49f7cf2521c44db8918fd052ee551b6cd2a98580fc538e9c056eaa924a6ade35
  F src/shell.c.in 207da30342db0b6fac8b2487abd60b059a5ea80cc9494bd1db76a1dd4aae7cca
- F src/sqlite.h.in 846968c2880c2223e0d65c544698fedcf45bbddc52693a9b020519725690e1fd
+ F src/sqlite.h.in a8ac449be3b5f7edeaf9066bec560323a61fcd032f199f7f462444afda119151
  F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
  F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683
- F src/sqliteInt.h 05dd8ce0e386ced2138087b618de585061c0da4475dfe14f578fbe254e1efd4b
 -F src/sqliteInt.h 3e0bcdea1623f50a6e886c1bbb6b37b9c4b132df6e4e6990479270423c259aa0
++F src/sqliteInt.h 066ad0db3ad85d9042657ca56e63f87b7d022d39bfd744501ec963cd6a5f692c
  F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b
  F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e
  F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34
@@@ -576,9 -579,9 +579,9 @@@ F src/test_window.c cdae419fdcea5bad6dc
  F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9
  F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c
  F src/tokenize.c c8af4feebd8bf5a4d60a14018d91f61013f658ec864dfce7661bae73d86b3191
- F src/treeview.c 7b12ac059de54c939b6eb0dbffc9410c29c80d2470cee5cbe07d5ff9ea2d9253
- F src/trigger.c d3d78568f37fb2e6cdcc2d1e7b60156f15b0b600adec55b83c5d42f6cad250bd
- F src/update.c 31d5208f7c8b129a355ce797bdd2fd70511d18ca6883c77aa816eb4fe486b687
+ F src/treeview.c c6ff90da4cc1813ff2d9bb11f17d4d927db62c47e552faa1835edc47269d753d
+ F src/trigger.c 77546bf525854aa4dc09f3a0450fa801c3e99d5f13a3eb2efd07bfe521e3b5d6
 -F src/update.c 4e630e47852e206d0b29ec63ea0402e0b7ba328a1c19dd645ae8ac7bd0a378cf
++F src/update.c ddae32c4f7d116c0e1e43291f9522b28656244b5013252cfa8b13b5afaf07ac4
  F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4
  F src/utf.c 810fbfebe12359f10bc2a011520a6e10879ab2a163bcb26c74768eab82ea62a5
  F src/util.c d9eb0a6c4aae1b00a7369eadd7ca0bbe946cb4c953b6751aa20d357c2f482157
@@@ -594,14 -597,14 +597,14 @@@ F src/vdbesort.c 90aad5a92608f2dd771c96
  F src/vdbetrace.c 79d6dbbc479267b255a7de8080eee6e729928a0ef93ed9b0bfa5618875b48392
  F src/vtab.c 70188a745dc4e57d26e942681ff4b2912b7c8249ad5de3f60f0677b4337bcfaa
  F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
- F src/wal.c da000d7e4e4702eb4d2cf7c08d734db8b522c3ac43350323a0df0968ba566925
- F src/wal.h 4ef31f6defdd12877eff7832eb5f56c1f898bc074ac5aab67a539f9c59cb8118
 -F src/wal.c d1908ffa514275dc6f27c4b27abc6d5a2ce18c89e98dce10925972266b960f37
 -F src/wal.h 86a71244ad934135743cb50dd00cd380763ec5dca5b68012ea394731a369b741
++F src/wal.c 85bb10e593d54bd012d1cce25506172ff3e09cdda119d61ec4f254c9456d1a12
++F src/wal.h c1a0f32c170634cf42908f8e978fa6bd8921f7364301fa34606cd171fce883b1
  F src/walker.c fb94aadc9099ff9c6506d0a8b88d51266005bcaa265403f3d7caf732a562eb66
- F src/where.c 3818e8a736a05d2cb194e64399af707e367fbcc5c251d785804d02eaf121288e
- F src/whereInt.h f125f29fca80890768e0b2caa14f95db74b2dacd3a122a168f97aa7b64d6968f
- F src/wherecode.c c45f03aefc2266b990df0fc4d7acc4e27f56f881f4fc0fc355b7cbc4d7189da5
+ F src/where.c 981412c27abb9378d3024eae6f3040abd3c16db722f5ef8a7d613141ea2aea78
+ F src/whereInt.h 5f14db426ca46a83eabab1ae9aa6d4b8f27504ad35b64c290916289b1ddb2e88
+ F src/wherecode.c 89d2ec668aec884dfa7ac500c6744e42ec0590fcd72fb740a8b48326a8412811
  F src/whereexpr.c 36b47f7261d6b6f1a72d774c113b74beddf6745aba1018e64b196e29db233442
- F src/window.c ea81ecd031ed2cbc14b7db6fd7f4bee2471b894feae5fea0547b15b1e2dd8fb2
+ F src/window.c f4a9ac8396395a9e281e182dd32fc9b3b19f6762a9eef468137369def3ad9a2c
  F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
  F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd
  F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d
@@@ -732,8 -735,9 +735,9 @@@ F test/collateB.test 1e68906951b846570f
  F test/colmeta.test 2c765ea61ee37bc43bbe6d6047f89004e6508eb1
  F test/colname.test fb28b3687e03625425bc216edf8b186ce974aa71008e2aa1f426a7dcb75a601d
  F test/concfault.test 500f17c3fcfe7705114422bcc6ddd3c740001a43
+ F test/concfault2.test 34b3fd258836aa305475d00e804c7450ade92f0de0bf9fa620e701446669bb12
  F test/concurrent.test 86661967a680670127a62a819e60dc93c2d3d49043ac95b26dfa70d3e60dbde5
- F test/concurrent2.test de748c7dd749c77e2af2c4b914b9b09a28ac09608042ca498c0251dc6f46aa1a
 -F test/concurrent2.test f447dfae67e4d80a2b61e2796c2c081564a8126cf96c39a14780e89c8c53eff5
++F test/concurrent2.test 847cd11edc82229a95e1eaf88b55c974430b0f669cefd67a453d274e3480981c
  F test/concurrent3.test 530671ac706f6a1d0f4992dbdd33a86408330d03cd90fb9e82ecb1b27f5fd081
  F test/concurrent4.test e0b12cd467137e50259df3b4f837507e82aaa07c35941c88664dc8ed1d089c44
  F test/concurrent5.test 0c16cbf7446af162a14e6def30445e94016064eb994e5aa4ebb2bebc59554176
@@@ -1196,7 -1201,7 +1201,7 @@@ F test/pagesize.test 5769fc62d8c890a83a
  F test/pcache.test c8acbedd3b6fd0f9a7ca887a83b11d24a007972b
  F test/pcache2.test af7f3deb1a819f77a6d0d81534e97d1cf62cd442
  F test/percentile.test 4243af26b8f3f4555abe166f723715a1f74c77ff
- F test/permutations.test c26601c1db80a67a54353af19a63a6ff5fbf8c80a2b2554e10e4f9030c428fee
 -F test/permutations.test 7a4a5b031cff772029df1ab1a65e93d8bd453fbd721180e9d074c9219c32c175
++F test/permutations.test be93fcab2e205260ae296a76b45529f2a75e78a43480cabdbb77dee88c2e0ed2
  F test/pg_common.tcl 301ac19c1a52fd55166d26db929b3b89165c634d52b5f8ad76ea8cb06960db30
  F test/pragma.test c267bf02742c823a191960895b3d52933cebd7beee26757d1ed694f213fcd867
  F test/pragma2.test e5d5c176360c321344249354c0c16aec46214c9f
@@@ -1614,13 -1620,15 +1620,15 @@@ F test/wal.test a233cd4733928a5aaef2473
  F test/wal2.test a225bafac35a47765b890bacdeb57e5e81039f21cc18a1e8ce88eb76e56b843c
  F test/wal2big.test 0b4ec526f9ca4bbabc355042c38045ae2e253fb46eb327bb7693d0122bc6968b
  F test/wal2concurrent.test 7fc3e570073683a2a28f42bda46ecf516f5bc82afd703c1fbf4aa38e18fb3361
+ F test/wal2fault.test 2e8e60cacd5bcd451618aeffd05f676894d17202d3e2986e288d36e2c5993249
  F test/wal2lock.test 0ef98d72dc6bcf7711dedd684760488400d9a9a6eec0dc5d3822060437793552
  F test/wal2recover.test ba8f4bc9397c838734619f9e759bd98b00e355347b3cf80a2e677610d231d5d8
- F test/wal2recover2.test 3176a03eccebb203e5c5635d94624bf573392fccb3f9d39d9d9a27aab96e4c88
+ F test/wal2recover2.test dcfedc46a0080aa6d37c762863da2f5c0ec941c46a6cfe85b412e792c08a2ac2
  F test/wal2rewrite.test 6ca6f631ffcf871240beab5f02608913fd075c6d0d31310b026c8383c65c9f9c
- F test/wal2savepoint.test b5b3137f5f11c40294ef5be6c9576143fab63296f44856d15beee0359bbdeb57
+ F test/wal2rollback.test 23adc4a099b23f6aaea8b04fdca1c35861d887dd80f8be7da2d5273eb777e428
 -F test/wal2savepoint.test 2c82bd6a6ee5066c156040d2e9c2415646fcf96116ae7ad127eaf0c0b4a85f22
++F test/wal2savepoint.test 3793a0ae97011fca358f79775f5d7d9f85da75c8e67686e2e19713da0cb0d99c
  F test/wal2simple.test 96206c98bf64ab20ec00a1c0f6c709e258b98b39f2149889361f31966ce5a703
- F test/wal2snapshot.test 95a919e1c73dee0e0212d10931d03cc1116f68a0ff603163e551aaa5ac7025c1
+ F test/wal2snapshot.test f6c3945bea572fd8745774e95b8dca1e5832c696e2251bb0db33391ee567fe60
  F test/wal3.test 2a93004bc0fb2b5c29888964024695bade278ab2
  F test/wal4.test 4744e155cd6299c6bd99d3eab1c82f77db9cdb3c
  F test/wal5.test 9c11da7aeccd83a46d79a556ad11a18d3cb15aa9
@@@ -1648,7 -1657,7 +1657,7 @@@ F test/walprotocol.test a112aba0b79e3ad
  F test/walprotocol2.test 7e4bedd5ee83607e2928ac438bf7332a396b980d3e02aa0746509ce11ad1f13c
  F test/walro.test cb438d05ba0d191f10b688e39c4f0cd5b71569a1d1f4440e5bdf3c6880e08c20
  F test/walro2.test 0e79dd15cbdb4f482c01ea248373669c732414a726b357d04846a816afafb768
--F test/walrofault.test c70cb6e308c443867701856cce92ad8288cd99488fa52afab77cca6cfd51af68
++F test/walrofault.test 5a25f91c16a68bae65edec7cdef4495e5c6494c8408743fe9b29045fa6665cd0
  F test/walshared.test 0befc811dcf0b287efae21612304d15576e35417
  F test/walslow.test c05c68d4dc2700a982f89133ce103a1a84cc285f
  F test/walthread.test 14b20fcfa6ae152f5d8e12f5dc8a8a724b7ef189f5d8ef1e2ceab79f2af51747
@@@ -1813,7 -1823,7 +1823,7 @@@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a9
  F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
  F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
  F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
- P e388d02940e8c17e8e3f460643d988c8f523382df343f4fe766c2da17878e98d b9a741519055a8560ec1d0ab7d0c15ff8db53e740011825506cd2ede11c956f0
- R 9372febc05219e660f9e03e31a064ff1
 -P c31eeb3c87f260fa192638b3610a4d3b84b2c26cfaefc97ed63910495403f8c9 8445fb6d5dae98a0129514a10a15f08412bac5a1d8114b12e592c744ea2bc4c9
 -R 0806996acba6e0b3331e631071ee176c
++P c3191fc8fcb0775f87f55cb8124e0c36caa54993c2a5fe770d437e4f6ee72d77 fcb7348ba190e48112a681f704313a733f7a377456e7c1d6845ba34c270d86b6
++R 7956ec08206a96fcab5ff68438fad94b
  U dan
- Z 52542d1d3ae1e576093729b891bf71b2
 -Z 44e579b069341a68865674e64e97136d
++Z 041b665514beb78a4e6ea7c8171737de
diff --cc manifest.uuid
index 37f165021c9b09242f30e544db46e38904f74b08,b187037ed0abf08983f3f9d1d008f9cfe6314b8c..149a8ef0cc01a057d93457ed159fba9838a262ca
@@@ -1,1 -1,1 +1,1 @@@
- c3191fc8fcb0775f87f55cb8124e0c36caa54993c2a5fe770d437e4f6ee72d77
 -fcb7348ba190e48112a681f704313a733f7a377456e7c1d6845ba34c270d86b6
++86685679b4cff94704fe4b52364f25f579d98ee725407cfe3bd2bbf7ecd651a8
diff --cc src/os_unix.c
index cb8e9e7131532e03ccba768e0605725a470aa034,d3baad155a95f112bdb5c1a9344746ef0eb2831e..82b64cefee74a1bcde481063f451db3198242dfa
@@@ -4833,83 -4787,6 +4833,87 @@@ shmpage_out
    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 */
-     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_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 */
-         assert( (*ptr)==SQLITE_MFS_EXCLUSIVE );
-         *ptr = 0;
++    u16 mask = (1<<(ofst+n)) - (1<<ofst);
++    if( (flags & SQLITE_SHM_LOCK) || (mask & p->exclMask) ){
++      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) );
++        }
++      }
 +      if( flags & SQLITE_SHM_UNLOCK ){
-         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) );
++        p->exclMask &= ~mask;
 +      }else{
++        p->exclMask |= mask;
 +      }
 +    }
 +  }
 +
 +  return SQLITE_OK;
 +}
 +#else
 +# define unixMutexFreeShmlock(a,b,c,d) SQLITE_OK
 +#endif
 +
  /*
  ** Change the lock state for a shared-memory segment.
  **
@@@ -4943,20 -4820,8 +4947,20 @@@ static int unixShmLock
    assert( pShmNode->hShm>=0 || pDbFd->pInode->bProcessLock==1 );
    assert( pShmNode->hShm<0 || pDbFd->pInode->bProcessLock==0 );
  
 +  if( pDbFd->pInode->bProcessLock ){
 +    return unixMutexFreeShmlock(pDbFd, ofst, n, flags);
 +  }
 +
    mask = (1<<(ofst+n)) - (1<<ofst);
    assert( n>1 || mask==(1<<ofst) );
-     assert( !(flags&SQLITE_SHM_EXCLUSIVE) || (p->exclMask&mask)==mask );
 +  if( flags & SQLITE_SHM_LOCK ){
 +    assert( !(flags&SQLITE_SHM_SHARED) || (p->sharedMask&mask)==0 );
 +    assert( !(flags&SQLITE_SHM_EXCLUSIVE) || !(p->exclMask&mask) );
 +  }else{
 +    assert( !(flags&SQLITE_SHM_SHARED) || (p->sharedMask&mask)==mask );
++    /* assert( !(flags&SQLITE_SHM_EXCLUSIVE) || (p->exclMask&mask)==mask ); */
 +  }
 +
    sqlite3_mutex_enter(pShmNode->pShmMutex);
    if( flags & SQLITE_SHM_UNLOCK ){
      u16 allMask = 0; /* Mask of locks held by siblings */
diff --cc src/select.c
Simple merge
diff --cc src/sqliteInt.h
Simple merge
diff --cc src/update.c
Simple merge
diff --cc src/wal.c
Simple merge
diff --cc src/wal.h
Simple merge
Simple merge
Simple merge
Simple merge
index 3e66e2d920bb76d6ace9e68f58989679d3d691c6,3e66e2d920bb76d6ace9e68f58989679d3d691c6..76f7bebffa66dc4f1d168bca77d38cb1f5d7baeb
@@@ -55,6 -55,6 +55,4 @@@ do_faultsim_test 1 -faults oom* -prep 
    faultsim_test_result {0 {hello world ! world hello}}
  }
  
--
--
  finish_test