Use a fast compiler-provided memory barrier exclusively, if such a memory
barrier is available.

FossilOrigin-Name: df66fec9bc5b8c012d2fef3e97b3f7c3850a195b417806bfddc00b88e99c97d7
diff --git a/manifest b/manifest
index 53d8560..21698c4 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Further\ssimplifications\sto\ssqlite3VdbeMemSetStr().
-D 2019-02-08T17:28:20.169
+C Use\sa\sfast\scompiler-provided\smemory\sbarrier\sexclusively,\sif\ssuch\sa\smemory\nbarrier\sis\savailable.
+D 2019-02-08T20:55:16.378
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4
@@ -491,15 +491,15 @@
 F src/mutex.c bae36f8af32c22ad80bbf0ccebec63c252b6a2b86e4d3e42672ff287ebf4a604
 F src/mutex.h 779d588e3b7756ec3ecf7d78cde1d84aba414f85
 F src/mutex_noop.c 9d4309c075ba9cc7249e19412d3d62f7f94839c4
-F src/mutex_unix.c aaf9ebc3f89df28483c52208497a99a02cc3650011422fc9d4c57e4392f7fe58
-F src/mutex_w32.c 7670d770c94bbfe8289bec9d7f1394c5a00a57c37f892aab6b6612d085255235
+F src/mutex_unix.c 38abc2b703aae750e062947b75442893b02d8e124383d0e72d309e1c0d96d5e9
+F src/mutex_w32.c 761007c4382f684ebff7be2529a4926f6f2d30a178ef188d6b39ab35be5fefb4
 F src/notify.c 9711a7575036f0d3040ba61bc6e217f13a9888e7
 F src/os.c 8aeb0b0f40f8f5b0da03fe49706695adaf42d2f516ab95abc72e86c245e119de
 F src/os.h 48388821692e87da174ea198bf96b1b2d9d83be5dfc908f673ee21fafbe0d432
 F src/os_common.h b2f4707a603e36811d9b1a13278bffd757857b85
 F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586
-F src/os_unix.c f6e91b8fd82af7afbfd073c4974ad6cdb8e62d9f65ceddb45167835a0567fdc0
-F src/os_win.c 85d9e532d0444ab6c16d7431490c2e279e282aa0917b0e988996b1ae0de5c5a0
+F src/os_unix.c 53b42b7c8c72433f6df81a66c956ba13d9a31f1e710ffebbc9de97573480571f
+F src/os_win.c 1dcd863d151c39b8f4b7eba3e2eb04366f0493fe0b54f54f64fb8115f749e895
 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a
 F src/pager.c 857dde3e525f665cfab23b6765bf04ca6638c0759ae7da6d63acfb463e230aa6
 F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3
@@ -1804,7 +1804,10 @@
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 5c499da8a4d0babc56883aa362ae124772fd9214a51169a88a5dee523d051658
-R 9c9226b3cda6f38720edaaa5f3813b03
+P 1d212957079a2caa30f3c9d80f43464781bc9634c2b5181a5814efbddae31711
+R f9ac6bdc834b55ba32484f2ca38d078f
+T *branch * faster-memory-barrier
+T *sym-faster-memory-barrier *
+T -sym-trunk *
 U drh
-Z 9bc13d9b07eaf6edcfa1cadc644eb143
+Z b8a96f494889c21be4a60fd7afef3f80
diff --git a/manifest.uuid b/manifest.uuid
index b06c875..6faa7ec 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-1d212957079a2caa30f3c9d80f43464781bc9634c2b5181a5814efbddae31711
\ No newline at end of file
+df66fec9bc5b8c012d2fef3e97b3f7c3850a195b417806bfddc00b88e99c97d7
\ No newline at end of file
diff --git a/src/mutex_unix.c b/src/mutex_unix.c
index 9282d28..a22bdee 100644
--- a/src/mutex_unix.c
+++ b/src/mutex_unix.c
@@ -93,6 +93,7 @@
   SQLITE_MEMORY_BARRIER;
 #elif defined(__GNUC__) && GCC_VERSION>=4001000
   __sync_synchronize();
+# define sqlite3MemoryBarrier_IS_RELIABLE 1
 #endif
 }
 
diff --git a/src/mutex_w32.c b/src/mutex_w32.c
index 8a8ae28..7c2dd68 100644
--- a/src/mutex_w32.c
+++ b/src/mutex_w32.c
@@ -87,8 +87,10 @@
   SQLITE_MEMORY_BARRIER;
 #elif defined(__GNUC__)
   __sync_synchronize();
+# define sqlite3MemoryBarrier_IS_RELIABLE 1
 #elif MSVC_VERSION>=1300
   _ReadWriteBarrier();
+# define sqlite3MemoryBarrier_IS_RELIABLE 1
 #elif defined(MemoryBarrier)
   MemoryBarrier();
 #endif
diff --git a/src/os_unix.c b/src/os_unix.c
index f20763e..678b1c0 100644
--- a/src/os_unix.c
+++ b/src/os_unix.c
@@ -4893,8 +4893,10 @@
   assert( fd->pMethods->xLock==nolockLock 
        || unixFileMutexNotheld((unixFile*)fd) 
   );
+#ifndef sqlite3MemoryBarrier_IS_RELIABLE
   unixEnterMutex();               /* Also mutex, for redundancy */
   unixLeaveMutex();
+#endif
 }
 
 /*
diff --git a/src/os_win.c b/src/os_win.c
index aafc89f..4aacaa1 100644
--- a/src/os_win.c
+++ b/src/os_win.c
@@ -4174,8 +4174,10 @@
 ){
   UNUSED_PARAMETER(fd);
   sqlite3MemoryBarrier();   /* compiler-defined memory barrier */
+#ifndef sqlite3MemoryBarrier_IS_RELIABLE
   winShmEnterMutex();       /* Also mutex, for redundancy */
   winShmLeaveMutex();
+#endif
 }
 
 /*