extern int shutdown_pending;
extern int update_pending;
-extern empth_sem_t *update_sem;
extern empth_rwlock_t *update_lock;
extern time_t update_time;
extern int updating_mob;
void player_kill_idle(void *);
void update_main(void);
void update_init(void);
+int update_trigger(time_t);
void shutdown_sequence(void *);
-void update_force(void *);
#endif
#include <config.h>
#include "commands.h"
-#include "empthread.h"
#include "server.h"
int
force(void)
{
- static int seconds;
+ int seconds;
if (update_pending) {
pr("Update is pending\n");
return RET_FAIL;
pr("Scheduling update in %d second(s)\n", seconds);
- empth_create(PP_SCHED, update_force, (50 * 1024), 0, "forceUpdate",
- "Schedules an update", &seconds);
+ if (update_trigger(seconds) < 0)
+ return RET_FAIL;
return RET_OK;
}
* Dave Pare, 1994
* Steve McClure, 1996
* Ron Koenderink, 2005
+ * Markus Armbruster, 2007
*/
#include <config.h>
time_t update_time;
static void update_sched(void *);
+static void update_force(void *);
static void update_wait(void *unused);
static int run_hook(char *cmd, char *name);
/*NOTREACHED*/
}
-void
+/*
+ * Trigger an update SECS_FROM_NOW seconds from now.
+ * Return 0 on success, -1 on failure.
+ */
+int
+update_trigger(time_t secs_from_now)
+{
+ static time_t *secp;
+
+ if (secs_from_now < 0)
+ return -1;
+
+ if (secs_from_now == 0) {
+ empth_sem_signal(update_sem);
+ return 0;
+ }
+
+ /* FIXME make triggers overwrite, not accumulate */
+ secp = malloc(sizeof(time_t));
+ if (!secp)
+ return -1;
+ *secp = secs_from_now;
+ if (!empth_create(PP_SCHED, update_force, 50 * 1024, 0, "forceUpdate",
+ "Schedules an update", secp))
+ return -1;
+ return 0;
+}
+
+static void
update_force(void *seconds)
{
time_t now;
time(&now);
- empth_sleep(now + *(int *)seconds);
+ empth_sleep(now + *(time_t *)seconds);
empth_sem_signal(update_sem);
+ free(seconds);
empth_exit();
}