pr("Command not implemented\n");
return 0;
}
- if (update_pending) {
- pr("Update in progress...command failed\n");
- return 0;
- }
+ empth_rwlock_rdlock(update_lock);
if (redir) {
prredir(redir);
uprnf(buf);
logerror("%s: returned bad value", command->c_form);
break;
}
+ empth_rwlock_unlock(update_lock);
player->command = 0;
return 0;
}
#include "server.h"
empth_sem_t *update_sem;
+empth_rwlock_t *update_lock;
time_t update_time;
static void update_wait(void *unused);
time_t now, delta;
update_sem = empth_sem_create("Update", 0);
+ update_lock = empth_rwlock_create("Update");
empth_create(PP_SCHED, update_wait, (50 * 1024), 0, "UpdateWait",
"Waits until players idle", 0);
- time(&now);
if (s_p_etu <= 0) {
logerror("bad value for s_p_etu (%d)", s_p_etu);
s_p_etu = 2 * 60;
update_wait(void *unused)
{
struct player *p;
- int running;
- time_t now;
int stacksize;
struct player *dp;
while (1) {
empth_sem_wait(update_sem);
update_pending = 1;
- running = 0;
for (p = player_next(0); p != 0; p = player_next(p)) {
if (p->state != PS_PLAYING)
continue;
pr_flash(p, "Update aborting command\n");
p->aborted = 1;
empth_wakeup(p->proc);
- running++;
}
}
- time(&now);
- if (running) {
- /* sleep a few, wait for aborts to take effect */
- empth_sleep(now + 2);
- }
+ empth_rwlock_wrlock(update_lock);
if (*pre_update_hook) {
if (run_hook(pre_update_hook, "pre-update")) {
update_pending = 0;
+ empth_rwlock_unlock(update_lock);
continue;
}
}
if (!dp) {
logerror("can't create dummy player for update");
update_pending = 0;
+ empth_rwlock_unlock(update_lock);
continue;
}
stacksize = 100000 +
empth_create(PP_UPDATE, update_main, stacksize, 0,
"UpdateRun", "Updates the world", dp);
+
+ while (update_pending)
+ empth_yield(); /* FIXME cheesy! */
+ update_pending = 0;
+ empth_rwlock_unlock(update_lock);
}
/*NOTREACHED*/
}