aboutsummaryrefslogtreecommitdiff
path: root/src/job.c
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2009-02-24 18:45:51 +0200
committerSergey Poznyakoff <gray@gnu.org.ua>2009-02-24 18:45:51 +0200
commitc9178a6fef0184baed0e8456bb6c6d4091b4997c (patch)
tree0c97d7aeb6235a469cd071d7d0b589f45a9d35f6 /src/job.c
parentb1472caae9a1b6905b6bbe42e69539b29febcf5c (diff)
downloadwydawca-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.c45
1 files changed, 28 insertions, 17 deletions
diff --git a/src/job.c b/src/job.c
index 545d270..2c177cb 100644
--- a/src/job.c
+++ b/src/job.c
@@ -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))

Return to:

Send suggestions and report system problems to the System administrator.