Index: pbx/pbx_spool.c =================================================================== --- pbx/pbx_spool.c (revision 352754) +++ pbx/pbx_spool.c (working copy) @@ -440,14 +440,17 @@ 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); @@ -458,34 +461,50 @@ } /* 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, st.st_atime); 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) { @@ -495,9 +514,11 @@ 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);