path: simplify recheck logic
This commit is contained in:
+33
-25
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user