(io_output_all,update_main,update_wait): Do not block on writing when
aborting commands for an update. Move update_pending to the start of the update sequence where the commands are aborted.
This commit is contained in:
parent
ef0dbf6790
commit
a7fa7dee30
3 changed files with 14 additions and 3 deletions
|
@ -62,6 +62,7 @@
|
||||||
#include "ioqueue.h"
|
#include "ioqueue.h"
|
||||||
#include "empio.h"
|
#include "empio.h"
|
||||||
#include "gen.h" /* getfdtablesize */
|
#include "gen.h" /* getfdtablesize */
|
||||||
|
#include "server.h"
|
||||||
|
|
||||||
#include "empthread.h"
|
#include "empthread.h"
|
||||||
|
|
||||||
|
@ -337,7 +338,11 @@ io_output_all(struct iop *iop)
|
||||||
{
|
{
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
while ((n = io_output(iop, IO_NOWAIT)) > 0) {
|
/*
|
||||||
|
* Mustn't block a player thread while update is pending, or else
|
||||||
|
* a malicous player could delay the update indefinitely
|
||||||
|
*/
|
||||||
|
while (((n = io_output(iop, IO_NOWAIT)) > 0) && !update_pending) {
|
||||||
empth_select(iop->fd, EMPTH_FD_WRITE);
|
empth_select(iop->fd, EMPTH_FD_WRITE);
|
||||||
}
|
}
|
||||||
return n;
|
return n;
|
||||||
|
|
|
@ -74,6 +74,9 @@ update_main(void *unused)
|
||||||
struct natstr *cnp;
|
struct natstr *cnp;
|
||||||
struct natstr *np;
|
struct natstr *np;
|
||||||
|
|
||||||
|
if (CANT_HAPPEN(!update_pending))
|
||||||
|
update_pending = 1;
|
||||||
|
|
||||||
/* First, make sure all mobility is updated correctly. */
|
/* First, make sure all mobility is updated correctly. */
|
||||||
if (opt_MOB_ACCESS) {
|
if (opt_MOB_ACCESS) {
|
||||||
mob_ship(etu);
|
mob_ship(etu);
|
||||||
|
@ -81,7 +84,6 @@ update_main(void *unused)
|
||||||
mob_plane(etu);
|
mob_plane(etu);
|
||||||
mob_land(etu);
|
mob_land(etu);
|
||||||
}
|
}
|
||||||
update_pending = 1;
|
|
||||||
player->proc = empth_self();
|
player->proc = empth_self();
|
||||||
player->cnum = 0;
|
player->cnum = 0;
|
||||||
player->god = 1;
|
player->god = 1;
|
||||||
|
|
|
@ -120,6 +120,7 @@ update_wait(void *unused)
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
empth_sem_wait(update_sem);
|
empth_sem_wait(update_sem);
|
||||||
|
update_pending = 1;
|
||||||
running = 0;
|
running = 0;
|
||||||
for (p = player_next(0); p != 0; p = player_next(p)) {
|
for (p = player_next(0); p != 0; p = player_next(p)) {
|
||||||
if (p->state != PS_PLAYING)
|
if (p->state != PS_PLAYING)
|
||||||
|
@ -137,9 +138,11 @@ update_wait(void *unused)
|
||||||
empth_sleep(now + 2);
|
empth_sleep(now + 2);
|
||||||
}
|
}
|
||||||
if (*pre_update_hook) {
|
if (*pre_update_hook) {
|
||||||
if (run_hook(pre_update_hook, "pre-update"))
|
if (run_hook(pre_update_hook, "pre-update")) {
|
||||||
|
update_pending = 0;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
* we rely on the fact that update's priority is the highest
|
* we rely on the fact that update's priority is the highest
|
||||||
* in the land so it can finish before it yields.
|
* in the land so it can finish before it yields.
|
||||||
|
@ -147,6 +150,7 @@ update_wait(void *unused)
|
||||||
dp = player_new(0, 0);
|
dp = player_new(0, 0);
|
||||||
if (!dp) {
|
if (!dp) {
|
||||||
logerror("can't create dummy player for update");
|
logerror("can't create dummy player for update");
|
||||||
|
update_pending = 0;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
stacksize = 100000 +
|
stacksize = 100000 +
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue