X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=notmuch.c;h=5a0ca5c946c69e12adadca235969463e98983f91;hp=1f5898949cac9153158bd227dcc3f0023a3c99d3;hb=fbf55bfe2fdcdf3773ba37a9921875530e94c7b3;hpb=19ec20192c6c2514eed58993d47ca11558cb6519 diff --git a/notmuch.c b/notmuch.c index 1f589894..5a0ca5c9 100644 --- a/notmuch.c +++ b/notmuch.c @@ -38,6 +38,7 @@ #include #include #include +#include #include @@ -123,6 +124,14 @@ print_formatted_seconds (double seconds) printf ("%ds", (int) seconds); } +static volatile sig_atomic_t do_add_files_print_progress = 0; + +static void +handle_sigalrm (unused (int signal)) +{ + do_add_files_print_progress = 1; +} + static void add_files_print_progress (add_files_state_t *state) { @@ -298,8 +307,10 @@ add_files_recursive (notmuch_database_t *notmuch, message = NULL; } - if (state->processed_files % 1000 == 0) + if (do_add_files_print_progress) { + do_add_files_print_progress = 0; add_files_print_progress (state); + } } } else if (S_ISDIR (st->st_mode)) { status = add_files_recursive (notmuch, next, st, state); @@ -327,16 +338,17 @@ add_files_recursive (notmuch_database_t *notmuch, } /* This is the top-level entry point for add_files. It does a couple - * of error checks, and then calls into the recursive function, - * (avoiding the repeating of these error checks at every - * level---which would be useless becaues we already do a stat() at - * the level above). */ + * of error checks, sets up the progress-printing timer and then calls + * into the recursive function. */ static notmuch_status_t add_files (notmuch_database_t *notmuch, const char *path, add_files_state_t *state) { struct stat st; + notmuch_status_t status; + struct sigaction action; + struct itimerval timerval; if (stat (path, &st)) { fprintf (stderr, "Error reading directory %s: %s\n", @@ -349,7 +361,34 @@ add_files (notmuch_database_t *notmuch, return NOTMUCH_STATUS_FILE_ERROR; } - return add_files_recursive (notmuch, path, &st, state); + /* Setup our handler for SIGALRM */ + memset (&action, 0, sizeof (struct sigaction)); + action.sa_handler = handle_sigalrm; + sigemptyset (&action.sa_mask); + action.sa_flags = SA_RESTART; + sigaction (SIGALRM, &action, NULL); + + /* Then start a timer to send SIGALRM once per second. */ + timerval.it_interval.tv_sec = 1; + timerval.it_interval.tv_usec = 0; + timerval.it_value.tv_sec = 1; + timerval.it_value.tv_usec = 0; + setitimer (ITIMER_REAL, &timerval, NULL); + + status = add_files_recursive (notmuch, path, &st, state); + + /* Now stop the timer. */ + timerval.it_interval.tv_sec = 0; + timerval.it_interval.tv_usec = 0; + timerval.it_value.tv_sec = 0; + timerval.it_value.tv_usec = 0; + setitimer (ITIMER_REAL, &timerval, NULL); + + /* And disable the signal handler. */ + action.sa_handler = SIG_IGN; + sigaction (SIGALRM, &action, NULL); + + return status; } /* Recursively count all regular files in path and all sub-direcotries @@ -1073,7 +1112,9 @@ command_t commands[] = { "\t\tIn addition to individual terms, multiple terms can be\n" "\t\tcombined with Boolean operators (\"and\", \"or\", \"not\", etc.).\n" "\t\tEach term in the query will be implicitly connected by a\n" - "\t\tlogical AND if no explicit operator is provided.\n\n" + "\t\tlogical AND if no explicit operator is provided, (except\n" + "\t\tthat terms with a common prefix will be implicitly combined\n" + "\t\twith OR until we get Xapian defect #402 fixed).\n\n" "\t\tParentheses can also be used to control the combination of\n" "\t\tthe Boolean operators, but will have to be protected from\n" "\t\tinterpretation by the shell, (such as by putting quotation\n"