]> git.pond.sub.org Git - empserver/commitdiff
Abstract from update trigger mechanism:
authorMarkus Armbruster <armbru@pond.sub.org>
Fri, 19 Jan 2007 06:46:10 +0000 (06:46 +0000)
committerMarkus Armbruster <armbru@pond.sub.org>
Fri, 19 Jan 2007 06:46:10 +0000 (06:46 +0000)
(update_trigger): New.
(force, zdon): Use it.
(update_sem, update_force): Internal linkage.

(update_trigger, update_force): Passing a pointer to static storage as
thread argument is racy.  Use dynamic allocation.

include/server.h
src/lib/commands/forc.c
src/lib/commands/zdon.c
src/server/update.c

index 4ca0a41110a153267303c43c77f10f4e81d56009..36b7438a836f2b75635b4a0fcb393cd463b5278f 100644 (file)
@@ -38,7 +38,6 @@
 
 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;
@@ -52,7 +51,7 @@ void mobility_check(void *);
 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
index 9b916f92dd1b62251860608292d8a4dfbc3b6022..7a74bc5a0a961fc9c67b929b9416200b9e1ed255 100644 (file)
 #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");
@@ -59,7 +58,7 @@ force(void)
        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;
 }
index 05cbd724296381f20ef67fecfcd6cf8d598f4287..6ceca9df7aef7c5df2588c97535f7cae74c2f845 100644 (file)
@@ -52,7 +52,6 @@
 #include <config.h>
 
 #include "commands.h"
-#include "empthread.h"
 #include "optlist.h"
 #include "server.h"
 
@@ -142,7 +141,7 @@ zdon(void)
 
     if (!checking && wantupd && demandupdatecheck()) {
        pr("Here goes...\n");
-       empth_sem_signal(update_sem);
+       update_trigger(0);
     }
     return RET_OK;
 }
index 67e8404f5532441ce8ac47186ce8db75f8050571..6eaa0ba5e8fdb1ee1134c6f8d745e65058818533 100644 (file)
@@ -31,6 +31,7 @@
  *     Dave Pare, 1994
  *     Steve McClure, 1996
  *     Ron Koenderink, 2005
+ *     Markus Armbruster, 2007
  */
 
 #include <config.h>
@@ -53,6 +54,7 @@ int update_pending;
 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);
 
@@ -126,14 +128,43 @@ update_sched(void *unused)
     /*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();
 }