chiark / gitweb /
path: simplify recheck logic
authorLennart Poettering <lennart@poettering.net>
Thu, 28 Apr 2011 01:22:05 +0000 (03:22 +0200)
committerLennart Poettering <lennart@poettering.net>
Thu, 28 Apr 2011 01:22:05 +0000 (03:22 +0200)
src/path.c

index 1a3e28f89f33fc962f271a29c63bfb509e977546..c722a45377b0b38801c4171bb43be65d6d89ff82 100644 (file)
@@ -295,7 +295,7 @@ static void path_set_state(Path *p, PathState state) {
         unit_notify(UNIT(p), state_translation_table[old_state], state_translation_table[state], true);
 }
 
-static void path_enter_waiting(Path *p, bool initial, bool recheck, bool skip_watch);
+static void path_enter_waiting(Path *p, bool initial, bool recheck);
 
 static int path_coldplug(Unit *u) {
         Path *p = PATH(u);
@@ -307,7 +307,7 @@ static int path_coldplug(Unit *u) {
 
                 if (p->deserialized_state == PATH_WAITING ||
                     p->deserialized_state == PATH_RUNNING)
-                        path_enter_waiting(p, true, true, false);
+                        path_enter_waiting(p, true, true);
                 else
                         path_set_state(p, p->deserialized_state);
         }
@@ -353,14 +353,11 @@ fail:
         dbus_error_free(&error);
 }
 
-
-static void path_enter_waiting(Path *p, bool initial, bool recheck, bool skip_watch) {
+static bool path_check_good(Path *p, bool initial) {
         PathSpec *s;
-        int r;
         bool good = false;
 
-        if (!recheck)
-                goto waiting;
+        assert(p);
 
         LIST_FOREACH(spec, s, p->specs) {
 
@@ -395,23 +392,32 @@ static void path_enter_waiting(Path *p, bool initial, bool recheck, bool skip_wa
                         break;
         }
 
-        if (good) {
-                log_debug("%s got triggered.", p->meta.id);
-                path_enter_running(p);
-                return;
-        }
+        return good;
+}
 
-waiting:
-        if (!skip_watch) {
-                if ((r = path_watch(p)) < 0)
-                        goto fail;
+static void path_enter_waiting(Path *p, bool initial, bool recheck) {
+        int r;
 
-                /* Hmm, so now we have created inotify watches, but the file
-                 * might have appeared/been removed by now, so we must
-                 * recheck */
-                path_enter_waiting(p, false, true, true);
-                return;
-        }
+        if (recheck)
+                if (path_check_good(p, initial)) {
+                        log_debug("%s got triggered.", p->meta.id);
+                        path_enter_running(p);
+                        return;
+                }
+
+        if ((r = path_watch(p)) < 0)
+                goto fail;
+
+        /* Hmm, so now we have created inotify watches, but the file
+         * might have appeared/been removed by now, so we must
+         * recheck */
+
+        if (recheck)
+                if (path_check_good(p, false)) {
+                        log_debug("%s got triggered.", p->meta.id);
+                        path_enter_running(p);
+                        return;
+                }
 
         path_set_state(p, PATH_WAITING);
         return;
@@ -452,7 +458,7 @@ static int path_start(Unit *u) {
         path_mkdir(p);
 
         p->failure = false;
-        path_enter_waiting(p, true, true, false);
+        path_enter_waiting(p, true, true);
 
         return 0;
 }
@@ -549,6 +555,8 @@ static void path_fd_event(Unit *u, int fd, uint32_t events, Watch *w) {
                 goto fail;
         }
 
+        assert(l > 0);
+
         if (!(buf = malloc(l))) {
                 log_error("Failed to allocate buffer: %s", strerror(-ENOMEM));
                 goto fail;
@@ -583,7 +591,7 @@ static void path_fd_event(Unit *u, int fd, uint32_t events, Watch *w) {
         if (changed)
                 path_enter_running(p);
         else
-                path_enter_waiting(p, false, true, false);
+                path_enter_waiting(p, false, true);
 
         free(buf);
 
@@ -632,7 +640,7 @@ void path_unit_notify(Unit *u, UnitActiveState new_state) {
                         /* Hmm, so inotify was triggered since the
                          * last activation, so I guess we need to
                          * recheck what is going on. */
-                        path_enter_waiting(p, false, p->inotify_triggered, false);
+                        path_enter_waiting(p, false, p->inotify_triggered);
                 }
         }