<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.msonormal0, li.msonormal0, div.msonormal0
        {mso-style-name:msonormal;
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style>
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal">You missed a semicolon after an assert, which broke asserts Mac builds. I fixed it in r367984.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></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.<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">Author: zer0<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">Date: Mon Aug  5 22:12:23 2019<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">New Revision: 367979<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></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>
<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">Log:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">[clang][DirectoryWatcher] Adding llvm::Expected error handling to create.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">Prior to this patch Unix style errno error reporting from the inotify layer was<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">used by DirectoryWatcher::create to simply return a nullptr on error. This<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">would generally be ok, except that in LLVM we have much more robust error<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">reporting through the facilities of llvm::Expected.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">The other critical thing I stumbled across was that the unit tests for<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">DirectoryWatcher were not failing abruptly when inotify_init() was reporting an<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">error, but would continue with the testing and eventually hit a deadlock in a<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">pathological machine state (ie in the unit test, the return nullptr on ::create<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">was ignored).<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">Generally this pathological state never happens on any build bot, so it is<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">totally understandable that it was overlooked, but on a Linux desktop running<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">a dubious desktop environment (which I will not name) there is a chance that<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">said desktop environment could use up enough inotify instances to exceed the<o:p></o:p></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<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">addressing in this patch with more robust error handling.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">With the new llvm::Expected error handling when your system runs out of inotify<o:p></o:p></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<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">crash and report the issue to the user instead of weirdly deadlocking on a<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">condition variable wait.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></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>
<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">Modified:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">    cfe/trunk/include/clang/DirectoryWatcher/DirectoryWatcher.h<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">    cfe/trunk/lib/DirectoryWatcher/default/DirectoryWatcher-not-implemented.cpp<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">    cfe/trunk/lib/DirectoryWatcher/linux/DirectoryWatcher-linux.cpp<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">    cfe/trunk/lib/DirectoryWatcher/mac/DirectoryWatcher-mac.cpp<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">    cfe/trunk/unittests/DirectoryWatcher/DirectoryWatcherTest.cpp<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">Modified: cfe/trunk/include/clang/DirectoryWatcher/DirectoryWatcher.h<o:p></o:p></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>
<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">==============================================================================<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">--- cfe/trunk/include/clang/DirectoryWatcher/DirectoryWatcher.h (original)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+++ cfe/trunk/include/clang/DirectoryWatcher/DirectoryWatcher.h Mon Aug  5 22:12:23 2019<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">@@ -11,6 +11,7 @@<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">#include "llvm/ADT/ArrayRef.h"<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">#include "llvm/ADT/StringRef.h"<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+#include "llvm/Support/Error.h"<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">#include <functional><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">#include <memory><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">#include <string><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">@@ -98,10 +99,11 @@ public:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">         : Kind(Kind), Filename(Filename) {}<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   };<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-  /// Returns nullptr if \param Path doesn't exist or isn't a directory.<o:p></o:p></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<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-  /// case it's unclear whether just retrying has any chance to succeeed.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-  static std::unique_ptr<DirectoryWatcher><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+  /// Asserts if \param Path doesn't exist or isn't a directory.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+  /// Returns llvm::Expected Error if OS kernel API told us we can't start<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+  /// watching. In such case it's unclear whether just retrying has any chance<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+  /// to succeeed.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+  static llvm::Expected<std::unique_ptr<DirectoryWatcher>><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   create(llvm::StringRef Path,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">          std::function<void(llvm::ArrayRef<DirectoryWatcher::Event> Events,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">                             bool IsInitial)><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">Modified: cfe/trunk/lib/DirectoryWatcher/default/DirectoryWatcher-not-implemented.cpp<o:p></o:p></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>
<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">==============================================================================<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">--- cfe/trunk/lib/DirectoryWatcher/default/DirectoryWatcher-not-implemented.cpp (original)<o:p></o:p></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<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">@@ -11,9 +11,11 @@<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">using namespace llvm;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">using namespace clang;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-std::unique_ptr<DirectoryWatcher> clang::DirectoryWatcher::create(<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+llvm::Expected<std::unique_ptr<DirectoryWatcher>> clang::DirectoryWatcher::create(<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">     StringRef Path,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">     std::function<void(llvm::ArrayRef<DirectoryWatcher::Event>, bool)> Receiver,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">     bool WaitForInitialSync) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-  return nullptr;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+  return llvm::make_error<llvm::StringError>(<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+      "DirectoryWatcher is not implemented for this platform!",<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+      llvm::inconvertibleErrorCode());<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">}<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">\ No newline at end of file<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">Modified: cfe/trunk/lib/DirectoryWatcher/linux/DirectoryWatcher-linux.cpp<o:p></o:p></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>
<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">==============================================================================<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">--- cfe/trunk/lib/DirectoryWatcher/linux/DirectoryWatcher-linux.cpp (original)<o:p></o:p></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<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">@@ -13,6 +13,7 @@<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">#include "llvm/ADT/ScopeExit.h"<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">#include "llvm/Support/AlignOf.h"<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">#include "llvm/Support/Errno.h"<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+#include "llvm/Support/Error.h"<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">#include "llvm/Support/Mutex.h"<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">#include "llvm/Support/Path.h"<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">#include <atomic><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">@@ -320,16 +321,17 @@ DirectoryWatcherLinux::DirectoryWatcherL<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">} // namespace<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-std::unique_ptr<DirectoryWatcher> clang::DirectoryWatcher::create(<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+llvm::Expected<std::unique_ptr<DirectoryWatcher>> clang::DirectoryWatcher::create(<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">     StringRef Path,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">     std::function<void(llvm::ArrayRef<DirectoryWatcher::Event>, bool)> Receiver,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">     bool WaitForInitialSync) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-  if (Path.empty())<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-    return nullptr;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+  assert(!Path.empty() && "Path.empty()");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   const int InotifyFD = inotify_init1(IN_CLOEXEC);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   if (InotifyFD == -1)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-    return nullptr;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+    return llvm::make_error<llvm::StringError>(<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+        std::string("inotify_init1() error: ") + strerror(errno),<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+        llvm::inconvertibleErrorCode());<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   const int InotifyWD = inotify_add_watch(<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">       InotifyFD, Path.str().c_str(),<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">@@ -340,12 +342,16 @@ std::unique_ptr<DirectoryWatcher> clang:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">#endif<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">       );<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   if (InotifyWD == -1)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-    return nullptr;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+    return llvm::make_error<llvm::StringError>(<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+        std::string("inotify_add_watch() error: ") + strerror(errno),<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+        llvm::inconvertibleErrorCode());<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   auto InotifyPollingStopper = SemaphorePipe::create();<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   if (!InotifyPollingStopper)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-    return nullptr;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+    return llvm::make_error<llvm::StringError>(<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+        std::string("SemaphorePipe::create() error: ") + strerror(errno),<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+        llvm::inconvertibleErrorCode());<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   return llvm::make_unique<DirectoryWatcherLinux>(<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">       Path, Receiver, WaitForInitialSync, InotifyFD, InotifyWD,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">Modified: cfe/trunk/lib/DirectoryWatcher/mac/DirectoryWatcher-mac.cpp<o:p></o:p></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>
<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">==============================================================================<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">--- cfe/trunk/lib/DirectoryWatcher/mac/DirectoryWatcher-mac.cpp (original)<o:p></o:p></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<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">@@ -11,16 +11,13 @@<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">#include "llvm/ADT/STLExtras.h"<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">#include "llvm/ADT/StringRef.h"<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+#include "llvm/Support/Error.h"<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">#include "llvm/Support/Path.h"<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">#include <CoreServices/CoreServices.h><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">using namespace llvm;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">using namespace clang;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-static FSEventStreamRef createFSEventStream(<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-    StringRef Path,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-    std::function<void(llvm::ArrayRef<DirectoryWatcher::Event>, bool)>,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-    dispatch_queue_t);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">static void stopFSEventStream(FSEventStreamRef);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">namespace {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">@@ -153,8 +150,7 @@ FSEventStreamRef createFSEventStream(<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">     StringRef Path,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">     std::function<void(llvm::ArrayRef<DirectoryWatcher::Event>, bool)> Receiver,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">     dispatch_queue_t Queue) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-  if (Path.empty())<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-    return nullptr;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+  assert(!Path.empty() && "Path.empty()");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   CFMutableArrayRef PathsToWatch = [&]() {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">     CFMutableArrayRef PathsToWatch =<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">@@ -205,20 +201,16 @@ void stopFSEventStream(FSEventStreamRef<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   FSEventStreamRelease(EventStream);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">}<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-std::unique_ptr<DirectoryWatcher> clang::DirectoryWatcher::create(<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+llvm::Expected<std::unique_ptr<DirectoryWatcher>> clang::DirectoryWatcher::create(<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">     StringRef Path,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">     std::function<void(llvm::ArrayRef<DirectoryWatcher::Event>, bool)> Receiver,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">     bool WaitForInitialSync) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   dispatch_queue_t Queue =<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">       dispatch_queue_create("DirectoryWatcher", DISPATCH_QUEUE_SERIAL);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-  if (Path.empty())<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-    return nullptr;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+  assert(!Path.empty() && "Path.empty()");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   auto EventStream = createFSEventStream(Path, Receiver, Queue);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-  if (!EventStream) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-    return nullptr;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-  }<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+  assert(EventStream && "EventStream expected to be non-null.")<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   std::unique_ptr<DirectoryWatcher> Result =<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">       llvm::make_unique<DirectoryWatcherMac>(EventStream, Receiver, Path);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">Modified: cfe/trunk/unittests/DirectoryWatcher/DirectoryWatcherTest.cpp<o:p></o:p></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>
<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">==============================================================================<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">--- cfe/trunk/unittests/DirectoryWatcher/DirectoryWatcherTest.cpp (original)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+++ cfe/trunk/unittests/DirectoryWatcher/DirectoryWatcherTest.cpp Mon Aug  5 22:12:23 2019<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">@@ -284,6 +284,7 @@ TEST(DirectoryWatcherTest, InitialScanSy<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">         TestConsumer.consume(Events, IsInitial);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">       },<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">       /*waitForInitialSync=*/true);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+  if (!DW) return;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   checkEventualResultWithTimeout(TestConsumer);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">}<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">@@ -315,6 +316,7 @@ TEST(DirectoryWatcherTest, InitialScanAs<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">         TestConsumer.consume(Events, IsInitial);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">       },<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">       /*waitForInitialSync=*/false);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+  if (!DW) return;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   checkEventualResultWithTimeout(TestConsumer);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">}<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">@@ -335,6 +337,7 @@ TEST(DirectoryWatcherTest, AddFiles) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">         TestConsumer.consume(Events, IsInitial);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">       },<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">       /*waitForInitialSync=*/true);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+  if (!DW) return;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   fixture.addFile("a");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   fixture.addFile("b");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">@@ -360,6 +363,7 @@ TEST(DirectoryWatcherTest, ModifyFile) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">         TestConsumer.consume(Events, IsInitial);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">       },<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">       /*waitForInitialSync=*/true);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+  if (!DW) return;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   // modify the file<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">@@ -390,6 +394,7 @@ TEST(DirectoryWatcherTest, DeleteFile) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">         TestConsumer.consume(Events, IsInitial);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">       },<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">       /*waitForInitialSync=*/true);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+  if (!DW) return;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   fixture.deleteFile("a");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">@@ -411,6 +416,7 @@ TEST(DirectoryWatcherTest, DeleteWatched<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">         TestConsumer.consume(Events, IsInitial);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">       },<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">       /*waitForInitialSync=*/true);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+  if (!DW) return;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   remove_directories(fixture.TestWatchedDir);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">@@ -431,6 +437,7 @@ TEST(DirectoryWatcherTest, InvalidatedWa<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">           TestConsumer.consume(Events, IsInitial);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">         },<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">         /*waitForInitialSync=*/true);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+    if (!DW) return;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   } // DW is destructed here.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   checkEventualResultWithTimeout(TestConsumer);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">_______________________________________________<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">cfe-commits mailing list<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a><o:p></o:p></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>
<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</div>
</div>
</body>
</html>