summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pbx/pbx_spool.c41
1 files changed, 31 insertions, 10 deletions
diff --git a/pbx/pbx_spool.c b/pbx/pbx_spool.c
index c34a1faa7..e176b95c4 100644
--- a/pbx/pbx_spool.c
+++ b/pbx/pbx_spool.c
@@ -761,14 +761,17 @@ static void *scan_thread(void *unused)
struct dirent *de;
char fn[256];
int res;
- time_t last = 0, next = 0, now;
+ int force_poll = 1;
+ time_t last = 0;
+ time_t next = 0;
+ time_t now;
struct timespec ts = { .tv_sec = 1 };
while (!ast_fully_booted) {
nanosleep(&ts, NULL);
}
- for(;;) {
+ for (;;) {
/* Wait a sec */
nanosleep(&ts, NULL);
time(&now);
@@ -779,34 +782,50 @@ static void *scan_thread(void *unused)
}
/* Make sure it is time for us to execute our check */
- if ((st.st_mtime == last) && (next && (next > now)))
+ if (!force_poll && st.st_mtime == last && (!next || now < next)) {
+ /*
+ * The directory timestamp did not change and any delayed
+ * call-file is not ready to be executed.
+ */
continue;
+ }
#if 0
printf("atime: %ld, mtime: %ld, ctime: %ld\n", st.st_atime, st.st_mtime, st.st_ctime);
printf("Ooh, something changed / timeout\n");
#endif
- next = 0;
- last = st.st_mtime;
if (!(dir = opendir(qdir))) {
ast_log(LOG_WARNING, "Unable to open directory %s: %s\n", qdir, strerror(errno));
continue;
}
+ /*
+ * Since the dir timestamp is available at one second
+ * resolution, we cannot know if it was updated within the same
+ * second after we scanned it. Therefore, we will force another
+ * scan if the dir was just modified.
+ */
+ force_poll = (st.st_mtime == now);
+
+ next = 0;
+ last = st.st_mtime;
while ((de = readdir(dir))) {
snprintf(fn, sizeof(fn), "%s/%s", qdir, de->d_name);
if (stat(fn, &st)) {
ast_log(LOG_WARNING, "Unable to stat %s: %s\n", fn, strerror(errno));
continue;
}
- if (!S_ISREG(st.st_mode))
+ if (!S_ISREG(st.st_mode)) {
+ /* Not a regular file. */
continue;
+ }
if (st.st_mtime <= now) {
res = scan_service(fn, now);
if (res > 0) {
- /* Update next service time */
- if (!next || (res < next)) {
+ /* The call-file is delayed or to be retried later. */
+ if (!next || res < next) {
+ /* This delayed call file expires earlier. */
next = res;
}
} else if (res) {
@@ -816,9 +835,11 @@ static void *scan_thread(void *unused)
next = st.st_mtime;
}
} else {
- /* Update "next" update if necessary */
- if (!next || (st.st_mtime < next))
+ /* The file's timestamp is in the future. */
+ if (!next || st.st_mtime < next) {
+ /* This call-file's timestamp expires earlier. */
next = st.st_mtime;
+ }
}
}
closedir(dir);