diff --git a/src/watcher.c b/src/watcher.c index 5cb9651..54b72a8 100644 --- a/src/watcher.c +++ b/src/watcher.c @@ -47,8 +47,8 @@ #include "sandbox.h" #include "xstd.h" -#define WATCHER_DEAD ( 1u << 2 ) -#define WATCHER_IDLE ( 1u << 3 ) +#define WATCHER_DEAD ( 1u << 8 ) +#define WATCHER_IDLE ( 1u << 9 ) // This value is chosen according to how frequent Chromium saves its bookmarks // (`bookmarks::BookmarkStorage::kSaveDelay`). @@ -311,7 +311,6 @@ worker_loop ( pthread_mutex_lock(&w->mutex); -#ifdef BOOKMARKFS_SANDBOX uint32_t sandbox_flags = w->flags >> WATCHER_SANDBOX_FLAGS_OFFSET; if (!(sandbox_flags & SANDBOX_NOOP)) { sandbox_flags |= SANDBOX_READONLY; @@ -320,13 +319,17 @@ worker_loop ( } debug_puts("worker thread enters sandbox"); } -#endif /* defined(BOOKMARKFS_SANDBOX) */ - debug_puts("worker ready"); - do { - w->flags |= WATCHER_IDLE; - pthread_cond_wait(&w->cond, &w->mutex); - } while (0 == impl_watch(w)); + switch (impl_rearm(w)) { + case 0: + debug_puts("worker ready"); + while (0 == impl_watch(w)) { + // fallthrough + case -ENOENT: + w->flags |= WATCHER_IDLE; + pthread_cond_wait(&w->cond, &w->mutex); + } + } end: w->flags |= (WATCHER_DEAD | WATCHER_IDLE); diff --git a/tests/check_watcher.c b/tests/check_watcher.c index 0fe0f1c..444f4c2 100644 --- a/tests/check_watcher.c +++ b/tests/check_watcher.c @@ -52,11 +52,6 @@ do_check_watcher ( #define ASSERT_EQ(val, expr) ASSERT_EXPR((val) == (expr), goto end;) #define ASSERT_NE(val, expr) ASSERT_EXPR((val) != (expr), goto end;) - struct watcher *w = watcher_create(dirfd, FILE1_NAME, flags); - if (w == NULL) { - return -1; - } - unsigned long msecs = 100; int tries = 5; if (flags & WATCHER_FALLBACK) { @@ -71,8 +66,11 @@ do_check_watcher ( fd = openat(dirfd, FILE1_NAME, O_WRONLY | O_CREAT, 0600); ASSERT_NE(-1, fd); - // Lazy-init watcher. - ASSERT_EQ(0, wait_for_watcher(w, &ts, tries)); + + struct watcher *w = watcher_create(dirfd, FILE1_NAME, flags); + ASSERT_NE(NULL, w); + // Check for spurious zero returns. + ASSERT_EQ(-ETIMEDOUT, wait_for_watcher(w, &ts, tries)); ASSERT_NE(-1, write(fd, "foo", 3)); ASSERT_EQ(0, wait_for_watcher(w, &ts, tries));