aboutsummaryrefslogtreecommitdiff
path: root/src/wydawca.c
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2020-04-16 19:54:23 +0300
committerSergey Poznyakoff <gray@gnu.org>2020-04-16 20:03:29 +0300
commita6cc8f5fcbcbf4c707149940de2ee9a33220c34d (patch)
tree3b0da6ae669a58779c9f40503191e6808a60e1b9 /src/wydawca.c
parent2cc5b63b5f90d2dd9b05f50ac28e379d417f1a8c (diff)
downloadwydawca-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.c108
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);
}

Return to:

Send suggestions and report system problems to the System administrator.