<div><br></div><div>Thank you! I had forgot that cmake decides which cpp file to build with for DirectoryWatcher depending on the os you’re building on :-(<caret></caret></div><div><br></div><div>PL</div><div><br></div><div><br></div><div id="protonmail_mobile_signature_block"><div>Sent from ProtonMail Mobile</div></div> <div><br></div><div><br></div>On Tue, Aug 6, 2019 at 12:14 AM, Shoaib Meenai <<a href="mailto:smeenai@fb.com" class="">smeenai@fb.com</a>> wrote:<blockquote class="protonmail_quote" type="cite">






<div class="WordSection1">
<p class="MsoNormal">You missed a semicolon after an assert, which broke asserts Mac builds. I fixed it in r367984.</p>
<p class="MsoNormal"> </p>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal" style="margin-left:.5in"><b><span style="font-size:12.0pt;color:black">From:
</span></b><span style="font-size:12.0pt;color:black">cfe-commits <cfe-commits-bounces@lists.llvm.org> on behalf of Puyan Lotfi via cfe-commits <cfe-commits@lists.llvm.org><br>
<b>Reply-To: </b>Puyan Lotfi <puyan@puyan.org><br>
<b>Date: </b>Monday, August 5, 2019 at 10:11 PM<br>
<b>To: </b>"cfe-commits@lists.llvm.org" <cfe-commits@lists.llvm.org><br>
<b>Subject: </b>r367979 - [clang][DirectoryWatcher] Adding llvm::Expected error handling to create.</span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"> </p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">Author: zer0</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">Date: Mon Aug  5 22:12:23 2019</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">New Revision: 367979</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"> </p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D367979-26view-3Drev&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=6k2w1Mw8wKFqzKnFgq4r1I7Zmx7B-N-JdVMvtHYpjJs&s=GdHgTwHdRXipmG75D6eyJGuUUbCL0EMIl0YPYAY0y2U&e=">
https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D367979-26view-3Drev&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=6k2w1Mw8wKFqzKnFgq4r1I7Zmx7B-N-JdVMvtHYpjJs&s=GdHgTwHdRXipmG75D6eyJGuUUbCL0EMIl0YPYAY0y2U&e=</a>
</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">Log:</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">[clang][DirectoryWatcher] Adding llvm::Expected error handling to create.</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"> </p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">Prior to this patch Unix style errno error reporting from the inotify layer was</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">used by DirectoryWatcher::create to simply return a nullptr on error. This</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">would generally be ok, except that in LLVM we have much more robust error</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">reporting through the facilities of llvm::Expected.</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"> </p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">The other critical thing I stumbled across was that the unit tests for</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">DirectoryWatcher were not failing abruptly when inotify_init() was reporting an</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">error, but would continue with the testing and eventually hit a deadlock in a</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">pathological machine state (ie in the unit test, the return nullptr on ::create</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">was ignored).</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"> </p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">Generally this pathological state never happens on any build bot, so it is</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">totally understandable that it was overlooked, but on a Linux desktop running</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">a dubious desktop environment (which I will not name) there is a chance that</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">said desktop environment could use up enough inotify instances to exceed the</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">user's limit. These are the conditions that led me to hit the deadlock I am</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">addressing in this patch with more robust error handling.</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"> </p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">With the new llvm::Expected error handling when your system runs out of inotify</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">instances for your user, the unit test will be forced to handle the error or</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">crash and report the issue to the user instead of weirdly deadlocking on a</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">condition variable wait.</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"> </p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">Differential Revision: <a href="https://urldefense.proofpoint.com/v2/url?u=https-3A__reviews.llvm.org_D65704&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=6k2w1Mw8wKFqzKnFgq4r1I7Zmx7B-N-JdVMvtHYpjJs&s=vGtUV_-i1W7ejLSH8cWFnYlusAJMA8EK5kMTvuMmQB4&e=">
https://urldefense.proofpoint.com/v2/url?u=https-3A__reviews.llvm.org_D65704&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=6k2w1Mw8wKFqzKnFgq4r1I7Zmx7B-N-JdVMvtHYpjJs&s=vGtUV_-i1W7ejLSH8cWFnYlusAJMA8EK5kMTvuMmQB4&e=</a>
</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"> </p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"> </p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">Modified:</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">    cfe/trunk/include/clang/DirectoryWatcher/DirectoryWatcher.h</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">    cfe/trunk/lib/DirectoryWatcher/default/DirectoryWatcher-not-implemented.cpp</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">    cfe/trunk/lib/DirectoryWatcher/linux/DirectoryWatcher-linux.cpp</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">    cfe/trunk/lib/DirectoryWatcher/mac/DirectoryWatcher-mac.cpp</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">    cfe/trunk/unittests/DirectoryWatcher/DirectoryWatcherTest.cpp</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"> </p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">Modified: cfe/trunk/include/clang/DirectoryWatcher/DirectoryWatcher.h</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_include_clang_DirectoryWatcher_DirectoryWatcher.h-3Frev-3D367979-26r1-3D367978-26r2-3D367979-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=6k2w1Mw8wKFqzKnFgq4r1I7Zmx7B-N-JdVMvtHYpjJs&s=VCfJ3mXkHYvO_8Iw35iGLiTPxX-OaQIrX9fUY22ukbw&e=">
https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_include_clang_DirectoryWatcher_DirectoryWatcher.h-3Frev-3D367979-26r1-3D367978-26r2-3D367979-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=6k2w1Mw8wKFqzKnFgq4r1I7Zmx7B-N-JdVMvtHYpjJs&s=VCfJ3mXkHYvO_8Iw35iGLiTPxX-OaQIrX9fUY22ukbw&e=</a>
</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">==============================================================================</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">--- cfe/trunk/include/clang/DirectoryWatcher/DirectoryWatcher.h (original)</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+++ cfe/trunk/include/clang/DirectoryWatcher/DirectoryWatcher.h Mon Aug  5 22:12:23 2019</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">@@ -11,6 +11,7 @@</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">#include "llvm/ADT/ArrayRef.h"</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">#include "llvm/ADT/StringRef.h"</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+#include "llvm/Support/Error.h"</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">#include <functional></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">#include <memory></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">#include <string></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">@@ -98,10 +99,11 @@ public:</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">         : Kind(Kind), Filename(Filename) {}</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   };</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-  /// Returns nullptr if \param Path doesn't exist or isn't a directory.</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-  /// Returns nullptr if OS kernel API told us we can't start watching. In such</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-  /// case it's unclear whether just retrying has any chance to succeeed.</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-  static std::unique_ptr<DirectoryWatcher></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+  /// Asserts if \param Path doesn't exist or isn't a directory.</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+  /// Returns llvm::Expected Error if OS kernel API told us we can't start</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+  /// watching. In such case it's unclear whether just retrying has any chance</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+  /// to succeeed.</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+  static llvm::Expected<std::unique_ptr<DirectoryWatcher>></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   create(llvm::StringRef Path,</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">          std::function<void(llvm::ArrayRef<DirectoryWatcher::Event> Events,</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">                             bool IsInitial)></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"> </p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">Modified: cfe/trunk/lib/DirectoryWatcher/default/DirectoryWatcher-not-implemented.cpp</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_DirectoryWatcher_default_DirectoryWatcher-2Dnot-2Dimplemented.cpp-3Frev-3D367979-26r1-3D367978-26r2-3D367979-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=6k2w1Mw8wKFqzKnFgq4r1I7Zmx7B-N-JdVMvtHYpjJs&s=kOGSMivkTUI-mqfkDLYmSGfQM8CSoTUydr4qZdtcaAc&e=">
https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_DirectoryWatcher_default_DirectoryWatcher-2Dnot-2Dimplemented.cpp-3Frev-3D367979-26r1-3D367978-26r2-3D367979-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=6k2w1Mw8wKFqzKnFgq4r1I7Zmx7B-N-JdVMvtHYpjJs&s=kOGSMivkTUI-mqfkDLYmSGfQM8CSoTUydr4qZdtcaAc&e=</a>
</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">==============================================================================</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">--- cfe/trunk/lib/DirectoryWatcher/default/DirectoryWatcher-not-implemented.cpp (original)</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+++ cfe/trunk/lib/DirectoryWatcher/default/DirectoryWatcher-not-implemented.cpp Mon Aug  5 22:12:23 2019</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">@@ -11,9 +11,11 @@</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">using namespace llvm;</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">using namespace clang;</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-std::unique_ptr<DirectoryWatcher> clang::DirectoryWatcher::create(</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+llvm::Expected<std::unique_ptr<DirectoryWatcher>> clang::DirectoryWatcher::create(</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">     StringRef Path,</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">     std::function<void(llvm::ArrayRef<DirectoryWatcher::Event>, bool)> Receiver,</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">     bool WaitForInitialSync) {</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-  return nullptr;</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+  return llvm::make_error<llvm::StringError>(</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+      "DirectoryWatcher is not implemented for this platform!",</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+      llvm::inconvertibleErrorCode());</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">}</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">\ No newline at end of file</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"> </p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">Modified: cfe/trunk/lib/DirectoryWatcher/linux/DirectoryWatcher-linux.cpp</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_DirectoryWatcher_linux_DirectoryWatcher-2Dlinux.cpp-3Frev-3D367979-26r1-3D367978-26r2-3D367979-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=6k2w1Mw8wKFqzKnFgq4r1I7Zmx7B-N-JdVMvtHYpjJs&s=JukTCE-It3faGLTZEpsnCkN-RSCAfjthnHtk0Xh3PmA&e=">
https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_DirectoryWatcher_linux_DirectoryWatcher-2Dlinux.cpp-3Frev-3D367979-26r1-3D367978-26r2-3D367979-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=6k2w1Mw8wKFqzKnFgq4r1I7Zmx7B-N-JdVMvtHYpjJs&s=JukTCE-It3faGLTZEpsnCkN-RSCAfjthnHtk0Xh3PmA&e=</a>
</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">==============================================================================</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">--- cfe/trunk/lib/DirectoryWatcher/linux/DirectoryWatcher-linux.cpp (original)</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+++ cfe/trunk/lib/DirectoryWatcher/linux/DirectoryWatcher-linux.cpp Mon Aug  5 22:12:23 2019</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">@@ -13,6 +13,7 @@</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">#include "llvm/ADT/ScopeExit.h"</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">#include "llvm/Support/AlignOf.h"</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">#include "llvm/Support/Errno.h"</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+#include "llvm/Support/Error.h"</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">#include "llvm/Support/Mutex.h"</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">#include "llvm/Support/Path.h"</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">#include <atomic></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">@@ -320,16 +321,17 @@ DirectoryWatcherLinux::DirectoryWatcherL</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">} // namespace</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-std::unique_ptr<DirectoryWatcher> clang::DirectoryWatcher::create(</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+llvm::Expected<std::unique_ptr<DirectoryWatcher>> clang::DirectoryWatcher::create(</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">     StringRef Path,</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">     std::function<void(llvm::ArrayRef<DirectoryWatcher::Event>, bool)> Receiver,</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">     bool WaitForInitialSync) {</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-  if (Path.empty())</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-    return nullptr;</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+  assert(!Path.empty() && "Path.empty()");</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   const int InotifyFD = inotify_init1(IN_CLOEXEC);</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   if (InotifyFD == -1)</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-    return nullptr;</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+    return llvm::make_error<llvm::StringError>(</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+        std::string("inotify_init1() error: ") + strerror(errno),</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+        llvm::inconvertibleErrorCode());</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   const int InotifyWD = inotify_add_watch(</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">       InotifyFD, Path.str().c_str(),</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">@@ -340,12 +342,16 @@ std::unique_ptr<DirectoryWatcher> clang:</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">#endif</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">       );</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   if (InotifyWD == -1)</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-    return nullptr;</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+    return llvm::make_error<llvm::StringError>(</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+        std::string("inotify_add_watch() error: ") + strerror(errno),</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+        llvm::inconvertibleErrorCode());</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   auto InotifyPollingStopper = SemaphorePipe::create();</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   if (!InotifyPollingStopper)</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-    return nullptr;</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+    return llvm::make_error<llvm::StringError>(</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+        std::string("SemaphorePipe::create() error: ") + strerror(errno),</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+        llvm::inconvertibleErrorCode());</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   return llvm::make_unique<DirectoryWatcherLinux>(</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">       Path, Receiver, WaitForInitialSync, InotifyFD, InotifyWD,</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"> </p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">Modified: cfe/trunk/lib/DirectoryWatcher/mac/DirectoryWatcher-mac.cpp</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_DirectoryWatcher_mac_DirectoryWatcher-2Dmac.cpp-3Frev-3D367979-26r1-3D367978-26r2-3D367979-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=6k2w1Mw8wKFqzKnFgq4r1I7Zmx7B-N-JdVMvtHYpjJs&s=T2eOFEXsVLLsAjg0xURecvVWyS6cEOOgHwW63xK5ZfY&e=">
https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_DirectoryWatcher_mac_DirectoryWatcher-2Dmac.cpp-3Frev-3D367979-26r1-3D367978-26r2-3D367979-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=6k2w1Mw8wKFqzKnFgq4r1I7Zmx7B-N-JdVMvtHYpjJs&s=T2eOFEXsVLLsAjg0xURecvVWyS6cEOOgHwW63xK5ZfY&e=</a>
</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">==============================================================================</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">--- cfe/trunk/lib/DirectoryWatcher/mac/DirectoryWatcher-mac.cpp (original)</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+++ cfe/trunk/lib/DirectoryWatcher/mac/DirectoryWatcher-mac.cpp Mon Aug  5 22:12:23 2019</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">@@ -11,16 +11,13 @@</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">#include "llvm/ADT/STLExtras.h"</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">#include "llvm/ADT/StringRef.h"</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+#include "llvm/Support/Error.h"</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">#include "llvm/Support/Path.h"</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">#include <CoreServices/CoreServices.h></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">using namespace llvm;</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">using namespace clang;</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-static FSEventStreamRef createFSEventStream(</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-    StringRef Path,</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-    std::function<void(llvm::ArrayRef<DirectoryWatcher::Event>, bool)>,</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-    dispatch_queue_t);</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">static void stopFSEventStream(FSEventStreamRef);</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">namespace {</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">@@ -153,8 +150,7 @@ FSEventStreamRef createFSEventStream(</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">     StringRef Path,</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">     std::function<void(llvm::ArrayRef<DirectoryWatcher::Event>, bool)> Receiver,</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">     dispatch_queue_t Queue) {</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-  if (Path.empty())</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-    return nullptr;</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+  assert(!Path.empty() && "Path.empty()");</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   CFMutableArrayRef PathsToWatch = [&]() {</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">     CFMutableArrayRef PathsToWatch =</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">@@ -205,20 +201,16 @@ void stopFSEventStream(FSEventStreamRef</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   FSEventStreamRelease(EventStream);</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">}</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-std::unique_ptr<DirectoryWatcher> clang::DirectoryWatcher::create(</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+llvm::Expected<std::unique_ptr<DirectoryWatcher>> clang::DirectoryWatcher::create(</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">     StringRef Path,</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">     std::function<void(llvm::ArrayRef<DirectoryWatcher::Event>, bool)> Receiver,</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">     bool WaitForInitialSync) {</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   dispatch_queue_t Queue =</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">       dispatch_queue_create("DirectoryWatcher", DISPATCH_QUEUE_SERIAL);</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-  if (Path.empty())</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-    return nullptr;</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+  assert(!Path.empty() && "Path.empty()");</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   auto EventStream = createFSEventStream(Path, Receiver, Queue);</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-  if (!EventStream) {</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-    return nullptr;</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-  }</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+  assert(EventStream && "EventStream expected to be non-null.")</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   std::unique_ptr<DirectoryWatcher> Result =</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">       llvm::make_unique<DirectoryWatcherMac>(EventStream, Receiver, Path);</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"> </p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">Modified: cfe/trunk/unittests/DirectoryWatcher/DirectoryWatcherTest.cpp</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_unittests_DirectoryWatcher_DirectoryWatcherTest.cpp-3Frev-3D367979-26r1-3D367978-26r2-3D367979-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=6k2w1Mw8wKFqzKnFgq4r1I7Zmx7B-N-JdVMvtHYpjJs&s=4lOaG5iva-sTgUXlfX2eBaUzL1hMxauE0Pd2oW34fHk&e=">
https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_unittests_DirectoryWatcher_DirectoryWatcherTest.cpp-3Frev-3D367979-26r1-3D367978-26r2-3D367979-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=6k2w1Mw8wKFqzKnFgq4r1I7Zmx7B-N-JdVMvtHYpjJs&s=4lOaG5iva-sTgUXlfX2eBaUzL1hMxauE0Pd2oW34fHk&e=</a>
</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">==============================================================================</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">--- cfe/trunk/unittests/DirectoryWatcher/DirectoryWatcherTest.cpp (original)</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+++ cfe/trunk/unittests/DirectoryWatcher/DirectoryWatcherTest.cpp Mon Aug  5 22:12:23 2019</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">@@ -284,6 +284,7 @@ TEST(DirectoryWatcherTest, InitialScanSy</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">         TestConsumer.consume(Events, IsInitial);</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">       },</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">       /*waitForInitialSync=*/true);</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+  if (!DW) return;</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   checkEventualResultWithTimeout(TestConsumer);</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">}</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">@@ -315,6 +316,7 @@ TEST(DirectoryWatcherTest, InitialScanAs</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">         TestConsumer.consume(Events, IsInitial);</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">       },</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">       /*waitForInitialSync=*/false);</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+  if (!DW) return;</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   checkEventualResultWithTimeout(TestConsumer);</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">}</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">@@ -335,6 +337,7 @@ TEST(DirectoryWatcherTest, AddFiles) {</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">         TestConsumer.consume(Events, IsInitial);</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">       },</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">       /*waitForInitialSync=*/true);</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+  if (!DW) return;</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   fixture.addFile("a");</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   fixture.addFile("b");</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">@@ -360,6 +363,7 @@ TEST(DirectoryWatcherTest, ModifyFile) {</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">         TestConsumer.consume(Events, IsInitial);</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">       },</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">       /*waitForInitialSync=*/true);</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+  if (!DW) return;</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   // modify the file</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   {</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">@@ -390,6 +394,7 @@ TEST(DirectoryWatcherTest, DeleteFile) {</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">         TestConsumer.consume(Events, IsInitial);</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">       },</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">       /*waitForInitialSync=*/true);</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+  if (!DW) return;</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   fixture.deleteFile("a");</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">@@ -411,6 +416,7 @@ TEST(DirectoryWatcherTest, DeleteWatched</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">         TestConsumer.consume(Events, IsInitial);</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">       },</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">       /*waitForInitialSync=*/true);</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+  if (!DW) return;</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   remove_directories(fixture.TestWatchedDir);</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">@@ -431,6 +437,7 @@ TEST(DirectoryWatcherTest, InvalidatedWa</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">           TestConsumer.consume(Events, IsInitial);</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">         },</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">         /*waitForInitialSync=*/true);</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+    if (!DW) return;</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   } // DW is destructed here.</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   checkEventualResultWithTimeout(TestConsumer);</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"> </p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"> </p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">_______________________________________________</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">cfe-commits mailing list</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><a href="https://urldefense.proofpoint.com/v2/url?u=https-3A__lists.llvm.org_cgi-2Dbin_mailman_listinfo_cfe-2Dcommits&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=6k2w1Mw8wKFqzKnFgq4r1I7Zmx7B-N-JdVMvtHYpjJs&s=AvZ7rl6nzoSTyhQ1_rWF25r1kxnADHUAR7TvuiC3OE4&e=">https://urldefense.proofpoint.com/v2/url?u=https-3A__lists.llvm.org_cgi-2Dbin_mailman_listinfo_cfe-2Dcommits&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=6k2w1Mw8wKFqzKnFgq4r1I7Zmx7B-N-JdVMvtHYpjJs&s=AvZ7rl6nzoSTyhQ1_rWF25r1kxnADHUAR7TvuiC3OE4&e=</a>
</p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"> </p>
</div>
</div>


</blockquote><div><br></div><div><br></div>