<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>