diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2009-02-24 18:45:51 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2009-02-24 18:45:51 +0200 |
commit | c9178a6fef0184baed0e8456bb6c6d4091b4997c (patch) | |
tree | 0c97d7aeb6235a469cd071d7d0b589f45a9d35f6 /src/job.c | |
parent | b1472caae9a1b6905b6bbe42e69539b29febcf5c (diff) | |
download | wydawca-c9178a6fef0184baed0e8456bb6c6d4091b4997c.tar.gz wydawca-c9178a6fef0184baed0e8456bb6c6d4091b4997c.tar.bz2 |
Implement locking
* src/lock.c: New file.
* gnulib.modules (sysexits, xgethostname): New modules.
* src/lock.c: New file.
* src/Makefile.am: Add lock.c
* src/config.c: Locking keywords.
* src/job.c: Requeue jobs if locking fails.
* src/wydawca.c (wydawca_uid): Rename to wydawca_set_uid
(main): Implement restart.
* src/process.c (scan_spool, scan_all_spools): Use locking, if configured.
* src/directive.c, src/diskio.c, src/triplet.c: Rename
wydawca_uid
* src/exec.c, src/getopt.m4, src/net.c,
src/pidfile.c: Use standard error codes from sysexits.h
* tests/etc/wydawca.rcin: Disable locking.
Diffstat (limited to 'src/job.c')
-rw-r--r-- | src/job.c | 45 |
1 files changed, 28 insertions, 17 deletions
@@ -38,6 +38,15 @@ size_t jobcnt; static struct spool fake_spool = { "all spools" }; +static int wakeup; + +RETSIGTYPE +queue_signal (int sig) +{ + wakeup = 1; + signal (sig, queue_signal); +} + struct job * job_locate (const struct spool *spool, uid_t uid) { @@ -59,21 +68,23 @@ job_active_count () return count; } -void +int wydawca_scanner (struct job *job) { + int rc; initstats(); timer_start ("wydawca"); if (job->spool == &fake_spool) - scan_all_spools (1, &job->uid); + rc = scan_all_spools (1, &job->uid); else { spool_create_timers (); - scan_spool (job->spool, 1, &job->uid); + rc = scan_spool (job->spool, 1, &job->uid); } timer_stop ("wydawca"); mail_finish (); logstats (); + return rc; } int @@ -92,15 +103,17 @@ job_start (struct job *job) if (single_process) { - wydawca_scanner (job); - return 0; + if (wydawca_scanner (job)) + job->state = STATE_QUEUED; + else + job->state = STATE_FINISHED; + wakeup = 1; } pid = fork (); if (pid == 0) { - wydawca_scanner (job); - exit (0); + exit (wydawca_scanner (job) ? WYDAWCA_EX_AGAIN : 0); } else if (pid == -1) { @@ -235,15 +248,6 @@ print_status (struct job *job, int expect_term) job->pid, job->spool->tag, pw->pw_name); } -static int wakeup; - -RETSIGTYPE -queue_signal (int sig) -{ - wakeup = 1; - signal (sig, queue_signal); -} - void job_queue_runner () { @@ -278,7 +282,14 @@ job_queue_runner () { print_status (job, 0); if ((job->state &= ~STATE_FINISHED) == 0) - job_remove (job); + { + if (WIFEXITED (job->exit_status) + && WEXITSTATUS (job->exit_status) == WYDAWCA_EX_AGAIN) + /* Re-queue the job */ + job->state = STATE_QUEUED; + else + job_remove (job); + } } if (job->state == STATE_QUEUED) if (job_start (job)) |