Fix shutdown_initiate() not to start multiple shutdown threads

This happened when you cancelled shutdown and initiated another one
before the old shutdown thread noticed the cancellation.
This commit is contained in:
Markus Armbruster 2008-07-20 10:20:40 -04:00
parent c7426e1b45
commit 7e80101fac

View file

@ -42,9 +42,16 @@
#include "server.h" #include "server.h"
int shutdown_pending; int shutdown_pending;
static empth_t *shutdown_thread;
static void shutdown_sequence(void *unused); static void shutdown_sequence(void *unused);
/*
* Initiate shutdown in MINS_FROM_NOW minutes.
* If MINS_FROM_NOW is negative, cancel any pending shutdown instead.
* Return -1 on error, zero when no shutdown was pending, positive
* number when a pending shutdown was modified.
*/
int int
shutdown_initiate(int mins_from_now) shutdown_initiate(int mins_from_now)
{ {
@ -60,15 +67,19 @@ shutdown_initiate(int mins_from_now)
shutdown_pending = mins_from_now + 1; shutdown_pending = mins_from_now + 1;
if (old_pending) { if (shutdown_thread) {
if (old_pending)
pr_wall("The shutdown time has been changed to %d minutes!\n", pr_wall("The shutdown time has been changed to %d minutes!\n",
mins_from_now); mins_from_now);
/* FIXME wake up shutdown_sequence() */ /* FIXME wake up shutdown_sequence() */
} else { } else {
if (!empth_create(shutdown_sequence, 50 * 1024, 0, shutdown_thread = empth_create(shutdown_sequence, 50 * 1024, 0,
"shutdownSeq", NULL)) "shutdownSeq", NULL);
if (!shutdown_thread) {
shutdown_pending = 0;
return -1; return -1;
} }
}
return old_pending; return old_pending;
} }
@ -104,4 +115,6 @@ shutdown_sequence(void *unused)
/* FIXME error due to late wakeup accumulates */ /* FIXME error due to late wakeup accumulates */
empth_sleep(now + 60); empth_sleep(now + 60);
} }
shutdown_thread = NULL;
} }