jkorous marked 18 inline comments as done.
jkorous added inline comments.

================
Comment at: clang/lib/DirectoryWatcher/DirectoryWatcher-linux.inc.h:116
+
+      DirectoryWatcher::EventKind K = DirectoryWatcher::EventKind::Added;
+      if (ievt->mask & IN_MODIFY) {
----------------
jkorous wrote:
> mgorny wrote:
> > I don't think I understand this assumption. Have you any specific event in 
> > mind that is supposed to be treated as added here? If not, maybe it'd be 
> > better to have no default and instead assert that one of the conditions 
> > below matched.
> SGTM. Will rewrite to Optional<> and assert.
Reconsidered and replaced with one-off closure in order not to complicate 
following code with Optional.


================
Comment at: clang/lib/DirectoryWatcher/DirectoryWatcher-linux.inc.h:135
+        if (!statusOpt.hasValue())
+          K = DirectoryWatcher::EventKind::Removed;
+      }
----------------
akyrtzi wrote:
> mgorny wrote:
> > akyrtzi wrote:
> > > mgorny wrote:
> > > > akyrtzi wrote:
> > > > > mgorny wrote:
> > > > > > akyrtzi wrote:
> > > > > > > mgorny wrote:
> > > > > > > > jkorous wrote:
> > > > > > > > > mgorny wrote:
> > > > > > > > > > Why? I suppose this deserves a comment.
> > > > > > > > > I'll add this comment:
> > > > > > > > > 
> > > > > > > > > // The file might have been removed just after we received 
> > > > > > > > > the event.
> > > > > > > > Wouldn't that cause removals to be reported twice?
> > > > > > > Not quite sure if it can happen in practice but I'd suggest to 
> > > > > > > accept this as potential occurrence and add it to documentation 
> > > > > > > ("a 'removed' event may be reported twice). I think it is better 
> > > > > > > to handle a definite "fact" (the file doesn't exist) than ignore 
> > > > > > > it and assume the 'removed' event will eventually show up, or try 
> > > > > > > to eliminate the double reporting which would over-complicate the 
> > > > > > > implementation.
> > > > > > > 
> > > > > > > After all, if inotify() is not 100% reliable then there's already 
> > > > > > > the possibility that you'll get a 'removed' event for a file that 
> > > > > > > was not reported as 'added' before.
> > > > > > I see this as a partial workaround for race condition. You 'fix' it 
> > > > > > if removal happens between inotify reporting the event and you 
> > > > > > returning it. You don't if removal happens after you push it to 
> > > > > > events. Therefore, the caller still needs to account for 'added' 
> > > > > > event being obsolete. I don't really see a purpose in trying to 
> > > > > > workaround the problem partially here if the caller still needs to 
> > > > > > account for it. Effectively, you're replacing one normal case and 
> > > > > > one corner case with one normal case and two corner cases.
> > > > > I was mainly pointing out that the client already has to be prepared 
> > > > > for a 'removed' event that does not have an associated 'added' event, 
> > > > > regardless of what this code is doing. Therefore a potential double 
> > > > > 'removed' event doesn't add complexity to the client.
> > > > > 
> > > > > Could you clarify how the code should handle the inability to get the 
> > > > > mod time ? Should it ignore the event ?
> > > > Given the code is supposed to wrap filesystem notification layer, I'd 
> > > > say it should pass the events unmodified and not double-guess what the 
> > > > client expects. The client needs to be prepared for non-atomicity of 
> > > > this anyway.
> > > So it should report an 'added' event but with optional mod-time, 
> > > essentially reporting that something was added that doesn't exist ?
> > > I'd prefer not to do that because it complicates the client without any 
> > > real benefit. It was great that you pointed out this part of the code but 
> > > I'd recommend that if the file is gone we should ignore the 'added' 
> > > event, instead of complicating the API for a corner case.
> > Except that is technically impossible to avoid reporting something that 
> > doesn't exist because it can be removed just after you check for it. So the 
> > client needs to *always* support it, otherwise it's fragile to race 
> > conditions.
> > 
> > This extra check just covers the short period (-> 0) between reporting and 
> > checking. It's needless complexity that doesn't solve the problem. If it 
> > does anything, then it gives you false security that you've solved the 
> > problem when actually the file may still disappear 1 ns after you've 
> > checked that it existed.
> Ok, that's fair, @jkorous I'm fine with removing the mod-time from the 
> DirectoryWatcher API. We can get and report the mod-time at the index-store 
> library layer.
Removed the conditional event kind change and removed ModTime.


================
Comment at: clang/lib/DirectoryWatcher/DirectoryWatcher-linux.inc.h:154
+    errorMsg += llvm::sys::StrError();
+    return true;
+  };
----------------
dexonsmith wrote:
> jkorous wrote:
> > mgorny wrote:
> > > The return values seem to be confusing. Any reason not to use `true` for 
> > > success?
> > It seems there's no real consensus * about error/success mapping to bool 
> > and since this is just implementation detail (not a public interface) I 
> > think it's fine. `llvm::Error` has better semantics but seems a bit 
> > heavyweight for this.
> > 
> > * Just tried this: grep -nr "returns true" clang | grep -i error
> Agreed that much of LLVM/Clang uses the C convention where `false`/`0` is 
> success.
> 
> However, I'm curious whether it might be better to thread `llvm::Error` 
> (and/or `llvm::Expected`) through, since you bring it up.  They provide nice 
> assertions when the caller forgets to check the result, they're cheap on 
> success, and there's no true/false ambiguity.
Using `llvm::Error` machinery sounds like a good idea. I'll leave it for a 
separate patch though.


================
Comment at: clang/lib/DirectoryWatcher/DirectoryWatcher-linux.inc.h:94
+                       std::shared_ptr<EventQueue> evtQueue) {
+#define EVT_BUF_LEN (30 * (sizeof(struct inotify_event) + NAME_MAX + 1))
+  char buf[EVT_BUF_LEN] __attribute__((aligned(8)));
----------------
dexonsmith wrote:
> Can this be `constexpr int EventBufferLength` instead of `#define 
> EVT_BUF_LEN`?
Yes, that's a good catch.


================
Comment at: clang/lib/DirectoryWatcher/DirectoryWatcher-linux.inc.h:196
+  while (true) {
+    if (close(inotifyFD) == -1 && errno == EINTR)
+      continue;
----------------
mgorny wrote:
> There's some fancy function for this in LLVM. `RetryAfterSignal`, I think.
Didn't know that one. Thanks!


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D58418/new/

https://reviews.llvm.org/D58418



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to