diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2020-04-16 19:54:23 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2020-04-16 20:03:29 +0300 |
commit | a6cc8f5fcbcbf4c707149940de2ee9a33220c34d (patch) | |
tree | 3b0da6ae669a58779c9f40503191e6808a60e1b9 /src/wydawca.c | |
parent | 2cc5b63b5f90d2dd9b05f50ac28e379d417f1a8c (diff) | |
download | wydawca-a6cc8f5fcbcbf4c707149940de2ee9a33220c34d.tar.gz wydawca-a6cc8f5fcbcbf4c707149940de2ee9a33220c34d.tar.bz2 |
Rewrite as a multi-threaded program.
* NEWS: Update.
* configure.ac: Version 3.1.95
* src/Makefile.am (wydawca_SOURCES): Remove job.c
(LDADD): Link with libpthread.
* src/job.c: Remove.
* src/config.c: Remove the wakeup-interval statement.
* src/net.c (wydawca_listener): Rewrite as a thread function
wy_thr_listen.
* src/timer.c (timer_get): Use thread-specific storage.
(timer_get_count): Remove.
* src/triplet.c: Rewrite using multi-thread model.
* src/wydawca.c: Likewise.
* src/wydawca.h: Update.
* tests/check-fail.at: Update expected output.
* tests/check-notify.at: Likewise.
* tests/inotify-ok.at: Likewise.
* tests/inotify-rmsymlink.at: Likewise.
* tests/inotify-symlink.at: Likewise.
* tests/inotify-unatt00.at: Likewise.
* tests/inotify-unatt01.at: Likewise.
* tests/upl12f.at: Likewise.
* tests/upload-dry.at: Likewise.
`
Diffstat (limited to 'src/wydawca.c')
-rw-r--r-- | src/wydawca.c | 108 |
1 files changed, 76 insertions, 32 deletions
diff --git a/src/wydawca.c b/src/wydawca.c index d948429..240eca1 100644 --- a/src/wydawca.c +++ b/src/wydawca.c @@ -54,18 +54,10 @@ char *wy_gpg_homedir; char *default_check_script; struct grecs_sockaddr listen_sockaddr; -unsigned wydawca_stat[WY_MAX_STAT]; - unsigned min_directive_version = MIN_DIRECTIVE_VERSION; unsigned max_directive_version = MAX_DIRECTIVE_VERSION; int inotify_enable = 1; - -void -initstats() -{ - memset(wydawca_stat, 0, sizeof wydawca_stat); -} /* Logging */ void @@ -185,9 +177,10 @@ int wy_stat_mask_p(unsigned long mask) { int i; - + WY_STAT_COUNTER *stat = wy_get_stat_array(); + for (i = 0; i < WY_MAX_STAT; i++) - if (wydawca_stat[i] != 0 && (mask && WY_STAT_MASK(i))) + if (stat[i] != 0 && (mask && WY_STAT_MASK(i))) return 1; return 0; } @@ -202,7 +195,7 @@ wy_stat_expansion(char **ret, char const *name, size_t len) && memcmp(stat_kwname[i], name, len) == 0) { size_t size = 0; *ret = NULL; - if (grecs_asprintf(ret, &size, "%u", wydawca_stat[i])) + if (grecs_asprintf(ret, &size, "%u", wy_get_stat_counter(i))) return WRDSE_NOSPACE; } } @@ -218,7 +211,7 @@ logstats() for (i = 0; i < WY_MAX_STAT; i++) if (print_stats & WY_STAT_MASK(i)) wy_log(LOG_INFO, "%s: %u", - gettext(stat_name[i]), wydawca_stat[i]); + gettext(stat_name[i]), wy_get_stat_counter(i)); } notify_finish(); @@ -270,9 +263,6 @@ grecs_print_diag(grecs_locus_t * locus, int err, int errcode, } } -char **x_argv; -extern int reconfigure; - void wydawca_daemon() { @@ -285,8 +275,6 @@ wydawca_daemon() } check_pidfile(); - wydawca_listener(); - remove_pidfile(); } #include "cmdline.h" @@ -304,6 +292,75 @@ version_hook(FILE * stream) putchar('\n'); } +int fatal_signals[] = { + SIGHUP, + SIGINT, + SIGQUIT, + SIGTERM, + 0 +}; + +static void +sigign(int sig) +{ +} + +void +wy_main(void) +{ + struct sigaction act; + sigset_t sigs; + int i; + pthread_t tid; + + act.sa_flags = 0; + sigemptyset(&act.sa_mask); + act.sa_handler = sigign; + + /* Block the 'fatal signals' and SIGPIPE in the handling thread */ + sigemptyset(&sigs); + for (i = 0; fatal_signals[i]; i++) { + sigaddset(&sigs, fatal_signals[i]); + sigaction(fatal_signals[i], &act, NULL); + } + + sigaddset(&sigs, SIGPIPE); + sigaddset(&sigs, SIGALRM); + sigaddset(&sigs, SIGCHLD); + pthread_sigmask(SIG_BLOCK, &sigs, NULL); + + scan_all_spools(); + + if (wy_mode == WY_MODE_DAEMON) { + wydawca_daemon(); + + // Start cleaner thread + pthread_create(&tid, NULL, wy_thr_cleaner, NULL); + + // Start listener thread + pthread_create(&tid, NULL, wy_thr_listen, NULL); + + /* Unblock only the fatal signals */ + sigemptyset(&sigs); + for (i = 0; fatal_signals[i]; i++) { + sigaddset(&sigs, fatal_signals[i]); + } + pthread_sigmask(SIG_UNBLOCK, &sigs, NULL); + + /* Wait for signal to arrive */ + sigwait(&sigs, &i); + wy_log(LOG_NOTICE, "shutting down on signal \"%s\"", strsignal(i)); + } else { + /* Unblock only the fatal signals */ + sigemptyset(&sigs); + for (i = 0; fatal_signals[i]; i++) { + sigaddset(&sigs, fatal_signals[i]); + } + pthread_sigmask(SIG_UNBLOCK, &sigs, NULL); + wy_triplet_wait(); + } +} + int main(int argc, char **argv) { @@ -314,7 +371,6 @@ main(int argc, char **argv) proginfo.print_version_hook = version_hook; config_init(); - x_argv = argv; parse_options(argc, argv); wydawca_uid = getuid(); @@ -400,28 +456,16 @@ main(int argc, char **argv) } wydawca_lock_init(); - job_init(); wy_log(LOG_NOTICE, _("wydawca (%s) started"), PACKAGE_STRING); - scan_all_spools(); - if (wy_mode == WY_MODE_DAEMON) - wydawca_daemon(); - else - job_queue_wait(); + wy_main(); dictionaries_close(); modules_close(); + remove_pidfile(); wy_log(LOG_NOTICE, _("wydawca (%s) finished"), PACKAGE_STRING); - if (reconfigure) { - int i; - for (i = getdtablesize(); i > 2; i--) - close(i); - remove_pidfile(); - execv(x_argv[0], x_argv); - } - exit(0); } |