path: simplify recheck logic

This commit is contained in:
Lennart Poettering
2011-04-28 03:22:05 +02:00
parent 796ba55494
commit ac3f50caa5
+33 -25
View 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);
}
}